summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-10 00:59:09 +0000
committertpearson <tpearson@283d02a7-25f6-0310-bc7c-ecb5cbfe19da>2010-02-10 00:59:09 +0000
commit7f66b9e8ba186fb14a2db598a87dfa8de7b5a47b (patch)
treeb5e07812e82f00c780d2c035dca102b8e364f447
downloadkaffeine-7f66b9e8.tar.gz
kaffeine-7f66b9e8.zip
Added old abandoned KDE3 version of Kaffeine
git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/applications/kaffeine@1088031 283d02a7-25f6-0310-bc7c-ecb5cbfe19da
-rw-r--r--AUTHORS9
-rw-r--r--COPYING339
-rw-r--r--ChangeLog663
-rw-r--r--INSTALL167
-rw-r--r--Makefile.am5
-rw-r--r--Makefile.am.in4
-rw-r--r--README86
-rw-r--r--TODO26
-rw-r--r--VERSION1
-rw-r--r--acinclude.m412618
-rw-r--r--aclocal.m4892
-rw-r--r--config.h.in261
-rw-r--r--configure.files4
-rw-r--r--configure.in509
-rw-r--r--configure.in.in18
-rw-r--r--doc/Makefile.am5
-rw-r--r--doc/kaffeine/Makefile.am5
-rw-r--r--doc/kaffeine/discwindow.pngbin0 -> 193848 bytes
-rw-r--r--doc/kaffeine/dvbbroadcast.pngbin0 -> 17421 bytes
-rw-r--r--doc/kaffeine/dvbclient.pngbin0 -> 399897 bytes
-rw-r--r--doc/kaffeine/dvbconfig.pngbin0 -> 38308 bytes
-rw-r--r--doc/kaffeine/dvbepg.pngbin0 -> 25149 bytes
-rw-r--r--doc/kaffeine/dvblive.jpgbin0 -> 77062 bytes
-rw-r--r--doc/kaffeine/dvbscan.pngbin0 -> 44518 bytes
-rw-r--r--doc/kaffeine/dvbtimers.pngbin0 -> 33004 bytes
-rw-r--r--doc/kaffeine/dvbwin.pngbin0 -> 266099 bytes
-rw-r--r--doc/kaffeine/gstpart.pngbin0 -> 43274 bytes
-rw-r--r--doc/kaffeine/index.docbook796
-rw-r--r--doc/kaffeine/kaffeinepart.pngbin0 -> 106676 bytes
-rw-r--r--doc/kaffeine/playlistwin.pngbin0 -> 85132 bytes
-rw-r--r--doc/kaffeine/startwindow.pngbin0 -> 38149 bytes
-rw-r--r--kaffeine/BUGS19
-rw-r--r--kaffeine/COPYING-DOCS397
-rw-r--r--kaffeine/CREDITS66
-rw-r--r--kaffeine/Makefile.am1
-rw-r--r--kaffeine/README.atsc7
-rw-r--r--kaffeine/README.dvb69
-rw-r--r--kaffeine/README.gstreamer17
-rw-r--r--kaffeine/configure.in.bot54
-rw-r--r--kaffeine/configure.in.in283
-rw-r--r--kaffeine/fast-slow-dcop.patch54
-rw-r--r--kaffeine/generic_tr.patch13
-rw-r--r--kaffeine/images/COPYING10
-rw-r--r--kaffeine/images/Makefile.am83
-rw-r--r--kaffeine/images/dvbdata.tar.gzbin0 -> 62343 bytes
-rw-r--r--kaffeine/images/kaffeine-pause.pngbin0 -> 2162 bytes
-rw-r--r--kaffeine/images/kaffeine-play.pngbin0 -> 2094 bytes
-rw-r--r--kaffeine/images/kaffeine-record.pngbin0 -> 2044 bytes
-rw-r--r--kaffeine/images/kaffeine128x128.pngbin0 -> 15402 bytes
-rw-r--r--kaffeine/images/kaffeine16x16.pngbin0 -> 755 bytes
-rw-r--r--kaffeine/images/kaffeine22x22.pngbin0 -> 1158 bytes
-rw-r--r--kaffeine/images/kaffeine32x32.pngbin0 -> 1958 bytes
-rw-r--r--kaffeine/images/kaffeine48x48.pngbin0 -> 3522 bytes
-rw-r--r--kaffeine/images/kaffeine64x64.pngbin0 -> 5407 bytes
-rw-r--r--kaffeine/images/kdvbra.pngbin0 -> 957 bytes
-rw-r--r--kaffeine/images/kdvbrac.pngbin0 -> 998 bytes
-rw-r--r--kaffeine/images/kdvbtv.pngbin0 -> 744 bytes
-rw-r--r--kaffeine/images/kdvbtvc.pngbin0 -> 853 bytes
-rw-r--r--kaffeine/images/kilogram16x16.pngbin0 -> 953 bytes
-rw-r--r--kaffeine/images/kilogram22x22.pngbin0 -> 1487 bytes
-rw-r--r--kaffeine/images/kilogram32x32.pngbin0 -> 2258 bytes
-rw-r--r--kaffeine/images/logobin0 -> 21313 bytes
-rw-r--r--kaffeine/images/logo.avibin0 -> 170582 bytes
-rw-r--r--kaffeine/images/logo.mpgbin0 -> 30586 bytes
-rw-r--r--kaffeine/images/mime_kaffeine16x16.pngbin0 -> 656 bytes
-rw-r--r--kaffeine/images/mime_kaffeine32x32.pngbin0 -> 1426 bytes
-rw-r--r--kaffeine/images/mime_kaffeine48x48.pngbin0 -> 2414 bytes
-rw-r--r--kaffeine/images/nocover.pngbin0 -> 6407 bytes
-rw-r--r--kaffeine/images/player_mute16x16.pngbin0 -> 879 bytes
-rw-r--r--kaffeine/images/player_mute22x22.pngbin0 -> 1377 bytes
-rw-r--r--kaffeine/images/player_mute32x32.pngbin0 -> 2323 bytes
-rw-r--r--kaffeine/images/player_record16x16.pngbin0 -> 707 bytes
-rw-r--r--kaffeine/images/player_record22x22.pngbin0 -> 1066 bytes
-rw-r--r--kaffeine/images/player_record32x32.pngbin0 -> 1618 bytes
-rw-r--r--kaffeine/images/playing.pngbin0 -> 254 bytes
-rw-r--r--kaffeine/mimetypes/Makefile.am2
-rw-r--r--kaffeine/mimetypes/application/Makefile.am6
-rw-r--r--kaffeine/mimetypes/application/x-kaffeine.desktop51
-rw-r--r--kaffeine/mimetypes/application/x-mplayer2.desktop25
-rw-r--r--kaffeine/protocols/Makefile.am14
-rw-r--r--kaffeine/protocols/mms.protocol12
-rw-r--r--kaffeine/protocols/rtsp.protocol12
-rw-r--r--kaffeine/scandialog.patch53
-rw-r--r--kaffeine/servicemenus/Makefile.am19
-rw-r--r--kaffeine/servicemenus/kaffeine_append_file.desktop51
-rw-r--r--kaffeine/servicemenus/kaffeine_open_directory.desktop51
-rw-r--r--kaffeine/servicemenus/kaffeine_play_audiocd.desktop52
-rw-r--r--kaffeine/servicemenus/kaffeine_play_dvd.desktop52
-rw-r--r--kaffeine/servicemenus/kaffeine_play_vcd.desktop52
-rw-r--r--kaffeine/src/Makefile.am53
-rw-r--r--kaffeine/src/drivescombo.cpp60
-rw-r--r--kaffeine/src/drivescombo.h43
-rw-r--r--kaffeine/src/input/Makefile.am21
-rw-r--r--kaffeine/src/input/audiobrowser/Makefile.am28
-rw-r--r--kaffeine/src/input/audiobrowser/googlefetcher.cpp282
-rw-r--r--kaffeine/src/input/audiobrowser/googlefetcher.h91
-rw-r--r--kaffeine/src/input/audiobrowser/googlefetcherdialog.cpp254
-rw-r--r--kaffeine/src/input/audiobrowser/googlefetcherdialog.h98
-rw-r--r--kaffeine/src/input/audiobrowser/kaffeineplaylist.rc17
-rw-r--r--kaffeine/src/input/audiobrowser/playlist.cpp2365
-rw-r--r--kaffeine/src/input/audiobrowser/playlist.h336
-rw-r--r--kaffeine/src/input/audiobrowser/playlistitem.cpp268
-rw-r--r--kaffeine/src/input/audiobrowser/playlistitem.h93
-rw-r--r--kaffeine/src/input/audiobrowser/urllistview.cpp347
-rw-r--r--kaffeine/src/input/audiobrowser/urllistview.h92
-rw-r--r--kaffeine/src/input/disc/Makefile.am36
-rw-r--r--kaffeine/src/input/disc/cddb.cpp572
-rw-r--r--kaffeine/src/input/disc/cddb.h77
-rw-r--r--kaffeine/src/input/disc/disc.cpp767
-rw-r--r--kaffeine/src/input/disc/disc.h140
-rw-r--r--kaffeine/src/input/disc/kaffeinedisc.rc24
-rw-r--r--kaffeine/src/input/disc/paranoia.cpp553
-rw-r--r--kaffeine/src/input/disc/paranoia.h108
-rw-r--r--kaffeine/src/input/disc/paranoiasettings.ui252
-rw-r--r--kaffeine/src/input/disc/plugins/Makefile.am24
-rw-r--r--kaffeine/src/input/disc/plugins/kaffeineaudioencoder.cpp30
-rw-r--r--kaffeine/src/input/disc/plugins/kaffeineaudioencoder.desktop4
-rw-r--r--kaffeine/src/input/disc/plugins/kaffeineaudioencoder.h53
-rw-r--r--kaffeine/src/input/disc/plugins/mp3lame/Makefile.am17
-rw-r--r--kaffeine/src/input/disc/plugins/mp3lame/kaffeinemp3lame.desktop12
-rw-r--r--kaffeine/src/input/disc/plugins/mp3lame/klameenc.cpp176
-rw-r--r--kaffeine/src/input/disc/plugins/mp3lame/klameenc.h76
-rw-r--r--kaffeine/src/input/disc/plugins/mp3lame/lameconfig.ui195
-rw-r--r--kaffeine/src/input/disc/plugins/oggvorbis/Makefile.am17
-rw-r--r--kaffeine/src/input/disc/plugins/oggvorbis/kaffeineoggvorbis.desktop9
-rw-r--r--kaffeine/src/input/disc/plugins/oggvorbis/koggenc.cpp236
-rw-r--r--kaffeine/src/input/disc/plugins/oggvorbis/koggenc.h92
-rw-r--r--kaffeine/src/input/disc/plugins/oggvorbis/oggconfig.ui191
-rw-r--r--kaffeine/src/input/dvb/Makefile.am81
-rw-r--r--kaffeine/src/input/dvb/audioeditor.cpp160
-rw-r--r--kaffeine/src/input/dvb/audioeditor.h53
-rw-r--r--kaffeine/src/input/dvb/audioeditorui.ui319
-rw-r--r--kaffeine/src/input/dvb/broadcasteditor.cpp132
-rw-r--r--kaffeine/src/input/dvb/broadcasteditor.h58
-rw-r--r--kaffeine/src/input/dvb/broadcasteditorui.ui315
-rw-r--r--kaffeine/src/input/dvb/channeldesc.cpp184
-rw-r--r--kaffeine/src/input/dvb/channeldesc.h137
-rw-r--r--kaffeine/src/input/dvb/channeleditor.cpp330
-rw-r--r--kaffeine/src/input/dvb/channeleditor.h70
-rw-r--r--kaffeine/src/input/dvb/channeleditorui.ui704
-rw-r--r--kaffeine/src/input/dvb/cleaner.cpp82
-rw-r--r--kaffeine/src/input/dvb/cleaner.h54
-rw-r--r--kaffeine/src/input/dvb/crontimer.cpp109
-rw-r--r--kaffeine/src/input/dvb/crontimer.h58
-rw-r--r--kaffeine/src/input/dvb/crontimerui.ui354
-rw-r--r--kaffeine/src/input/dvb/dvbcam.cpp926
-rw-r--r--kaffeine/src/input/dvb/dvbcam.h52
-rw-r--r--kaffeine/src/input/dvb/dvbconfig.cpp1478
-rw-r--r--kaffeine/src/input/dvb/dvbconfig.h301
-rw-r--r--kaffeine/src/input/dvb/dvbevents.cpp424
-rw-r--r--kaffeine/src/input/dvb/dvbevents.h59
-rw-r--r--kaffeine/src/input/dvb/dvbout.cpp568
-rw-r--r--kaffeine/src/input/dvb/dvbout.h118
-rw-r--r--kaffeine/src/input/dvb/dvbpanel.cpp2673
-rw-r--r--kaffeine/src/input/dvb/dvbpanel.h242
-rw-r--r--kaffeine/src/input/dvb/dvbsection.h26
-rw-r--r--kaffeine/src/input/dvb/dvbsi.cpp866
-rw-r--r--kaffeine/src/input/dvb/dvbsi.h98
-rw-r--r--kaffeine/src/input/dvb/dvbstream.cpp1390
-rw-r--r--kaffeine/src/input/dvb/dvbstream.h163
-rw-r--r--kaffeine/src/input/dvb/gdvb.h30
-rw-r--r--kaffeine/src/input/dvb/kaffeinedvb.rc24
-rw-r--r--kaffeine/src/input/dvb/kevents.cpp478
-rw-r--r--kaffeine/src/input/dvb/kevents.h98
-rw-r--r--kaffeine/src/input/dvb/kgradprogress.cpp136
-rw-r--r--kaffeine/src/input/dvb/kgradprogress.h59
-rw-r--r--kaffeine/src/input/dvb/krecord.cpp295
-rw-r--r--kaffeine/src/input/dvb/krecord.h69
-rw-r--r--kaffeine/src/input/dvb/ktimereditor.cpp231
-rw-r--r--kaffeine/src/input/dvb/ktimereditor.h67
-rw-r--r--kaffeine/src/input/dvb/lib/Makefile.am1
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/Makefile.am11
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/diseqc.c141
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/diseqc.h171
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/dvbca.c159
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/dvbca.h135
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/dvbdemux.c243
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/dvbdemux.h202
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/dvbfe.c760
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/dvbfe.h308
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/dvbnet.c99
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbapi/dvbnet.h87
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/Makefile.am21
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/asn_1.c81
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/asn_1.h41
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ai.c185
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ai.h129
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_auth.c179
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_auth.h119
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ca.c615
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ca.h254
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_datetime.c169
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_datetime.h116
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_dvb.c263
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_dvb.h164
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_epg.c166
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_epg.h136
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_lowspeed.c514
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_lowspeed.h210
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_mmi.c1316
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_mmi.h571
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_rm.c294
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_rm.h178
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_smartcard.c293
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_smartcard.h191
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_tags.h104
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_teletext.c139
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_teletext.h104
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_utils.c37
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_utils.h105
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_errno.h52
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_session.c954
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_session.h212
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_transport.c1240
-rw-r--r--kaffeine/src/input/dvb/lib/libdvben50221/en50221_transport.h231
-rw-r--r--kaffeine/src/input/dvb/lib/libdvbmisc/dvbmisc.h72
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/Makefile.am17
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/atsc/descriptor.h70
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/atsc/section.h69
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/crc32.c89
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/crc32.h58
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/descriptor.h129
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/Makefile.am19
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/ac3_descriptor.h88
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/adaptation_field_data_descriptor.h62
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_descriptor.h204
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_icons_descriptor.h157
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_name_descriptor.h145
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h125
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/ancillary_data_descriptor.h67
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/announcement_support_descriptor.h219
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/application_signalling_descriptor.h124
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/bat_section.c77
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/bat_section.h211
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/bouquet_name_descriptor.h82
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/ca_identifier_descriptor.h94
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/cable_delivery_descriptor.h70
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/cell_frequency_link_descriptor.h190
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/cell_list_descriptor.h201
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/component_descriptor.h147
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/content_descriptor.h116
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/content_identifier_descriptor.h222
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/country_availability_descriptor.h120
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/data_broadcast_descriptor.h139
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/data_broadcast_id_descriptor.h90
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/default_authority_descriptor.h82
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/descriptor.h198
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/dit_section.c32
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/dit_section.h54
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/dsng_descriptor.h80
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/eit_section.c63
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/eit_section.h160
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/extended_event_descriptor.h232
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/frequency_list_descriptor.h107
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/int_section.c80
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/int_section.h245
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/linkage_descriptor.h478
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/local_time_offset_descriptor.h127
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h110
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/mosaic_descriptor.h324
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h145
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_component_descriptor.h149
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_network_name_descriptor.h145
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_service_name_descriptor.h197
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/network_name_descriptor.h82
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/nit_section.c79
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/nit_section.h207
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/nvod_reference_descriptor.h125
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/parental_rating_descriptor.h135
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/partial_transport_stream_descriptor.h68
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/pdc_descriptor.h64
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/private_data_specifier_descriptor.h63
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/related_content_descriptor.h56
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h110
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h87
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h125
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/rst_section.c47
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/rst_section.h111
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h116
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/satellite_delivery_descriptor.h73
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/scrambling_descriptor.h61
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/sdt_section.c60
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/sdt_section.h157
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/section.h107
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/service_availability_descriptor.h98
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/service_descriptor.h156
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/service_identifier_descriptor.h82
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/service_list_descriptor.h122
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/service_move_descriptor.h67
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/short_event_descriptor.h135
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h87
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/sit_section.c70
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/sit_section.h173
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/st_section.c29
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/st_section.h77
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/stream_identifier_descriptor.h61
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/stuffing_descriptor.h82
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/subtitling_descriptor.h126
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/tdt_section.c33
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/tdt_section.h54
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/telephone_descriptor.h150
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/teletext_descriptor.h127
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/terrestrial_delivery_descriptor.h77
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/time_shifted_event_descriptor.h65
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/time_shifted_service_descriptor.h63
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/tot_section.c50
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/tot_section.h97
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/transport_stream_descriptor.h82
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/tva_container_section.c33
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/tva_container_section.h90
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/tva_id_descriptor.h124
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/types.c270
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/types.h127
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/vbi_data_descriptor.h186
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/dvb/vbi_teletext_descriptor.h116
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/endianops.h128
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/Makefile.am12
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/audio_stream_descriptor.h65
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/ca_descriptor.h91
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/cat_section.c34
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/cat_section.h94
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/content_labelling_descriptor.h356
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/copyright_descriptor.h89
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/data_stream_alignment_descriptor.h73
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/descriptor.h102
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/external_es_id_descriptor.h63
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/fmc_descriptor.h122
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h83
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/hierarchy_descriptor.h83
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/ibp_descriptor.h65
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/iod_descriptor.h87
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/iso_639_language_descriptor.h124
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/maximum_bitrate_descriptor.h64
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_descriptor.h472
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_pointer_descriptor.h360
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_section.c28
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_section.h122
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_std_descriptor.h72
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/mpeg4_audio_descriptor.h61
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/mpeg4_video_descriptor.h61
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/multiplex_buffer_descriptor.h65
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h67
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/muxcode_descriptor.h82
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/odsmt_section.c80
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/odsmt_section.h224
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/pat_section.c46
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/pat_section.h118
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/pmt_section.c71
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/pmt_section.h188
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/private_data_indicator_descriptor.h63
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/registration_descriptor.h91
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/section.h58
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/sl_descriptor.h63
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/smoothing_buffer_descriptor.h66
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/std_descriptor.h62
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/system_clock_descriptor.h65
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/target_background_grid_descriptor.h66
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/tsdt_section.c35
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/tsdt_section.h94
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/types.h127
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/video_stream_descriptor.h101
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/mpeg/video_window_descriptor.h64
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/section.h253
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/section_buf.c173
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/section_buf.h125
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/testrecord.txt101
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/transport_packet.c256
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/transport_packet.h195
-rw-r--r--kaffeine/src/input/dvb/lib/libucsi/types.h36
-rw-r--r--kaffeine/src/input/dvb/plugins/Makefile.am1
-rw-r--r--kaffeine/src/input/dvb/plugins/epg/Makefile.am16
-rw-r--r--kaffeine/src/input/dvb/plugins/epg/kaffeinedvbevents.cpp496
-rw-r--r--kaffeine/src/input/dvb/plugins/epg/kaffeinedvbevents.h177
-rw-r--r--kaffeine/src/input/dvb/plugins/epg/kaffeinedvbsection.cpp327
-rw-r--r--kaffeine/src/input/dvb/plugins/epg/kaffeinedvbsection.h64
-rw-r--r--kaffeine/src/input/dvb/plugins/epg/kaffeineepgplugin.desktop4
-rw-r--r--kaffeine/src/input/dvb/plugins/stream/Makefile.am16
-rw-r--r--kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.cpp30
-rw-r--r--kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.desktop4
-rw-r--r--kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.h52
-rw-r--r--kaffeine/src/input/dvb/scandialog.cpp1019
-rw-r--r--kaffeine/src/input/dvb/scandialog.h106
-rw-r--r--kaffeine/src/input/dvb/scandialogui.ui514
-rw-r--r--kaffeine/src/input/dvb/sender.cpp114
-rw-r--r--kaffeine/src/input/dvb/sender.h59
-rw-r--r--kaffeine/src/input/dvb/subeditor.cpp182
-rw-r--r--kaffeine/src/input/dvb/subeditor.h55
-rw-r--r--kaffeine/src/input/dvb/subeditorui.ui354
-rw-r--r--kaffeine/src/input/dvb/ts2rtp.cpp478
-rw-r--r--kaffeine/src/input/dvb/ts2rtp.h99
-rw-r--r--kaffeine/src/input/dvbclient/Makefile.am23
-rw-r--r--kaffeine/src/input/dvbclient/cdchannel.cpp54
-rw-r--r--kaffeine/src/input/dvbclient/cdchannel.h45
-rw-r--r--kaffeine/src/input/dvbclient/cdcleaner.cpp69
-rw-r--r--kaffeine/src/input/dvbclient/cdcleaner.h56
-rw-r--r--kaffeine/src/input/dvbclient/cddump.cpp362
-rw-r--r--kaffeine/src/input/dvbclient/cddump.h106
-rw-r--r--kaffeine/src/input/dvbclient/cdlisten.cpp113
-rw-r--r--kaffeine/src/input/dvbclient/cdlisten.h62
-rw-r--r--kaffeine/src/input/dvbclient/cdwidget.cpp371
-rw-r--r--kaffeine/src/input/dvbclient/cdwidget.h107
-rw-r--r--kaffeine/src/input/kaffeineinput.cpp31
-rw-r--r--kaffeine/src/input/kaffeineinput.h115
-rw-r--r--kaffeine/src/inputmanager.cpp603
-rw-r--r--kaffeine/src/inputmanager.h131
-rw-r--r--kaffeine/src/instwizard.cpp278
-rw-r--r--kaffeine/src/instwizard.h56
-rw-r--r--kaffeine/src/kaffeine.cpp1913
-rw-r--r--kaffeine/src/kaffeine.desktop59
-rw-r--r--kaffeine/src/kaffeine.h280
-rw-r--r--kaffeine/src/kaffeine.profile.xml136
-rw-r--r--kaffeine/src/kaffeineiface.h141
-rw-r--r--kaffeine/src/kaffeineui.rc69
-rw-r--r--kaffeine/src/kmultitabbar.cpp999
-rw-r--r--kaffeine/src/kmultitabbar.h248
-rw-r--r--kaffeine/src/kmultitabbar_p.h68
-rw-r--r--kaffeine/src/main.cpp121
-rw-r--r--kaffeine/src/player-parts/Makefile.am5
-rw-r--r--kaffeine/src/player-parts/README17
-rw-r--r--kaffeine/src/player-parts/dummy-part/Makefile.am20
-rw-r--r--kaffeine/src/player-parts/dummy-part/README6
-rw-r--r--kaffeine/src/player-parts/dummy-part/dummy_part.cpp120
-rw-r--r--kaffeine/src/player-parts/dummy-part/dummy_part.desktop23
-rw-r--r--kaffeine/src/player-parts/dummy-part/dummy_part.h72
-rw-r--r--kaffeine/src/player-parts/dummy-part/dummy_part.rc10
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/Makefile.am22
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/gstreamer.pngbin0 -> 231 bytes
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/gstreamer_part.cpp1082
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/gstreamer_part.desktop45
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/gstreamer_part.h154
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/gstreamer_part.rc105
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/gstreamerconfig.cpp117
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/gstreamerconfig.h56
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/timer.cpp197
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/timer.h77
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/video.cpp332
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/video.h95
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/videosettings.cpp95
-rw-r--r--kaffeine/src/player-parts/gstreamer-part/videosettings.h58
-rw-r--r--kaffeine/src/player-parts/kaffeine-part/Makefile.am12
-rw-r--r--kaffeine/src/player-parts/kaffeine-part/kaffeinepart.cpp58
-rw-r--r--kaffeine/src/player-parts/kaffeine-part/kaffeinepart.h222
-rw-r--r--kaffeine/src/player-parts/kaffeine-part/mrl.cpp47
-rw-r--r--kaffeine/src/player-parts/kaffeine-part/mrl.h96
-rw-r--r--kaffeine/src/player-parts/kaffeine-part/playlistimport.cpp685
-rw-r--r--kaffeine/src/player-parts/kaffeine-part/playlistimport.h50
-rw-r--r--kaffeine/src/player-parts/xine-part/Makefile.am26
-rw-r--r--kaffeine/src/player-parts/xine-part/README81
-rw-r--r--kaffeine/src/player-parts/xine-part/deinterlacequality.cpp137
-rw-r--r--kaffeine/src/player-parts/xine-part/deinterlacequality.h78
-rw-r--r--kaffeine/src/player-parts/xine-part/equalizer.cpp245
-rw-r--r--kaffeine/src/player-parts/xine-part/equalizer.h79
-rw-r--r--kaffeine/src/player-parts/xine-part/filterdialog.cpp135
-rw-r--r--kaffeine/src/player-parts/xine-part/filterdialog.h68
-rw-r--r--kaffeine/src/player-parts/xine-part/kxinewidget.cpp4117
-rw-r--r--kaffeine/src/player-parts/xine-part/kxinewidget.h518
-rw-r--r--kaffeine/src/player-parts/xine-part/positionslider.cpp113
-rw-r--r--kaffeine/src/player-parts/xine-part/positionslider.h55
-rw-r--r--kaffeine/src/player-parts/xine-part/postfilter.cpp398
-rw-r--r--kaffeine/src/player-parts/xine-part/postfilter.h229
-rw-r--r--kaffeine/src/player-parts/xine-part/screenshotpreview.cpp70
-rw-r--r--kaffeine/src/player-parts/xine-part/screenshotpreview.h52
-rw-r--r--kaffeine/src/player-parts/xine-part/videosettings.cpp129
-rw-r--r--kaffeine/src/player-parts/xine-part/videosettings.h65
-rw-r--r--kaffeine/src/player-parts/xine-part/xine_part.cpp2111
-rw-r--r--kaffeine/src/player-parts/xine-part/xine_part.desktop43
-rw-r--r--kaffeine/src/player-parts/xine-part/xine_part.h276
-rw-r--r--kaffeine/src/player-parts/xine-part/xine_part.rc347
-rw-r--r--kaffeine/src/player-parts/xine-part/xine_part_iface.h135
-rw-r--r--kaffeine/src/player-parts/xine-part/xineconfig.cpp404
-rw-r--r--kaffeine/src/player-parts/xine-part/xineconfig.h96
-rw-r--r--kaffeine/src/pref.cpp219
-rw-r--r--kaffeine/src/pref.h78
-rw-r--r--kaffeine/src/startwindow.cpp219
-rw-r--r--kaffeine/src/startwindow.h93
-rw-r--r--kaffeine/src/systemtray.cpp133
-rw-r--r--kaffeine/src/systemtray.h67
-rw-r--r--kaffeine/src/version.h1
-rw-r--r--kaffeine/terminate.patch269
-rw-r--r--po/Makefile.am1
-rw-r--r--po/ar.po3167
-rw-r--r--po/bg.po3185
-rw-r--r--po/bn.po3264
-rw-r--r--po/br.po3190
-rw-r--r--po/ca.po3194
-rw-r--r--po/cs.po3176
-rw-r--r--po/da.po3233
-rw-r--r--po/de.po3209
-rw-r--r--po/el.po3196
-rw-r--r--po/es.po3199
-rw-r--r--po/et.po3165
-rw-r--r--po/fi.po3190
-rw-r--r--po/fr.po3204
-rw-r--r--po/ga.po3174
-rw-r--r--po/gl.po3209
-rw-r--r--po/he.po3292
-rw-r--r--po/hu.po3185
-rw-r--r--po/it.po3185
-rw-r--r--po/ja.po3125
-rw-r--r--po/ka.po3683
-rw-r--r--po/km.po3259
-rw-r--r--po/lt.po3345
-rw-r--r--po/mk.po3551
-rw-r--r--po/nb.po3192
-rw-r--r--po/nl.po3192
-rw-r--r--po/nn.po3316
-rw-r--r--po/pa.po3103
-rw-r--r--po/pl.po3208
-rw-r--r--po/pt.po3213
-rw-r--r--po/pt_BR.po3317
-rw-r--r--po/ru.po3184
-rw-r--r--po/se.po3074
-rw-r--r--po/sk.po3063
-rw-r--r--po/sr.po3177
-rw-r--r--po/sr@Latn.po3178
-rw-r--r--po/sv.po3181
-rw-r--r--po/tg.po3070
-rw-r--r--po/tr.po3170
-rw-r--r--po/uk.po3190
-rw-r--r--po/uz.po3378
-rw-r--r--po/xx.po3165
-rw-r--r--po/zh_CN.po3118
-rw-r--r--po/zh_TW.po3137
-rw-r--r--stamp-h.in0
-rw-r--r--subdirs3
525 files changed, 233239 insertions, 0 deletions
diff --git a/AUTHORS b/AUTHORS
new file mode 100644
index 0000000..e483c62
--- /dev/null
+++ b/AUTHORS
@@ -0,0 +1,9 @@
+
+Christophe Thommeret <hftom@free.fr>
+(Current maintainer)
+
+Christoph Pfister <christophpfister@gmail.com>
+(Developer)
+
+Jurgen Kofler <kaffeine@gmx.net>
+(Original author)
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..d511905
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,339 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Lesser General Public License instead.) You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ GNU GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+ 1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+ 2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) You must cause the modified files to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ b) You must cause any work that you distribute or publish, that in
+ whole or in part contains or is derived from the Program or any
+ part thereof, to be licensed as a whole at no charge to all third
+ parties under the terms of this License.
+
+ c) If the modified program normally reads commands interactively
+ when run, you must cause it, when started running for such
+ interactive use in the most ordinary way, to print or display an
+ announcement including an appropriate copyright notice and a
+ notice that there is no warranty (or else, saying that you provide
+ a warranty) and that users may redistribute the program under
+ these conditions, and telling the user how to view a copy of this
+ License. (Exception: if the Program itself is interactive but
+ does not normally print such an announcement, your work based on
+ the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+ a) Accompany it with the complete corresponding machine-readable
+ source code, which must be distributed under the terms of Sections
+ 1 and 2 above on a medium customarily used for software interchange; or,
+
+ b) Accompany it with a written offer, valid for at least three
+ years, to give any third party, for a charge no more than your
+ cost of physically performing source distribution, a complete
+ machine-readable copy of the corresponding source code, to be
+ distributed under the terms of Sections 1 and 2 above on a medium
+ customarily used for software interchange; or,
+
+ c) Accompany it with the information you received as to the offer
+ to distribute corresponding source code. (This alternative is
+ allowed only for noncommercial distribution and only if you
+ received the program in object code or executable form with such
+ an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+ 5. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+ 6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+ 7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+ 9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+ 10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+ NO WARRANTY
+
+ 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+ 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ 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.,
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 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.
+
+ <signature of Ty Coon>, 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 Lesser General
+Public License instead of this License.
diff --git a/ChangeLog b/ChangeLog
new file mode 100644
index 0000000..d0906a6
--- /dev/null
+++ b/ChangeLog
@@ -0,0 +1,663 @@
+
+****************************
+* KAFFEINE ChangeLog *
+****************************
+
+0.8.6
+
+* kaffeine: new jpeg logo (the animated one is renamed logo.avi)
+* xine-part: added fastforward/slowmotion dcop calls, Vaclav Juza <vaclavjuza@seznam.cz>
+* xine-part: added --without-xcb configure flag (e.g. if you want to use opengl)
+* xine-part: escape special chars
+* DVB: single click displays current/next for that channel
+* DVB: send diseqc commands twice
+* DVB: added epg plugins support
+* xine-part: improved seeking
+* xine-part: added screen resolution settings
+* DVB: fix device probing
+* xine-part: added nextAudioChannel and nextSubtitleChannel to player menu
+* xine-part: added nextAudioChannel and nextSubtitleChannel dcop calls
+* DVB: check for NID/TSID instead of TSID
+* kaffeine: added "DVB" command line argument (kaffeine --help)
+* CDDA: fixed encoding crash
+* xine-part: fix audio/sub selection
+* DVB: fix PMTs with multiple audio streams
+* DVB: added a filename template field in dvb config dialog.
+* DVB: Instant record button is now a toggle button that starts and stops recordings silently (no dialogs)
+* kaffeine: requires xine-lib =>1.1.9
+* DVB: add support for multiple audio streams (live and rec)
+* DVB: removed ts2pes
+* DVB: fixed scan audio lang
+* DVB: scan : add channels found in PAT (not announced in SDT)
+
+0.8.5
+
+* DVB: scan: check for CA descriptors in PMT to correct CA flag.
+* DVB: add a file size limit option (usefull for some "limited" filesystems)
+* xine-part: added "QString screenShot()" dcop call (returns filename)
+* DVB: save/load epg data
+* DVB: insert PSI tables to make broadcast stream VLC compliant ( vlc requires SDT/PAT/PMTs )
+* DVB: reworked dvbevents to speed up eit parsing and fix events duplication.
+* dcop: make getTimePos() to return acurrate value.
+* DVB: add a "recall" button, that zap to the previous played channel.
+* DVB: make channel visible and selected after editing.
+* DVB: reset search after zap.
+* DVB: use iconv (a lot faster) instead of qtextcodec to convert sections strings
+* DVB: improved epg filter.
+* DVB: added a search field in channels list
+* DVB: added a filter box to epg dialog, patch by Michael Hoertnagl <mtron@a1.net>
+* DVB: added channels list rmb menu entry to edit channel.
+
+0.8.4
+
+* Playlist: menu option to not auto switch to player window
+* DVB: added osd browsing dcop calls
+* xine-part: dragndrop subtitles files
+* fixed: removed readonly parts support
+* fixed: improve screensaver disabling method again (old behaviour for non-kde environments)
+* DVB: added a "source" column in channels list.
+* Playlist: fix opening playlists
+* DVB: rotors support (usals and mem_pos)
+* DVB: fixed multi devices usage.
+* DVB: fixed devices probing
+* DVB: added tuning timeout options
+* DVB: fixed OSD epg bug with diseqc settings
+* DVB: use klocale for datetime format
+* Playlist: fix google fetcher
+* xine-part: support for xcb. Requires libxcb 1.0 and xine-lib 1.1.5. Fixes several issues.
+* gstreamer-part: port to gst 0.10
+* fixed: allow small window size in minimal mode
+* added: allow toggling (show / hide) panels by clicking tabs
+* xine-part: reduced audio/sub combos sizes
+* xine-part: add volume+/- to embedded context menu.
+* Playlist: don't cut bottom font in rollingtitle.
+* xine-part: better "Track infos" box layout.
+* xine-part: don't restore video settings if not previously saved
+
+0.8.3
+
+* DVB: selectAll button in scandialog
+* DVB: save channels list sort order
+* DVB: added "Current channel" button in epg window, patch by Michael Hoertnagl <mtron@a1.net>
+* xine-part: shortcuts for delay/advance subtitles (ctrl+alt+right/left)
+* xine-part: fixed wmv seeking.
+* xine-part: save and restore video settings (hue,saturation,contrast,brightness)
+* DVB: OSD warning when timeshift hd<300MB
+* added: option to start in minimal mode + dcop call.
+* added: "Open Dir" starts playing dvd from dir if dir points to a dvd image.
+* added: playing dvd iso files.
+* DVB: auto rename channels when adding to list
+* Disc: fixed crash trying to play while encoding
+* Disc: Ask user for cddb close matches, patch by Boyan Tabakov <blade.alslayer@gmail.com>
+* fixed: session issue.
+* fixed: better screensaver disabling method (no interfering key presses anymore).
+* DVB: fixed scanning services sharing same pmt.
+* DVB: added H/V (C band mutipoint) lnb settings.
+* DVB: improved device detection.
+* DVB: added : "int dvbSNR( int device )" dcop call.
+* fixed: crash when quit from systray.
+
+0.8.2
+
+* fixed: removed statusBar.
+* Disc: bigendian fix.
+* DVB: added current programm OSD progress bar
+* DVB: speed up OSD
+* DVB: fixed timer edit bug
+* DVB: added dvbNewTimer dcop func.
+* DVB: allow overlapping timers to start.
+* fixed: make sure to load xine_part instead of old kaffeine_part.
+* xine_part: removed empty audio/subtitles channels.
+* Kaffeine_part(s): added an entry in context menu to toggle minimal mode.
+* Playlist: added a "Clear Current Playlist" menu entry.
+* Playlist: autodownload cover now optional.
+* fixed: update google fetcher.
+* fixed: allow toggling from/to player/playlist even in fullscreen.
+* DVB: show SNR value for scanned channels, so a dvb-t user can choose the best one.
+* DVB: selectable channels icons (rigth click on a channel name in the list)
+* DVB: added "Scheduled" button in EPG window.
+* DVB: add dvb-t 8mhz autoscan mode for devices that support it.
+* fixed: switch to player window if mime does not contain "audio"
+* xine_part: block messages when filename contains "#"
+* DVB: cicam support, by Christoph Pfister
+* Systray: reversed mouse wheel behaviour.
+* Playlist: added a KURLComboBox to file browser.
+* DVB: fixed fast zap lock.
+* fixed: reduced minimum window size.
+* Playlist: autoselect subtitle when unique.
+
+0.8.1
+
+* fixed: configure check for cdparanoia.
+* Disc: force playing dvd/vcd with engine's default drive if kded_mediamanager fails to identify it.
+* kaffeine-part: plug dvd nav actions
+* DVB: write to fifo from a thread to circumvent deadlocks when xine stops (or fails) reading.
+* kaffeine-part: set skip forward/backward to 20s (to avoid "skating" when seeking in divx)
+* DVB: avoid negative freq value.
+* fixed: system:/media urls
+* fixed: include qapplication.h instead of qapp.h
+* fixed: use memcpy instead of mempcpy(gnu only) in ogg encoder.
+* fixed: ogg encoder makefile.
+
+0.8
+
+* Disc: autostart audioCD playback after query.
+* Disc: removed DVD and VCD buttons
+* StartWindow: added a "Audio CD encoding" button
+* Disc: use mediamanager to find available disc(s)
+* fixed: default to no systray icon.
+* Playlist: double-click on a file in file browser to add to playlist and start playing it.
+* DVB: recording start/stop, exec a script named $HOME/bin/kaffeine_recording with args:
+ kaffeine_recording On (recording started)
+ kaffeine_recording On '/file/name' (/file/name finished but still recording)
+ kaffeine_recording Off '/file/name' (/file/name finished, no more recording)
+* fixed: Fullscreen: hitting top or bottom unhide toolbars.
+ Minimal mode: mid_button hide/unhide toolbars.
+* StartWindow: numbered buttons, patch by "Aaron J. Seigo" <aseigo@kde.org>
+* fixed: no fake key press events when paused or playing audio (except fullscreen)
+ Removed config option and harcoded 55s timeout.
+* new: logo by Dieter Zander <dieter-mz@online.de>
+* added: mp3lame encoder
+* added: ogg encoder
+* new: cdda ripping
+* new: discs input module
+* new: new startwindow
+* fixed: auto switch to player window.
+* Playlist: changed tab label and icon.
+* DVB: previous/next zap to previous/next in current category instead of whole list, patch by Rainer Wirtz <rainer.wirtz@gmx.de>
+* Playlist: mutiselection in filebrowser, patch by Rainer Wirtz <rainer.wirtz@gmx.de>
+* new: KaffeineInput abstract class, inherited by all input modules.
+ - InputManager class to manage input modules.
+ - made PlayList an input module.
+ LAYOUT:
+ - vertical multitabbar.
+ - reparent player window on current input module widget.
+ - reduced number of toolbars (merged).
+ PLAYLIST:
+ - added a file browser.
+ - added cover fetcher (from Juk).
+ - playlist is no more undockable.
+ - playlist selector now on playlist page.
+ DVB:
+ - replace some chars in filenames ( < > / \ : " | ).
+ - dvbsi characters conversion.
+ - added a led for broadcasting.
+ - click on instant record button to stop recording.
+ - save video stream type and fill in pmt.
+* improved: column spacing, column order memory, and new stylistic touches inspired by Juk - Christopher Martin
+* improved: system tray applet - middle-clicking now toggles Play/Pause - Christopher Martin
+* kaffeine-part: make FastForward / SlowMotion more intuitively adjustable, like a sliding scale - Christopher Martin
+* fixed: deny certain widgets focus that don't need it - Christopher Martin
+* kaffeine-part: swap mouse wheel up/down behavior for volume and position.
+* DVB: dvbevents fixes.
+* DVB: fixed device detection.
+* fixed: loading track length whether CDDB information is found or not. - patch by Christopher Martin <christopher.martin@utoronto.ca>
+* fixed: open file dialog now accept non-local files - patch by Christopher Martin <christopher.martin@utoronto.ca>
+* added: support for KDE 3.5's system:/ - patch by Christopher Martin <christopher.martin@utoronto.ca>
+* kaffeine-part: added gapless playback.
+* kaffeine-part: improved seeking speed (metronom_prebuffer=12000).
+* DVB: relies on service->library() instead of service->name()
+* DVB: indexing filenames to not overwrite existing ones
+* DVB: added 10 sec tuning timeout
+* DVB: recording *.m2t instead of *.ts
+* kaffeine_part: added zoomInX, zoomOutX, zoomInY, zoomOutY.
+* added: playDvb() dcop function.
+* DVB: using qmap to store events patch by Matthias Lenk <matthias.lenk@gmx.de>
+* improved DVD navigation (kaffeine-part):
+ - possible now to select title, chapter and angle from DVD menu
+ - jumping to a chapter by entering a number with keypad
+ - resuming last title and chapter after pressing stop and play again
+* DVB: added number of events in dumped file.
+* DVB: fixed eit thread priority (lowest).
+* DVB: fixed osd crash when not in live mode.
+* DVB: dvb osd browsing patch by "Ben Jackson"<benj@puremourning.co.uk>
+
+0.7.1
+
+* new translation: catalan by Antoni Bella Perez <evasten5@yahoo.es>
+* DVB: fixed: mouse click on empty list crash in kevents.
+* added: some more DCOP functions - patch by Blindauer Emmanuel <manu2005@agat.net>
+* fixed: endless loop of error messages if no divx plugin installed (gstreamer) and playback of logo animation failed
+* fixed: compiling fails with some gcc versions
+
+0.7
+
+* DVB: added end datetime in timer editor.
+* dvb: added LNB(s) local oscillator frequency settings.
+* added: support for saving/exporting current playlist to M3U & PLS playlists
+* fixed: better handling of pls playlists (support for PLSv2) - taken from amaroK <http://amarok.kde.org>
+* gstreamer-part: aspect ratio should be correct now; menu with default ratios added
+* added: jumping to a playlist entry by typing a number into keypad
+* fixed: skip buttons of player part(s) are always enabled now; if a single track is played they'll
+ play next/previous track of the playlist (as expected from most users...)
+* gstreamer-part: support for audio cd, vcd and dvd (without navigation); with current GStreamer version (0.8.10)
+ and the gnomevfs plugin internet streaming works too; lot of small fixes
+* gstreamer-part: config dialog added
+* added: SMIL parser extracts now audio urls too
+* fixed: volume handling with hardware mixing: volume slider reflect now changes made with kmix
+ and other mixers; volume will no longer be restored at startup
+ - patch by Christopher Martin <christopher.martin@utoronto.ca>
+* added: dcop function dvdMenuToggle() to select a menu item - patch by Alex Belgraver <a.belgraver@quicknet.nl>
+* fixed: increased dvb events filter timeout.
+* added: patch to use double-click to add channel to broadcast list - patch by Laurent Montel <montel@kde.org>
+* added: dvb config dialog button to dump dvb events (epg) to file.
+* added: patch to use double-click to edit channel - patch by Laurent Montel <montel@kde.org>
+* added: multiple dvb devices support
+* new quit option: Quit After Playlist - patch by A. Wiedenbruch <mail@wiedenbruch.de>
+* fixed: passing AudioCD/VCD/DVD from command line if kaffeine is already running
+* fixed: some dvb categories fixes
+* fixed: kaffeine and the konqueror plugin did not use the same config file
+* new translation: galician by Daniel <daniel@auriasistemas.net>
+* configure flag: --with-xinit-workaround replaces --with-xorg, because some xfree versions
+ are affected too - patch by Christopher Martin <christopher.martin@utoronto.ca>
+* added: support for KDE 3.4's media:/ ioslave - patch by Christopher Martin <christopher.martin@utoronto.ca>
+* fixed: dock/undock playlist button always said "Undock"
+ - patch by Christopher Martin <christopher.martin@utoronto.ca>
+* added: -fvisibility support (reduces program size and increases speed)
+ - patch by Laurent Montel <montel@kde.org>
+* fixed: some memory leaks - patch by Laurent Montel <montel@kde.org>
+* added : dvb channels categories
+* added: enhanced dvb osd
+* new player-part: gstreamer-part; features: playback of local media files,
+ volume control, visualization, picture settings dialog
+* added: configure flag --without-dvb to build Kaffeine without DVB support
+* fixed: fullscreen behaviour (modal dialogs behind the video window)
+ -patch by Christopher Martin <christopher.martin@utoronto.ca>
+* added: dvb repeated timers
+* added : dvb broadcasting client
+* fixed : encrypted dvb channels crash
+* added : dvb broadcasting
+* wizard-dialog: check for DVB devices added
+* fixed: action "Append to Kaffeine Playlist" will only be visible for supported file types
+* added: dvb subtitle support ( one have to rescan to fetch the dvbsub info )
+* fixed: dvb epg time ( utc to local )
+* fixed: coding style inconsistencies ( kaffeine.cpp, kxinewidget.cpp )
+* new dcop function: changePlaylist()
+* new feature: improved seeking (skip forward/backward 10s, 1min and 10min)
+ - patch by Christopher Martin <christopher.martin@utoronto.ca>
+* fixed: parsing PLS files with empty lines
+
+0.6
+
+* Added kaffeine_part vol+/vol- menu entries
+* fixed changing of external subtitles "on the fly" & remember position
+* Added Equalizer again to Kaffeine
+* Kaffeine no longer prevents KDE session shut-down
+* Strg+A select only visible tracks now (Bug 1146078)
+* Fixed different mouse wheel behaviour of volume- and position-slider (Bug 1094965)
+* Fixed sort order of track numbers (1,2,...,9,10,11,...);
+ generally improved playlist sorting
+* Added local dvbdata installed in $KDEDIR/share/apps/kaffeine/dvbdata.tar.gz
+* Removed empty DVB menu
+* Deinterlacer fix: Some values wasn't restored correctly
+* Playing files from samba-shares should work now (with xine-lib 1.0-stable)
+* Fixed aspect ratio with dual-head (Xinerama)
+* Fixed problem with massive poping up xine messages that may freeze x-server
+* Fixed crash on exit
+* FULL DVB SUPPORT by Christophe Thommeret <hftom@wanadoo.fr> -
+ check README.dvb and updated Handbook!
+* Kaffeine settings dialog improved
+* highlight default xine configurations
+* add size option and font option to the OSD configuration
+* made pause button toggleable, fixed spacebar toggle pause/play, fixed openning files when the current media is in pause mode
+* most requested: reintroducing minimal mode
+* fixed xine config dialog (some entries changed in xine 1.0)
+* fixed problem with disabled position slider (DVD playback)
+
+0.5
+
+* new logo animation by Anders Ellenshøj Andersen <andersa@ellenshoej.dk>
+* fixed seeking in paused mode
+* when a subtitle file is opened or dropped, a dialog box appears and ask for the movie it belongs to
+ - patch by Assaf Gillat <gillata@gmail.com>
+* fixed drag&drop problems with non-unicode locale - patch by Assaf Gillat <gillata@gmail.com>
+* pause playback if user close/hide window and stream contains video
+* fixed timing problem: sometimes Kaffeine jumped to the next track after a second
+* mute: works now with arts driver; always unmute on start (if closed in muted state)
+* configure flag '--with-xorg' added: use it if Kaffeine hangs on startup with an x.org server
+* pressing pause enables the play button and disables the pause button
+* position slider disabled for non-seekable streams - patch by Assaf Gillat <gillata@gmail.com>
+* fixed compiler warnings in http.c - patch by Assaf Gillat <gillata@gmail.com>
+* ingnoring useless titles from meta info (like "track xxx")
+* count-down timer and timer OSD added: short click on timer button toggles forward/backward,
+ long-click toggles timer OSD - patch by Gillat A. <gillata@netvision.net.il>
+* introduced special playlist 'NEW' for files from command line and dropped files
+* possiblity to shutoff monitor and/or quit after current track - patch by Bryan <oiper@charter.net>
+* position slider fits now full available width
+* kaffeine-part registers itself as DCOP object; for a list of functions enter:
+ 'dcop kaffeine KaffeinePartIface' - patch by Matthieu PHILIP <matthieu.philip@polytechnique.org>
+* fixed crash after changing audio driver
+* new translations: turkish by Görkem Çetin <gorkem@gorkemcetin.com>;
+ portuguese by Flávio Moringa <flavio.moringa@caixamagica.pt>
+ macedonian by Igor Stamatovski <igor.stamatovski@gmail.com>
+
+0.5-rc2
+
+* finally fixed problem with wrong font encoding of titles (squares instead of
+ characters like ü and é) - patch by Gillat A. <gillata@netvision.net.il>
+* fixed problem with relative (non-local) filenames in M3U playlists
+* more autoresize options: resize to original size, double size or triple size
+* new dcop functions: playAudioCD(), playVCD(), playDVD()
+* new dcop functions: getFileName(), getLength(), getTimePos() - patch by Alek Wojdyga <pinkworm@alan.umcs.lublin.pl>
+* buffer overflow vulnerability fixed; was possible to crash Kaffeine with
+ special crafted RealAudio playlists (http://bugs.gentoo.org/show_bug.cgi?id=69663);
+ some other problems with ram playlists fixed too
+* some memory leaks fixed - patch by Laurent Montel <montel@kde.org>
+* system tray icon: duration of title announcement is now configurable (0 => off); mouse over popup hides it
+ (in order to not block the system tray)
+* preference option to remove Go!-Tab
+* fullscreen mode fixed: removed the border that was visible with some styles (e.g. Keramik)
+* storing data fixed (if $HOME different to $KDEHOME)
+* playlist is now "undockable" (separate playlist window)
+* its now possible to select an alternate font encoding for meta tags - patch by Gillat A. <gillata@netvision.net.il>
+* if you load a *.kaffeine file it will be appended to playlist-selector
+* toolbar state (visible/hidden) are restored correctly
+* toolbars: some buttons removed; channels toolbar is hidden by default
+* vdr:// urls work now
+* arts audio driver works again
+* single letter shortcuts allowed now (e.g. "F" for fullscreen)
+* fixed problem if build-dir is different from source-dir; patch by "Dawit A." <adawit@kde.org>
+* Updated translations: hungary, simplified chinese, swedish
+
+0.5-rc1
+
+* fixed fullscreen mode for fluxbox and some other window managers
+ (window decoration did'nt appear after leaving fullscreen)
+* video aspect ratio DVB (2.11:1) added
+* screenshot aspect ratio of anamorphic streams fixed
+* dummy-part added, developers can use it as template for own player-parts
+* Doc updated (Handbook, TODO file, README files, etc)
+* if reading of AudioCD/VCD/DVD fails, we ask user for correct path now
+* jump-to-position (time-based) feature added
+* support for xine OSD added
+* kaffeine now auto-switches to player-tab if source contains video
+* all data now stored in ~/.kde/share/apps/kaffeine; ~./kaffeine no longer used
+
+- New GUI design:
+ * Kaffeine is now a shell/part application and can use every player part
+(e.g.: kplayer, kaboodle) for playback, currently only the xine based
+kaffeine part is full supported.
+Note for developers: To create a part full supported by Kaffeine you have to
+derive your part from the KMediaPart class (see
+KDE_INLUDE_DIR/kaffeine/kmediapart.h) instead of KParts::ReadOnlyPart.
+ * One (tabbed) window interface contains player, playlist and maybe more in
+the future
+ * Interface follows now common KDE standards: XML UI structure, toolbars,
+statusbar
+ * All player/xine related stuff moved into the Kaffeine Part
+
+- Big code cleanup done:
+ * In accordance with KDE coding guidelines
+ * A lot of code completely rewritten
+ * Simplified xine API wrapper class (kxinewidget.cpp); can simple be used
+for every KDE applications and plain QT applications too
+ * New architecture seems to be more stable, can't reproduce known xfree
+crashes anymore
+
+- Shell Application:
+ * Filedialog: many new predefined file-filters (MPEG Audio, Quicktime, etc)
+ * "Minimal Mode" removed, no longer necessary
+ * Fullscreen Mode:  double-click switches between fullscreen and windowed
+mode; middle-click makes toolbars visible; fullscreen-panel removed
+ * Support for multiple playlists; all will be autosaved; playlist-switcher
+integrated in toolbar
+ * New columns in playlist: artist, album, track
+ * New queue mode: Select "Play next" in playlist context-menu to add a track
+to queue; after queue is empty, normal playback will be continued
+ * Playlist context menu: new "Create new Playlist from Selection" entry; now
+also visible over empty space
+ * Playlist remembers last played track
+ * Non-local playlists (m3u, pls, asx, etc) are now only parsed immediately
+before playing; included URLs now longer shown in playlist, because they can
+change from time to time; if playback of first entry fails, Kaffeine tries
+the next without any error message
+ * URL encoding fix: Kaffeine passes now the plain URL (without any encoding)
+to the player; fixes problems with xine's VCD plugin, special characters
+like "?" and " @" in local files and password proctected hosts
+ * Simplified DCOP interface: see kaffeineiface.h
+ * Completely disabled session management: got a lot of problem reports
+ * Transparent "OSD" removed: there is now a new popup beside the system tray
+instead
+ * Minimizing the main window re-enables the screensaver
+ * asx import improved: reads now AUTHOR and DURATION tags too
+ * new start window provides fast access to most important functions
+ * Improved install wizard dialog (first start): checks installation (xine-lib
+version, DMA mode, etc)
+ * Bookmark menu removed
+ * Use mouse wheel over system tray icon to skip forward/backward in
+playlist (patch by patch by Gustavo Pichorim Boiko <gustavo.boiko@kdemail.net>)
+ * removed all stuff deprecated in kde 3.2
+
+- Kaffeine Part:
+ * New features: mute, fast forward, slow motion
+ * Full network transparency: if given protocol not supported by xine, we try
+to download the source to a temorary file; you can now e.g. simple drop
+items from a tar archive into the playlist
+ * xine Error dialog: click on details to see last xine log messages
+ * xine Engine Parameter dialog simplified: only most important parameters
+shown; "Expert Options" button added
+ * Modal dialogs no longer created on startup; decreases starttime
+ * Font encoding in post-filter help dialog is correct now
+ * Audio volume (amplification) fix: removed distortion if user drags slider
+over 50%
+ * Counter fixed: goes now from 0:59...1:00 :-)
+ * Rudimentary SMIL support: simple reads out contained video sources (video
+tags),  and completely ignore all layout hints and time marks
+ * Equalizer removed for the moment: was not satisfied with the quality...
+ * Embedded in a konqueror frame: full given space is now used for video
+window; playback control via right-click context menu
+ * Support for xine's audio post filters added (patch by Miguel Freitas <mfreitas@gmail.com>);
+ you can now try out the new 2->5.1 upmix plugin and the cool stretch plugin (with pitch preservation)
+
+- Translations:
+ * Handbooks: simplified chinese translation by bamfox <bamfox@163.com>
+ * Updated: german, norwegian nynorsk, hebrew, simplified chinese, russian
+ * New: russian by Vladimir Marteev <marteev@ramenskoe.ru>; Norwegian Nynorsk by Karl Ove Hufthammer <karl@huftis.org>;
+ Dutch by Wilbert Berendsen <wbsoft@xs4all.nl>; Hebrew by Assaf Gillat <gillata@netvision.net.il>
+
+0.4.3b
+
+* moved mozilla-plugin in CVS module kaffeine-mozilla
+* removed superkaramba example
+* manpages now installed in $(mandir) (set it with ./configure --mandir=MANDIR)
+* font encoding fix (xine-lib uses now utf8 by default)
+* fixed broken icons for KDE 3.2
+* fixed fullscreen behaviour for KDE 3.2 (panel no longer appears after left-click)
+* made videosettings and equalizer dialog non-modal
+* use software audio amplification by default; new xine config entry gui.audio_mixer_software
+* updated translations: italian, polish
+
+0.4.3
+
+* clicking on the close button (x) of the main window hides it (if embedded in system tray)
+* position slider behaviour changed: left click seeks directly to a position - patch by Miguel Freitas
+* if init of selected audio/video driver fails, we try 'auto' - patch by Miguel Freitas
+* finally fixed the crash after closing with xfree 4.4/X.org 6.7
+ (thanks Conectiva Linux und SuSE Linux for helping me with that!!)
+* kaffeine uses now the tvtime plugin for deinterlacing; a new settings dialog makes it easy to select
+ deinterlace quality; deinterlace is by default turned on, since the tvtime plugin automatically
+ disables deinterlacing for progressive streams
+* big rework of post plugin handling, video postprocessing filters got a help button,
+ patch by Miguel Freitas <miguel@cetuc.puc-rio.br>
+* fixed compiler errors with gcc 3.3.3
+* playlist search improved: all entries that doesn't match the search string will be hidden, status bar shows
+ visible and total entries
+* DVD menu navigation will no longer block keyboard input, made separate shortcuts (CTRL+arrow keys, Return)
+* playlist window shortcuts are now also configurable
+* minimal mode hides status line
+* window caption shows current track title
+* open recent: replaces now playlist (similar to open file), increased max items to 15;
+ made clearing recent file list working
+* mozilla-plugin: - security fix (was possible to execute shell commands with backticks in the url,
+ only in older netscape versions)
+ - fixed problem that sometimes the plugin did'nt start kaffeine (e.g. http://www.giga.de/features/live/)
+ - fixed problem with microsoft media streams
+* filter dialog: added checkbox for enable/disable - removed "enable postprocessing" from view menu
+* kpart: - increased InitialPreference to 9 (forces konqueror to use kaffeine instead of kaboodle)
+ - fixed playback of application/x-mplayer2 streams
+ - focus policy fix
+ - displays now xine runtime errors
+ - fixed multiple loading, don't create controlpanel/init xine if "Controls" tag != "ImageWindow"
+* english/german manpages added, thanks to Zack Cerza <zcerza@coe.neu.edu>
+* i18n fixes, patch by Lukas Tinkl <lukas@kde.org>
+* shortcut configuration added, patch by Jeroen Wijnhout <Jeroen.Wijnhout@kdemail.net>
+* track length/stream info displayed correctly in fullscreen panel (was broken)
+* new translations: Slovenian by Matjaz Horvat <matjaz@owca.info>;
+ Norwegian Bokmal by Matias Hermanrud Fjeld <mhf@hex.no>
+
+0.4.2
+
+* kpart: "coffee bean" button starts kaffeine externally and stops embedded playback
+* file dialogs: filter "Supported Media Formats" added
+* fixed embeded preview of the quicktime trailers on www.apple.com; all trailers should work fine now
+* threading/event handling fix; the random crashes/freezes should be resolved now
+* automatic resize of video window (adapt to frame size), patch by Carlo Miotto <cmiotto@interfree.it>
+* autoloading support for multiple subtitle named like movie{.*}.[srt|ssa|smi...]; if more
+ than one subs exist (eg. different languages) a popup allows to select the playback sub (with embedded part too);
+ when playback starts the subtitle combobox in the main window is updated according
+ to the subtitles stored in the playlist for the movie;
+* control panel layout improved (fixed jerking time button)
+* playlist track info dialog improved + click on info icon opens it
+* playlist status bar shows total entries + total play time
+* mime type and mime icons for kaffeine playlists added (*.kaffeine files)
+* fixed visual plugin handling (for current xine-lib cvs version)
+* konqueror servicemenus: "Open with Kaffeine" for directories and "Append to Kaffeine Playlist" for all files
+* parser for ram playlists added, examples: http://www.thelinuxshow.com
+* wizard dialog on first run
+* fixed conflicts with installation files of KDE 3.2
+* you can now navigate through DVD menus with key arrows and enter
+* position sliders have a smoother behaviour now
+* all file dialogs remembers the last directory
+* volume will now be saved in kaffeinerc
+* possibility to turn equalizer on/off added
+* "P" toggles between video window and playlist
+* --verbose outputs now all debug messages of the xine engine
+* middle click will toggle fullscreen/windowed; escape key leaves fullscreen mode
+* support for urls from audiocd kio-slave: something like audiocd:/MP3/Title 03.mp3 will be
+ converted to cdda:/3; you can drop such urls into Kaffeine or use embedded preview
+* made xine error messages more understandably
+* --device switch: sets now DVD device too, path no longer saved in the xine configuration
+* settings dialog: possibility to turn system tray embeding and reading of meta info on loading,
+ push button to clear recent file list, push button to refresh all titles in the playlist;
+ made titleformat string more human readable (e.g.: "artist - title (album)");
+ you can set the alternate background color of playlist
+* kpart: reads and displays (konqueror caption) meta info
+* playlist: all available meta information (KDE+xine) and CDDB entries can now be read on loading;
+ progress dialog with the possibility to abort loading; moving items works again (broken in 0.4.1);
+ you can sort entries by clicking on the list headers (title, length,...)
+* font encoding fix for string values in xine config dialog
+* new translations: danish by Frederik Dannemare <admin@sentinel.dk>,
+ traditional chinese (Taiwan) by Tony Yu <u900002@apple.cmc.edu.tw>,
+ Brazilian portuguese by Helio Chissini de Castro <helio@kde.org>
+
+0.4.1
+
+* updated handbook, works now with KDE 3.2
+* (aparently) unsupported files will no longer skipped, the "Following URLs are not..." dialog will
+ no longer appear; was necessary because the mime type of some (newer) formats can not be detected
+ by KDE
+* new command line switch --verbose to output xine debug messages
+* support for xine messages added (popup)
+* urls like movie.avi#subtitle:sub.txt from command line will be accepted now
+* file import: mp3/ogg tags and length information will no be read on loading
+* visualization: you can choose the plugin now in "view" menu; if you minimalize the main window, visualization
+ will be turned off (to save cpu time)
+* support for mouse wheel added: you can navigate through stream with rotating mouse wheel over video window
+ or position slider (middle-click on position slider sets position directly)
+* you can find now a submenu vor DVD menus; use "D" to toggle between playback and DVD menu
+* support for xine's postprocessing plugins added; you can use the "tvtime" filter now for deinterlacing -
+ the build in deinterlace method seems to be depreciated
+* click on a mms:// reference in konqueror will launch kaffeine
+* kaffeine-part: the "coffee bean"-button will now send the current url to kaffeine (will be appended to the playlist)
+* a small control panel for minimal/fullscreen mode added (left-click on video window)
+* support for network broadcasting
+* audiodriver/videodriver/visualization plugin can now be changed during playback
+* kaffeine-part/mozilla-plugin: support for wma/wmv/asx files added
+* playlist: dragging entrys from playlist to e.g. konqueror or k3b is working now;
+ you can also use cut/copy/paste now to add/remove entries
+* m3u import: accepts now relative file paths and windows-style urls
+* kaffeine part: made quicktime trailers working (e.g. on www.apple.com/trailers);
+ fixed crash on tabbed browsing
+* made equalizer and video settings dialog modal - looks much better in fullscreen mode
+* two new FEATURES: support for external subtitle files (smi/srt/sub/txt files with same filename as the
+ movie will be autoloaded) and the possibility to save streams (xine's #save: option - need at least xine 1.0rc1!)
+* did a GUI cleanup: using now kde standard actions whereever possible; a "record" button and a
+ copy function in playlist added (copies url of selected item to clipboard)
+* xine-config dialog: no horizontal scrollbars anymore (patch by Hasso Tepper)
+* if you import a directory, subdirs will now be recursive scanned too
+* shortcuts: mainwin: arrow up for previous track, arrow down for next - corresponding with playlist;
+ playlist: return plays item; space toggles play/pause and backspace stops playback (similar to main window)
+* made --enqueue CD/VCD/etc working
+* mozilla-plugin will now be symlinked
+* new translations: hungary by VectoR <vector@vstart.hu>, japanese by Noriyuki Suzuki <noriyuki@turbolinux.co.jp>,
+ estonian by Hasso Tepper <hasso@estpak.ee>, simplified chinese by qianzheng <billqian@sohu.com>,
+ swedish by Bjoern Nitzler <b.nitzler@umea.bonet.se>
+
+
+0.4
+
+* add cmd line option --enqueue to append files to current playlist (patch by Michael Rolf)
+* made playlist-toolbar resizeable and moveable; settings will be saved (based on a patch by James Stembridge)
+* will no longer crash on startup if loading of audio/video-driver fails
+* add possibility to drop whole directories into videowindow, playlist or systemtray;
+ also you can now start kaff. like: kaffeine /home/username/mp3-dir to load all media files in a directory
+* resolved some font-encoding problems; can handle now multibyte encoded filenames (e.g. big5 encoded)
+* handbook updated
+* bookmark-entrys may now be playlists
+* new titles (maybe from internet broadcast) now OS displayed
+* add a mozilla-plugin - simple modified the gxine-plugin (by the xine project) to launch
+ kaffeine instead of gxine (thats open source :-)
+* add a system tray, accept drops from konqueror; current title is shown as tooltip
+* did some geometry fixes for big fonts
+* xine-config dialog is useable now :-)
+* modified startup/shutdown procedure - more stable now, kaffeine-part don't crash anymore
+* add equalizer
+* new command line options to set audio/video driver; useful if "auto" won't work
+* new translation: italian by Marco-=[LaTiNo]=- <marconet@libero.it>,
+ malay by Chyryll Zariss <czariss@yahoo.com>
+
+
+0.4beta1
+
+* command line: add a --device option to set the audiocd/vcd path + its now possible to hand over the
+ name of a input plugin (same as i the "play"-menu;
+ for example: "kaffeine --device /dev/cdrom VCD" (plays the vcd, if any)
+* LIRC: add a profile file from Gav Wood <gav@kde.org>; should be easy to use with kdelirc (KDE 3.2!)
+* xine-config dialog: scrollable now, enabled expert options
+* add a kaffeine part for konqueror preview; very unstable, for testers and developers only!
+* new translations: french by Pascal Leroux <leroux.pascal@wanadoo.fr>,
+ spanish by Quique <quique@sindominio.net> and czech by Klara Cihlarova <cihlarov@suse.cz>
+* plays now local *.wma files
+* fix for position changes, when playback is paused (patch by Adrian Schroeter <adrian@suse.de>)
+* add a right-click context menu for minimal- and fullscreen-mode
+* add a minimal mode (hides control-panel and menu)
+* add small context menu for playlist entries
+* playlist: better search-mechanism
+* add default button for video settings
+* command line args will now be passed to the running instance (if any)
+* add remote commands from command line (useful for global shortcuts)
+* add DCOP interface; type "dcop kaffeine Kaffeine" and "dcop kaffeine PlaybackControl" for available functions;
+ have a look into the "addons" directory: made a superkaramba theme demonstrating the dcop interface
+* resolved startup problems
+* saved kaffeine<->xine communication with a mutex
+
+
+0.3.2
+
+* add polish translation by Wafel <wafelj@wp.pl>
+* removed the cpu-exhausting process (no more choppy video)
+* add bookmark menu
+* add recent files submenu
+* last playlist will now be saved automatically
+* volume-slider now going downside up (patch by Alex Young <a.d.y@btinternet.com>)
+* add Mime-Type-field to desktop file
+* add #include <stdlib.h> to playlist.cpp
+* fixed crash if trying to start kaffeine twice
+* now by default a minimum of 6 audio/subtitle-channels, because i don't find a method to dedect all
+ available channels, looking for a better solution - HELP WELCOME!
+* disabled position-slider for non-seekable streams
+* kaffeine will now accept relative file-paths in command line
+* removed all methods don't work with KDE 3.0.x (i hope)
+
+0.3.1
+
diff --git a/INSTALL b/INSTALL
new file mode 100644
index 0000000..02a4a07
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,167 @@
+Basic Installation
+==================
+
+ These are generic installation instructions.
+
+ The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation. It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions. Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+ If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release. If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+ The file `configure.in' is used to create `configure' by a program
+called `autoconf'. You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+ 1. `cd' to the directory containing the package's source code and type
+ `./configure' to configure the package for your system. If you're
+ using `csh' on an old version of System V, you might need to type
+ `sh ./configure' instead to prevent `csh' from trying to execute
+ `configure' itself.
+
+ Running `configure' takes a while. While running, it prints some
+ messages telling which features it is checking for.
+
+ 2. Type `make' to compile the package.
+
+ 3. Type `make install' to install the programs and any data files and
+ documentation.
+
+ 4. You can remove the program binaries and object files from the
+ source code directory by typing `make clean'.
+
+Compilers and Options
+=====================
+
+ Some systems require unusual options for compilation or linking that
+the `configure' script does not know about. You can give `configure'
+initial values for variables by setting them in the environment. Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+ CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+ env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+ You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory. To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'. `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script. `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+ If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory. After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+ By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc. You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+ You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files. If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+ If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+ Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System). The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+ For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+ There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on. Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option. TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+ CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field. If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+ If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+ If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists. Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+ `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+ Use and save the results of the tests in FILE instead of
+ `./config.cache'. Set FILE to `/dev/null' to disable caching, for
+ debugging `configure'.
+
+`--help'
+ Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+ Do not print messages saying which checks are being made.
+
+`--srcdir=DIR'
+ Look for the package's source code in directory DIR. Usually
+ `configure' can determine that directory automatically.
+
+`--version'
+ Print the version of Autoconf used to generate the `configure'
+ script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Makefile.am b/Makefile.am
new file mode 100644
index 0000000..2369f25
--- /dev/null
+++ b/Makefile.am
@@ -0,0 +1,5 @@
+AUTOMAKE_OPTIONS = foreign 1.6.1
+
+include admin/deps.am
+include admin/Doxyfile.am
+SUBDIRS=$(TOPSUBDIRS)
diff --git a/Makefile.am.in b/Makefile.am.in
new file mode 100644
index 0000000..e46b27c
--- /dev/null
+++ b/Makefile.am.in
@@ -0,0 +1,4 @@
+AUTOMAKE_OPTIONS = foreign 1.6.1
+
+include admin/deps.am
+include admin/Doxyfile.am
diff --git a/README b/README
new file mode 100644
index 0000000..9a6ec79
--- /dev/null
+++ b/README
@@ -0,0 +1,86 @@
+
+*******************************
+* Kaffeine 0.8.x README *
+*******************************
+
+------------------------------------------------------
+!! HAVE A LOOK AT KAFFEINE HANDBOOK !!
+------------------------------------------------------
+
+!!!!!!!!!! IMPORTANT !!!!!!!
+Live DVB only works with the xine backend (XinePart).
+Depending on your distro, this package could be called kaffeine-xine.
+Install it, start Kaffeine and change the backend in menu->settings->engine, then restart Kaffeine.
+Note that this is only needed for live playback. All other features (recording, broadcasting..) do not depend on the backend.
+Anyway, I strongly recommend the xine engine even if you don't have a DVB device. All others are incomplete and/or buggy.
+Also note that for licensing reasons, some distro (kubuntu, suse) comes with "restricted" media libraries (xine, gstreamer),
+so you won't be able to play some media files (in fact the most common ones:().
+You will have to install an "unrestricted" version in order to play all your media files.
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+Latest Kaffeine version is available on http://kaffeine.sourceforge.net
+
+
+MINIMUM REQUIREMENTS:
+---------------------
+
+ *) xine-lib 1.0.2 (we recommend 1.1.1) (http://www.xinehq.de)
+ *) KDE >= 3.2 (http://www.kde.org)
+
+ *) for DVB support: see README.dvb
+ *) for the gstreamer player-part: see README.gstreamer
+
+RECOMMENDED:
+------------
+
+ *) WIN32 Codecs (http://www.mplayerhq.hu)
+ *) libdvdcss (http://developers.videolan.org/libdvdcss)
+
+
+INSTALLATION:
+-------------
+
+In order to compile and install Kaffeine on your system, type the following in the base
+directory of the Kaffeine distribution:
+
+ 1.) ./configure --prefix=KDEDIR --mandir=MANPAGE_DIR (e.g. for SuSE: --prefix=/opt/kde3 --mandir=/usr/share/man)
+ (use ./configure --help for more options)
+
+ 2,) make
+
+ 3.) make install
+
+
+On the download page you'll find RPM's for most distributions.
+
+Problems? Post to the kaffeine-user mailing-list: kaffeine-user@lists.sourceforge.net
+
+INSTALLATION FROM SVN:
+----------------------
+
+See http://kaffeine.sourceforge.net/index.php?page=developers
+
+
+IMPORTANT CONFIGURE FLAGS:
+--------------------------
+
+ --with-xorg : use this ONLY(!) in the case Kaffeine hangs at startup
+ --without-dvb : disables DVB support (may accelerate startup)
+ --without-gstreamer: disables build of the gstreamer based player-part
+
+
+TROUBLESHOOTING:
+----------------
+
+*) Fedora Users: If make aborts with '/usr/bin/ld: cannot find -lselinux' install
+ the libselinux-devel package or disable selinux.
+
+*) If Kaffeine hangs on start run 'configure --with-xinit-workaround' and recompile/reinstall.
+
+
+LICENCE:
+--------
+This programm is distributed under the terms of the GPL v2. You can find a copy of the
+licence in the file COPYING
+
diff --git a/TODO b/TODO
new file mode 100644
index 0000000..00fa62c
--- /dev/null
+++ b/TODO
@@ -0,0 +1,26 @@
+
+**************************
+* KAFFEINE ToDo *
+**************************
+
+
+If you're interested to take over one of this tasks just send us
+a short note to kaffeine-devel(AT)lists.sourceforge.net
+
+
+OPEN TASKS:
+-----------
+
+- Comprehensive Manual
+
+- Configuration system to assign a player-part
+to some mime types (or file-extensions)
+
+- Better handling of external subtitle files
+
+- GStreamer-part: DVD navigation and some more
+
+- A player-part based on mplayer
+(we could use the kpart of kplayer or kmplayer)
+
+
diff --git a/VERSION b/VERSION
new file mode 100644
index 0000000..fb396f6
--- /dev/null
+++ b/VERSION
@@ -0,0 +1 @@
+kaffeine version 0.8.6
diff --git a/acinclude.m4 b/acinclude.m4
new file mode 100644
index 0000000..360ee48
--- /dev/null
+++ b/acinclude.m4
@@ -0,0 +1,12618 @@
+## -*- autoconf -*-
+
+dnl This file is part of the KDE libraries/packages
+dnl Copyright (C) 1997 Janos Farkas (chexum@shadow.banki.hu)
+dnl (C) 1997,98,99 Stephan Kulow (coolo@kde.org)
+
+dnl This file is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Library General Public
+dnl License as published by the Free Software Foundation; either
+dnl version 2 of the License, or (at your option) any later version.
+
+dnl This library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl Library General Public License for more details.
+
+dnl You should have received a copy of the GNU Library General Public License
+dnl along with this library; see the file COPYING.LIB. If not, write to
+dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+dnl Boston, MA 02110-1301, USA.
+
+dnl IMPORTANT NOTE:
+dnl Please do not modify this file unless you expect your modifications to be
+dnl carried into every other module in the repository.
+dnl
+dnl Single-module modifications are best placed in configure.in for kdelibs
+dnl and kdebase or configure.in.in if present.
+
+# KDE_PATH_X_DIRECT
+dnl Internal subroutine of AC_PATH_X.
+dnl Set ac_x_includes and/or ac_x_libraries.
+AC_DEFUN([KDE_PATH_X_DIRECT],
+[
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+if test "$ac_x_includes" = NO; then
+ # Guess where to find include files, by looking for this one X11 .h file.
+ test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
+
+ # First, try using that file with no special directory specified.
+AC_TRY_CPP([#include <$x_direct_test_include>],
+[# We can compile using X headers with no special include directory.
+ac_x_includes=],
+[# Look for the header file in a standard set of common directories.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ for ac_dir in \
+ /usr/X11/include \
+ /usr/X11R6/include \
+ /usr/X11R5/include \
+ /usr/X11R4/include \
+ \
+ /usr/include/X11 \
+ /usr/include/X11R6 \
+ /usr/include/X11R5 \
+ /usr/include/X11R4 \
+ \
+ /usr/local/X11/include \
+ /usr/local/X11R6/include \
+ /usr/local/X11R5/include \
+ /usr/local/X11R4/include \
+ \
+ /usr/local/include/X11 \
+ /usr/local/include/X11R6 \
+ /usr/local/include/X11R5 \
+ /usr/local/include/X11R4 \
+ \
+ /usr/X386/include \
+ /usr/x386/include \
+ /usr/XFree86/include/X11 \
+ \
+ /usr/include \
+ /usr/local/include \
+ /usr/unsupported/include \
+ /usr/athena/include \
+ /usr/local/x11r5/include \
+ /usr/lpp/Xamples/include \
+ \
+ /usr/openwin/include \
+ /usr/openwin/share/include \
+ ; \
+ do
+ if test -r "$ac_dir/$x_direct_test_include"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+ done])
+fi # $ac_x_includes = NO
+
+if test "$ac_x_libraries" = NO; then
+ # Check for the libraries.
+
+ test -z "$x_direct_test_library" && x_direct_test_library=Xt
+ test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc
+
+ # See if we find them without any special options.
+ # Don't add to $LIBS permanently.
+ ac_save_LIBS="$LIBS"
+ LIBS="-l$x_direct_test_library $LIBS"
+AC_TRY_LINK([#include <X11/Intrinsic.h>], [${x_direct_test_function}(1)],
+[LIBS="$ac_save_LIBS"
+# We can link X programs with no special library path.
+ac_x_libraries=],
+[LIBS="$ac_save_LIBS"
+# First see if replacing the include by lib works.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+for ac_dir in `echo "$ac_x_includes" | sed s/include/lib${kdelibsuff}/` \
+ /usr/X11/lib${kdelibsuff} \
+ /usr/X11R6/lib${kdelibsuff} \
+ /usr/X11R5/lib${kdelibsuff} \
+ /usr/X11R4/lib${kdelibsuff} \
+ \
+ /usr/lib${kdelibsuff}/X11 \
+ /usr/lib${kdelibsuff}/X11R6 \
+ /usr/lib${kdelibsuff}/X11R5 \
+ /usr/lib${kdelibsuff}/X11R4 \
+ \
+ /usr/local/X11/lib${kdelibsuff} \
+ /usr/local/X11R6/lib${kdelibsuff} \
+ /usr/local/X11R5/lib${kdelibsuff} \
+ /usr/local/X11R4/lib${kdelibsuff} \
+ \
+ /usr/local/lib${kdelibsuff}/X11 \
+ /usr/local/lib${kdelibsuff}/X11R6 \
+ /usr/local/lib${kdelibsuff}/X11R5 \
+ /usr/local/lib${kdelibsuff}/X11R4 \
+ \
+ /usr/X386/lib${kdelibsuff} \
+ /usr/x386/lib${kdelibsuff} \
+ /usr/XFree86/lib${kdelibsuff}/X11 \
+ \
+ /usr/lib${kdelibsuff} \
+ /usr/local/lib${kdelibsuff} \
+ /usr/unsupported/lib${kdelibsuff} \
+ /usr/athena/lib${kdelibsuff} \
+ /usr/local/x11r5/lib${kdelibsuff} \
+ /usr/lpp/Xamples/lib${kdelibsuff} \
+ /lib/usr/lib${kdelibsuff}/X11 \
+ \
+ /usr/openwin/lib${kdelibsuff} \
+ /usr/openwin/share/lib${kdelibsuff} \
+ ; \
+do
+dnl Don't even attempt the hair of trying to link an X program!
+ for ac_extension in a so sl; do
+ if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done])
+fi # $ac_x_libraries = NO
+])
+
+
+dnl ------------------------------------------------------------------------
+dnl Find a file (or one of more files in a list of dirs)
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_FIND_FILE],
+[
+$3=NO
+for i in $2;
+do
+ for j in $1;
+ do
+ echo "configure: __oline__: $i/$j" >&AC_FD_CC
+ if test -r "$i/$j"; then
+ echo "taking that" >&AC_FD_CC
+ $3=$i
+ break 2
+ fi
+ done
+done
+])
+
+dnl KDE_FIND_PATH(program-name, variable-name, list-of-dirs,
+dnl if-not-found, test-parameter, prepend-path)
+dnl
+dnl Look for program-name in list-of-dirs+$PATH.
+dnl If prepend-path is set, look in $PATH+list-of-dirs instead.
+dnl If found, $variable-name is set. If not, if-not-found is evaluated.
+dnl test-parameter: if set, the program is executed with this arg,
+dnl and only a successful exit code is required.
+AC_DEFUN([KDE_FIND_PATH],
+[
+ AC_MSG_CHECKING([for $1])
+ if test -n "$$2"; then
+ kde_cv_path="$$2";
+ else
+ kde_cache=`echo $1 | sed 'y%./+-%__p_%'`
+
+ AC_CACHE_VAL(kde_cv_path_$kde_cache,
+ [
+ kde_cv_path="NONE"
+ kde_save_IFS=$IFS
+ IFS=':'
+ dirs=""
+ for dir in $PATH; do
+ dirs="$dirs $dir"
+ done
+ if test -z "$6"; then dnl Append dirs in PATH (default)
+ dirs="$3 $dirs"
+ else dnl Prepend dirs in PATH (if 6th arg is set)
+ dirs="$dirs $3"
+ fi
+ IFS=$kde_save_IFS
+
+ for dir in $dirs; do
+ if test -x "$dir/$1"; then
+ if test -n "$5"
+ then
+ evalstr="$dir/$1 $5 2>&1 "
+ if eval $evalstr; then
+ kde_cv_path="$dir/$1"
+ break
+ fi
+ else
+ kde_cv_path="$dir/$1"
+ break
+ fi
+ fi
+ done
+
+ eval "kde_cv_path_$kde_cache=$kde_cv_path"
+
+ ])
+
+ eval "kde_cv_path=\"`echo '$kde_cv_path_'$kde_cache`\""
+
+ fi
+
+ if test -z "$kde_cv_path" || test "$kde_cv_path" = NONE; then
+ AC_MSG_RESULT(not found)
+ $4
+ else
+ AC_MSG_RESULT($kde_cv_path)
+ $2=$kde_cv_path
+
+ fi
+])
+
+AC_DEFUN([KDE_MOC_ERROR_MESSAGE],
+[
+ AC_MSG_ERROR([No Qt meta object compiler (moc) found!
+Please check whether you installed Qt correctly.
+You need to have a running moc binary.
+configure tried to run $ac_cv_path_moc and the test didn't
+succeed. If configure shouldn't have tried this one, set
+the environment variable MOC to the right one before running
+configure.
+])
+])
+
+AC_DEFUN([KDE_UIC_ERROR_MESSAGE],
+[
+ AC_MSG_WARN([No Qt ui compiler (uic) found!
+Please check whether you installed Qt correctly.
+You need to have a running uic binary.
+configure tried to run $ac_cv_path_uic and the test didn't
+succeed. If configure shouldn't have tried this one, set
+the environment variable UIC to the right one before running
+configure.
+])
+])
+
+
+AC_DEFUN([KDE_CHECK_UIC_FLAG],
+[
+ AC_MSG_CHECKING([whether uic supports -$1 ])
+ kde_cache=`echo $1 | sed 'y% .=/+-%____p_%'`
+ AC_CACHE_VAL(kde_cv_prog_uic_$kde_cache,
+ [
+ cat >conftest.ui <<EOT
+ <!DOCTYPE UI><UI version="3" stdsetdef="1"></UI>
+EOT
+ ac_uic_testrun="$UIC_PATH -$1 $2 conftest.ui >/dev/null"
+ if AC_TRY_EVAL(ac_uic_testrun); then
+ eval "kde_cv_prog_uic_$kde_cache=yes"
+ else
+ eval "kde_cv_prog_uic_$kde_cache=no"
+ fi
+ rm -f conftest*
+ ])
+
+ if eval "test \"`echo '$kde_cv_prog_uic_'$kde_cache`\" = yes"; then
+ AC_MSG_RESULT([yes])
+ :
+ $3
+ else
+ AC_MSG_RESULT([no])
+ :
+ $4
+ fi
+])
+
+
+dnl ------------------------------------------------------------------------
+dnl Find the meta object compiler and the ui compiler in the PATH,
+dnl in $QTDIR/bin, and some more usual places
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_PATH_QT_MOC_UIC],
+[
+ AC_REQUIRE([KDE_CHECK_PERL])
+ qt_bindirs=""
+ for dir in $kde_qt_dirs; do
+ qt_bindirs="$qt_bindirs $dir/bin $dir/src/moc"
+ done
+ qt_bindirs="$qt_bindirs /usr/bin /usr/X11R6/bin /usr/local/qt/bin"
+ if test ! "$ac_qt_bindir" = "NO"; then
+ qt_bindirs="$ac_qt_bindir $qt_bindirs"
+ fi
+
+ KDE_FIND_PATH(moc, MOC, [$qt_bindirs], [KDE_MOC_ERROR_MESSAGE])
+ if test -z "$UIC_NOT_NEEDED"; then
+ KDE_FIND_PATH(uic, UIC_PATH, [$qt_bindirs], [UIC_PATH=""])
+ if test -z "$UIC_PATH" ; then
+ KDE_UIC_ERROR_MESSAGE
+ exit 1
+ else
+ UIC=$UIC_PATH
+
+ if test $kde_qtver = 3; then
+ KDE_CHECK_UIC_FLAG(L,[/nonexistent],ac_uic_supports_libpath=yes,ac_uic_supports_libpath=no)
+ KDE_CHECK_UIC_FLAG(nounload,,ac_uic_supports_nounload=yes,ac_uic_supports_nounload=no)
+
+ if test x$ac_uic_supports_libpath = xyes; then
+ UIC="$UIC -L \$(kde_widgetdir)"
+ fi
+ if test x$ac_uic_supports_nounload = xyes; then
+ UIC="$UIC -nounload"
+ fi
+ fi
+ fi
+ else
+ UIC="echo uic not available: "
+ fi
+
+ AC_SUBST(MOC)
+ AC_SUBST(UIC)
+
+ UIC_TR="i18n"
+ if test $kde_qtver = 3; then
+ UIC_TR="tr2i18n"
+ fi
+
+ AC_SUBST(UIC_TR)
+])
+
+AC_DEFUN([KDE_1_CHECK_PATHS],
+[
+ KDE_1_CHECK_PATH_HEADERS
+
+ KDE_TEST_RPATH=
+
+ if test -n "$USE_RPATH"; then
+
+ if test -n "$kde_libraries"; then
+ KDE_TEST_RPATH="-R $kde_libraries"
+ fi
+
+ if test -n "$qt_libraries"; then
+ KDE_TEST_RPATH="$KDE_TEST_RPATH -R $qt_libraries"
+ fi
+
+ if test -n "$x_libraries"; then
+ KDE_TEST_RPATH="$KDE_TEST_RPATH -R $x_libraries"
+ fi
+
+ KDE_TEST_RPATH="$KDE_TEST_RPATH $KDE_EXTRA_RPATH"
+ fi
+
+AC_MSG_CHECKING([for KDE libraries installed])
+ac_link='$LIBTOOL_SHELL --silent --mode=link ${CXX-g++} -o conftest $CXXFLAGS $all_includes $CPPFLAGS $LDFLAGS $all_libraries conftest.$ac_ext $LIBS -lkdecore $LIBQT $KDE_TEST_RPATH 1>&5'
+
+if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ AC_MSG_RESULT(yes)
+else
+ AC_MSG_ERROR([your system fails at linking a small KDE application!
+Check, if your compiler is installed correctly and if you have used the
+same compiler to compile Qt and kdelibs as you did use now.
+For more details about this problem, look at the end of config.log.])
+fi
+
+if eval `KDEDIR= ./conftest 2>&5`; then
+ kde_result=done
+else
+ kde_result=problems
+fi
+
+KDEDIR= ./conftest 2> /dev/null >&5 # make an echo for config.log
+kde_have_all_paths=yes
+
+KDE_SET_PATHS($kde_result)
+
+])
+
+AC_DEFUN([KDE_SET_PATHS],
+[
+ kde_cv_all_paths="kde_have_all_paths=\"yes\" \
+ kde_htmldir=\"$kde_htmldir\" \
+ kde_appsdir=\"$kde_appsdir\" \
+ kde_icondir=\"$kde_icondir\" \
+ kde_sounddir=\"$kde_sounddir\" \
+ kde_datadir=\"$kde_datadir\" \
+ kde_locale=\"$kde_locale\" \
+ kde_cgidir=\"$kde_cgidir\" \
+ kde_confdir=\"$kde_confdir\" \
+ kde_kcfgdir=\"$kde_kcfgdir\" \
+ kde_mimedir=\"$kde_mimedir\" \
+ kde_toolbardir=\"$kde_toolbardir\" \
+ kde_wallpaperdir=\"$kde_wallpaperdir\" \
+ kde_templatesdir=\"$kde_templatesdir\" \
+ kde_bindir=\"$kde_bindir\" \
+ kde_servicesdir=\"$kde_servicesdir\" \
+ kde_servicetypesdir=\"$kde_servicetypesdir\" \
+ kde_moduledir=\"$kde_moduledir\" \
+ kde_styledir=\"$kde_styledir\" \
+ kde_widgetdir=\"$kde_widgetdir\" \
+ xdg_appsdir=\"$xdg_appsdir\" \
+ xdg_menudir=\"$xdg_menudir\" \
+ xdg_directorydir=\"$xdg_directorydir\" \
+ kde_result=$1"
+])
+
+AC_DEFUN([KDE_SET_DEFAULT_PATHS],
+[
+if test "$1" = "default"; then
+
+ if test -z "$kde_htmldir"; then
+ kde_htmldir='\${datadir}/doc/HTML'
+ fi
+ if test -z "$kde_appsdir"; then
+ kde_appsdir='\${datadir}/applnk'
+ fi
+ if test -z "$kde_icondir"; then
+ kde_icondir='\${datadir}/icons'
+ fi
+ if test -z "$kde_sounddir"; then
+ kde_sounddir='\${datadir}/sounds'
+ fi
+ if test -z "$kde_datadir"; then
+ kde_datadir='\${datadir}/apps'
+ fi
+ if test -z "$kde_locale"; then
+ kde_locale='\${datadir}/locale'
+ fi
+ if test -z "$kde_cgidir"; then
+ kde_cgidir='\${exec_prefix}/cgi-bin'
+ fi
+ if test -z "$kde_confdir"; then
+ kde_confdir='\${datadir}/config'
+ fi
+ if test -z "$kde_kcfgdir"; then
+ kde_kcfgdir='\${datadir}/config.kcfg'
+ fi
+ if test -z "$kde_mimedir"; then
+ kde_mimedir='\${datadir}/mimelnk'
+ fi
+ if test -z "$kde_toolbardir"; then
+ kde_toolbardir='\${datadir}/toolbar'
+ fi
+ if test -z "$kde_wallpaperdir"; then
+ kde_wallpaperdir='\${datadir}/wallpapers'
+ fi
+ if test -z "$kde_templatesdir"; then
+ kde_templatesdir='\${datadir}/templates'
+ fi
+ if test -z "$kde_bindir"; then
+ kde_bindir='\${exec_prefix}/bin'
+ fi
+ if test -z "$kde_servicesdir"; then
+ kde_servicesdir='\${datadir}/services'
+ fi
+ if test -z "$kde_servicetypesdir"; then
+ kde_servicetypesdir='\${datadir}/servicetypes'
+ fi
+ if test -z "$kde_moduledir"; then
+ if test "$kde_qtver" = "2"; then
+ kde_moduledir='\${libdir}/kde2'
+ else
+ kde_moduledir='\${libdir}/kde3'
+ fi
+ fi
+ if test -z "$kde_styledir"; then
+ kde_styledir='\${libdir}/kde3/plugins/styles'
+ fi
+ if test -z "$kde_widgetdir"; then
+ kde_widgetdir='\${libdir}/kde3/plugins/designer'
+ fi
+ if test -z "$xdg_appsdir"; then
+ xdg_appsdir='\${datadir}/applications/kde'
+ fi
+ if test -z "$xdg_menudir"; then
+ xdg_menudir='\${sysconfdir}/xdg/menus'
+ fi
+ if test -z "$xdg_directorydir"; then
+ xdg_directorydir='\${datadir}/desktop-directories'
+ fi
+
+ KDE_SET_PATHS(defaults)
+
+else
+
+ if test $kde_qtver = 1; then
+ AC_MSG_RESULT([compiling])
+ KDE_1_CHECK_PATHS
+ else
+ AC_MSG_ERROR([path checking not yet supported for KDE 2])
+ fi
+
+fi
+])
+
+AC_DEFUN([KDE_CHECK_PATHS_FOR_COMPLETENESS],
+[ if test -z "$kde_htmldir" || test -z "$kde_appsdir" ||
+ test -z "$kde_icondir" || test -z "$kde_sounddir" ||
+ test -z "$kde_datadir" || test -z "$kde_locale" ||
+ test -z "$kde_cgidir" || test -z "$kde_confdir" ||
+ test -z "$kde_kcfgdir" ||
+ test -z "$kde_mimedir" || test -z "$kde_toolbardir" ||
+ test -z "$kde_wallpaperdir" || test -z "$kde_templatesdir" ||
+ test -z "$kde_bindir" || test -z "$kde_servicesdir" ||
+ test -z "$kde_servicetypesdir" || test -z "$kde_moduledir" ||
+ test -z "$kde_styledir" || test -z "kde_widgetdir" ||
+ test -z "$xdg_appsdir" || test -z "$xdg_menudir" || test -z "$xdg_directorydir" ||
+ test "x$kde_have_all_paths" != "xyes"; then
+ kde_have_all_paths=no
+ fi
+])
+
+AC_DEFUN([KDE_MISSING_PROG_ERROR],
+[
+ AC_MSG_ERROR([The important program $1 was not found!
+Please check whether you installed KDE correctly.
+])
+])
+
+AC_DEFUN([KDE_MISSING_ARTS_ERROR],
+[
+ AC_MSG_ERROR([The important program $1 was not found!
+Please check whether you installed aRts correctly or use
+--without-arts to compile without aRts support (this will remove functionality).
+])
+])
+
+AC_DEFUN([KDE_SET_DEFAULT_BINDIRS],
+[
+ kde_default_bindirs="/usr/bin /usr/local/bin /opt/local/bin /usr/X11R6/bin /opt/kde/bin /opt/kde3/bin /usr/kde/bin /usr/local/kde/bin"
+ test -n "$KDEDIR" && kde_default_bindirs="$KDEDIR/bin $kde_default_bindirs"
+ if test -n "$KDEDIRS"; then
+ kde_save_IFS=$IFS
+ IFS=:
+ for dir in $KDEDIRS; do
+ kde_default_bindirs="$dir/bin $kde_default_bindirs "
+ done
+ IFS=$kde_save_IFS
+ fi
+])
+
+AC_DEFUN([KDE_SUBST_PROGRAMS],
+[
+ AC_ARG_WITH(arts,
+ AC_HELP_STRING([--without-arts],[build without aRts [default=no]]),
+ [build_arts=$withval],
+ [build_arts=yes]
+ )
+ AM_CONDITIONAL(include_ARTS, test "$build_arts" '!=' "no")
+ if test "$build_arts" = "no"; then
+ AC_DEFINE(WITHOUT_ARTS, 1, [Defined if compiling without arts])
+ fi
+
+ KDE_SET_DEFAULT_BINDIRS
+ kde_default_bindirs="$exec_prefix/bin $prefix/bin $kde_libs_prefix/bin $kde_default_bindirs"
+ KDE_FIND_PATH(dcopidl, DCOPIDL, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl)])
+ KDE_FIND_PATH(dcopidl2cpp, DCOPIDL2CPP, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidl2cpp)])
+ if test "$build_arts" '!=' "no"; then
+ KDE_FIND_PATH(mcopidl, MCOPIDL, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(mcopidl)])
+ KDE_FIND_PATH(artsc-config, ARTSCCONFIG, [$kde_default_bindirs], [KDE_MISSING_ARTS_ERROR(artsc-config)])
+ fi
+ KDE_FIND_PATH(meinproc, MEINPROC, [$kde_default_bindirs])
+
+ kde32ornewer=1
+ kde33ornewer=1
+ if test -n "$kde_qtver" && test "$kde_qtver" -lt 3; then
+ kde32ornewer=
+ kde33ornewer=
+ else
+ if test "$kde_qtver" = "3"; then
+ if test "$kde_qtsubver" -le 1; then
+ kde32ornewer=
+ fi
+ if test "$kde_qtsubver" -le 2; then
+ kde33ornewer=
+ fi
+ if test "$KDECONFIG" != "compiled"; then
+ if test `$KDECONFIG --version | grep KDE | sed 's/KDE: \(...\).*/\1/'` = 3.2; then
+ kde33ornewer=
+ fi
+ fi
+ fi
+ fi
+
+ if test -n "$kde32ornewer"; then
+ KDE_FIND_PATH(kconfig_compiler, KCONFIG_COMPILER, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kconfig_compiler)])
+ KDE_FIND_PATH(dcopidlng, DCOPIDLNG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(dcopidlng)])
+ fi
+ if test -n "$kde33ornewer"; then
+ KDE_FIND_PATH(makekdewidgets, MAKEKDEWIDGETS, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(makekdewidgets)])
+ AC_SUBST(MAKEKDEWIDGETS)
+ fi
+ KDE_FIND_PATH(xmllint, XMLLINT, [${prefix}/bin ${exec_prefix}/bin], [XMLLINT=""])
+
+ if test -n "$MEINPROC" -a "$MEINPROC" != "compiled"; then
+ kde_sharedirs="/usr/share/kde /usr/local/share /usr/share /opt/kde3/share /opt/kde/share $prefix/share"
+ test -n "$KDEDIR" && kde_sharedirs="$KDEDIR/share $kde_sharedirs"
+ AC_FIND_FILE(apps/ksgmltools2/customization/kde-chunk.xsl, $kde_sharedirs, KDE_XSL_STYLESHEET)
+ if test "$KDE_XSL_STYLESHEET" = "NO"; then
+ KDE_XSL_STYLESHEET=""
+ else
+ KDE_XSL_STYLESHEET="$KDE_XSL_STYLESHEET/apps/ksgmltools2/customization/kde-chunk.xsl"
+ fi
+ fi
+
+ DCOP_DEPENDENCIES='$(DCOPIDL)'
+ if test -n "$kde32ornewer"; then
+ KCFG_DEPENDENCIES='$(KCONFIG_COMPILER)'
+ DCOP_DEPENDENCIES='$(DCOPIDL) $(DCOPIDLNG)'
+ AC_SUBST(KCONFIG_COMPILER)
+ AC_SUBST(KCFG_DEPENDENCIES)
+ AC_SUBST(DCOPIDLNG)
+ fi
+ AC_SUBST(DCOPIDL)
+ AC_SUBST(DCOPIDL2CPP)
+ AC_SUBST(DCOP_DEPENDENCIES)
+ AC_SUBST(MCOPIDL)
+ AC_SUBST(ARTSCCONFIG)
+ AC_SUBST(MEINPROC)
+ AC_SUBST(KDE_XSL_STYLESHEET)
+ AC_SUBST(XMLLINT)
+])dnl
+
+AC_DEFUN([AC_CREATE_KFSSTND],
+[
+AC_REQUIRE([AC_CHECK_RPATH])
+
+AC_MSG_CHECKING([for KDE paths])
+kde_result=""
+kde_cached_paths=yes
+AC_CACHE_VAL(kde_cv_all_paths,
+[
+ KDE_SET_DEFAULT_PATHS($1)
+ kde_cached_paths=no
+])
+eval "$kde_cv_all_paths"
+KDE_CHECK_PATHS_FOR_COMPLETENESS
+if test "$kde_have_all_paths" = "no" && test "$kde_cached_paths" = "yes"; then
+ # wrong values were cached, may be, we can set better ones
+ kde_result=
+ kde_htmldir= kde_appsdir= kde_icondir= kde_sounddir=
+ kde_datadir= kde_locale= kde_cgidir= kde_confdir= kde_kcfgdir=
+ kde_mimedir= kde_toolbardir= kde_wallpaperdir= kde_templatesdir=
+ kde_bindir= kde_servicesdir= kde_servicetypesdir= kde_moduledir=
+ kde_have_all_paths=
+ kde_styledir=
+ kde_widgetdir=
+ xdg_appsdir = xdg_menudir= xdg_directorydir=
+ KDE_SET_DEFAULT_PATHS($1)
+ eval "$kde_cv_all_paths"
+ KDE_CHECK_PATHS_FOR_COMPLETENESS
+ kde_result="$kde_result (cache overridden)"
+fi
+if test "$kde_have_all_paths" = "no"; then
+ AC_MSG_ERROR([configure could not run a little KDE program to test the environment.
+Since it had compiled and linked before, it must be a strange problem on your system.
+Look at config.log for details. If you are not able to fix this, look at
+http://www.kde.org/faq/installation.html or any www.kde.org mirror.
+(If you're using an egcs version on Linux, you may update binutils!)
+])
+else
+ rm -f conftest*
+ AC_MSG_RESULT($kde_result)
+fi
+
+bindir=$kde_bindir
+
+KDE_SUBST_PROGRAMS
+
+])
+
+AC_DEFUN([AC_SUBST_KFSSTND],
+[
+AC_SUBST(kde_htmldir)
+AC_SUBST(kde_appsdir)
+AC_SUBST(kde_icondir)
+AC_SUBST(kde_sounddir)
+AC_SUBST(kde_datadir)
+AC_SUBST(kde_locale)
+AC_SUBST(kde_confdir)
+AC_SUBST(kde_kcfgdir)
+AC_SUBST(kde_mimedir)
+AC_SUBST(kde_wallpaperdir)
+AC_SUBST(kde_bindir)
+dnl X Desktop Group standards
+AC_SUBST(xdg_appsdir)
+AC_SUBST(xdg_menudir)
+AC_SUBST(xdg_directorydir)
+dnl for KDE 2
+AC_SUBST(kde_templatesdir)
+AC_SUBST(kde_servicesdir)
+AC_SUBST(kde_servicetypesdir)
+AC_SUBST(kde_moduledir)
+AC_SUBST(kdeinitdir, '$(kde_moduledir)')
+AC_SUBST(kde_styledir)
+AC_SUBST(kde_widgetdir)
+if test "$kde_qtver" = 1; then
+ kde_minidir="$kde_icondir/mini"
+else
+# for KDE 1 - this breaks KDE2 apps using minidir, but
+# that's the plan ;-/
+ kde_minidir="/dev/null"
+fi
+dnl AC_SUBST(kde_minidir)
+dnl AC_SUBST(kde_cgidir)
+dnl AC_SUBST(kde_toolbardir)
+])
+
+AC_DEFUN([KDE_MISC_TESTS],
+[
+ dnl Checks for libraries.
+ AC_CHECK_LIB(util, main, [LIBUTIL="-lutil"]) dnl for *BSD
+ AC_SUBST(LIBUTIL)
+ AC_CHECK_LIB(compat, main, [LIBCOMPAT="-lcompat"]) dnl for *BSD
+ AC_SUBST(LIBCOMPAT)
+ kde_have_crypt=
+ AC_CHECK_LIB(crypt, crypt, [LIBCRYPT="-lcrypt"; kde_have_crypt=yes],
+ AC_CHECK_LIB(c, crypt, [kde_have_crypt=yes], [
+ AC_MSG_WARN([you have no crypt in either libcrypt or libc.
+You should install libcrypt from another source or configure with PAM
+support])
+ kde_have_crypt=no
+ ]))
+ AC_SUBST(LIBCRYPT)
+ if test $kde_have_crypt = yes; then
+ AC_DEFINE_UNQUOTED(HAVE_CRYPT, 1, [Defines if your system has the crypt function])
+ fi
+ AC_CHECK_SOCKLEN_T
+ AC_CHECK_LIB(dnet, dnet_ntoa, [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"])
+ if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+ AC_CHECK_LIB(dnet_stub, dnet_ntoa,
+ [X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"])
+ fi
+ AC_CHECK_FUNC(inet_ntoa)
+ if test $ac_cv_func_inet_ntoa = no; then
+ AC_CHECK_LIB(nsl, inet_ntoa, X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl")
+ fi
+ AC_CHECK_FUNC(connect)
+ if test $ac_cv_func_connect = no; then
+ AC_CHECK_LIB(socket, connect, X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS", ,
+ $X_EXTRA_LIBS)
+ fi
+
+ AC_CHECK_FUNC(remove)
+ if test $ac_cv_func_remove = no; then
+ AC_CHECK_LIB(posix, remove, X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix")
+ fi
+
+ # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+ AC_CHECK_FUNC(shmat, ,
+ AC_CHECK_LIB(ipc, shmat, X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"))
+
+ # more headers that need to be explicitly included on darwin
+ AC_CHECK_HEADERS(sys/types.h stdint.h)
+
+ # sys/bitypes.h is needed for uint32_t and friends on Tru64
+ AC_CHECK_HEADERS(sys/bitypes.h)
+
+ # darwin requires a poll emulation library
+ AC_CHECK_LIB(poll, poll, LIB_POLL="-lpoll")
+
+ # for some image handling on Mac OS X
+ AC_CHECK_HEADERS(Carbon/Carbon.h)
+
+ # CoreAudio framework
+ AC_CHECK_HEADER(CoreAudio/CoreAudio.h, [
+ AC_DEFINE(HAVE_COREAUDIO, 1, [Define if you have the CoreAudio API])
+ FRAMEWORK_COREAUDIO="-Wl,-framework,CoreAudio"
+ ])
+
+ AC_CHECK_RES_INIT
+ AC_SUBST(LIB_POLL)
+ AC_SUBST(FRAMEWORK_COREAUDIO)
+ LIBSOCKET="$X_EXTRA_LIBS"
+ AC_SUBST(LIBSOCKET)
+ AC_SUBST(X_EXTRA_LIBS)
+ AC_CHECK_LIB(ucb, killpg, [LIBUCB="-lucb"]) dnl for Solaris2.4
+ AC_SUBST(LIBUCB)
+
+ case $host in dnl this *is* LynxOS specific
+ *-*-lynxos* )
+ AC_MSG_CHECKING([LynxOS header file wrappers])
+ [CFLAGS="$CFLAGS -D__NO_INCLUDE_WARN__"]
+ AC_MSG_RESULT(disabled)
+ AC_CHECK_LIB(bsd, gethostbyname, [LIBSOCKET="-lbsd"]) dnl for LynxOS
+ ;;
+ esac
+
+ KDE_CHECK_TYPES
+ KDE_CHECK_LIBDL
+ KDE_CHECK_STRLCPY
+ KDE_CHECK_PIE_SUPPORT
+
+# darwin needs this to initialize the environment
+AC_CHECK_HEADERS(crt_externs.h)
+AC_CHECK_FUNC(_NSGetEnviron, [AC_DEFINE(HAVE_NSGETENVIRON, 1, [Define if your system needs _NSGetEnviron to set up the environment])])
+
+AH_VERBATIM(_DARWIN_ENVIRON,
+[
+#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H)
+# include <sys/time.h>
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron())
+#endif
+])
+
+AH_VERBATIM(_AIX_STRINGS_H_BZERO,
+[
+/*
+ * AIX defines FD_SET in terms of bzero, but fails to include <strings.h>
+ * that defines bzero.
+ */
+
+#if defined(_AIX)
+#include <strings.h>
+#endif
+])
+
+AC_CHECK_FUNCS([vsnprintf snprintf])
+
+AH_VERBATIM(_TRU64,[
+/*
+ * On HP-UX, the declaration of vsnprintf() is needed every time !
+ */
+
+#if !defined(HAVE_VSNPRINTF) || defined(hpux)
+#if __STDC__
+#include <stdarg.h>
+#include <stdlib.h>
+#else
+#include <varargs.h>
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+int vsnprintf(char *str, size_t n, char const *fmt, va_list ap);
+#ifdef __cplusplus
+extern "C"
+#endif
+int snprintf(char *str, size_t n, char const *fmt, ...);
+#endif
+])
+
+])
+
+dnl ------------------------------------------------------------------------
+dnl Find the header files and libraries for X-Windows. Extended the
+dnl macro AC_PATH_X
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([K_PATH_X],
+[
+AC_REQUIRE([KDE_MISC_TESTS])dnl
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+AC_ARG_ENABLE(
+ embedded,
+ AC_HELP_STRING([--enable-embedded],[link to Qt-embedded, don't use X]),
+ kde_use_qt_emb=$enableval,
+ kde_use_qt_emb=no
+)
+
+AC_ARG_ENABLE(
+ qtopia,
+ AC_HELP_STRING([--enable-qtopia],[link to Qt-embedded, link to the Qtopia Environment]),
+ kde_use_qt_emb_palm=$enableval,
+ kde_use_qt_emb_palm=no
+)
+
+AC_ARG_ENABLE(
+ mac,
+ AC_HELP_STRING([--enable-mac],[link to Qt/Mac (don't use X)]),
+ kde_use_qt_mac=$enableval,
+ kde_use_qt_mac=no
+)
+
+# used to disable x11-specific stuff on special platforms
+AM_CONDITIONAL(include_x11, test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no")
+
+if test "$kde_use_qt_emb" = "no" && test "$kde_use_qt_mac" = "no"; then
+
+AC_MSG_CHECKING(for X)
+
+AC_CACHE_VAL(kde_cv_have_x,
+[# One or both of the vars are not set, and there is no cached value.
+if test "{$x_includes+set}" = set || test "$x_includes" = NONE; then
+ kde_x_includes=NO
+else
+ kde_x_includes=$x_includes
+fi
+if test "{$x_libraries+set}" = set || test "$x_libraries" = NONE; then
+ kde_x_libraries=NO
+else
+ kde_x_libraries=$x_libraries
+fi
+
+# below we use the standard autoconf calls
+ac_x_libraries=$kde_x_libraries
+ac_x_includes=$kde_x_includes
+
+KDE_PATH_X_DIRECT
+dnl AC_PATH_X_XMKMF picks /usr/lib as the path for the X libraries.
+dnl Unfortunately, if compiling with the N32 ABI, this is not the correct
+dnl location. The correct location is /usr/lib32 or an undefined value
+dnl (the linker is smart enough to pick the correct default library).
+dnl Things work just fine if you use just AC_PATH_X_DIRECT.
+dnl Solaris has a similar problem. AC_PATH_X_XMKMF forces x_includes to
+dnl /usr/openwin/include, which doesn't work. /usr/include does work, so
+dnl x_includes should be left alone.
+case "$host" in
+mips-sgi-irix6*)
+ ;;
+*-*-solaris*)
+ ;;
+*)
+ _AC_PATH_X_XMKMF
+ if test -z "$ac_x_includes"; then
+ ac_x_includes="."
+ fi
+ if test -z "$ac_x_libraries"; then
+ ac_x_libraries="/usr/lib${kdelibsuff}"
+ fi
+esac
+#from now on we use our own again
+
+# when the user already gave --x-includes, we ignore
+# what the standard autoconf macros told us.
+if test "$kde_x_includes" = NO; then
+ kde_x_includes=$ac_x_includes
+fi
+
+# for --x-libraries too
+if test "$kde_x_libraries" = NO; then
+ kde_x_libraries=$ac_x_libraries
+fi
+
+if test "$kde_x_includes" = NO; then
+ AC_MSG_ERROR([Can't find X includes. Please check your installation and add the correct paths!])
+fi
+
+if test "$kde_x_libraries" = NO; then
+ AC_MSG_ERROR([Can't find X libraries. Please check your installation and add the correct paths!])
+fi
+
+# Record where we found X for the cache.
+kde_cv_have_x="have_x=yes \
+ kde_x_includes=$kde_x_includes kde_x_libraries=$kde_x_libraries"
+])dnl
+
+eval "$kde_cv_have_x"
+
+if test "$have_x" != yes; then
+ AC_MSG_RESULT($have_x)
+ no_x=yes
+else
+ AC_MSG_RESULT([libraries $kde_x_libraries, headers $kde_x_includes])
+fi
+
+if test -z "$kde_x_includes" || test "x$kde_x_includes" = xNONE; then
+ X_INCLUDES=""
+ x_includes="."; dnl better than nothing :-
+ else
+ x_includes=$kde_x_includes
+ X_INCLUDES="-I$x_includes"
+fi
+
+if test -z "$kde_x_libraries" || test "x$kde_x_libraries" = xNONE || test "$kde_x_libraries" = "/usr/lib"; then
+ X_LDFLAGS=""
+ x_libraries="/usr/lib"; dnl better than nothing :-
+ else
+ x_libraries=$kde_x_libraries
+ X_LDFLAGS="-L$x_libraries"
+fi
+all_includes="$X_INCLUDES"
+all_libraries="$X_LDFLAGS $LDFLAGS_AS_NEEDED $LDFLAGS_NEW_DTAGS"
+
+# Check for libraries that X11R6 Xt/Xaw programs need.
+ac_save_LDFLAGS="$LDFLAGS"
+LDFLAGS="$LDFLAGS $X_LDFLAGS"
+# SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+# check for ICE first), but we must link in the order -lSM -lICE or
+# we get undefined symbols. So assume we have SM if we have ICE.
+# These have to be linked with before -lX11, unlike the other
+# libraries we check for below, so use a different variable.
+# --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
+AC_CHECK_LIB(ICE, IceConnectionNumber,
+ [LIBSM="-lSM -lICE"], , $X_EXTRA_LIBS)
+LDFLAGS="$ac_save_LDFLAGS"
+
+LIB_X11='-lX11 $(LIBSOCKET)'
+
+AC_MSG_CHECKING(for libXext)
+AC_CACHE_VAL(kde_cv_have_libXext,
+[
+kde_ldflags_safe="$LDFLAGS"
+kde_libs_safe="$LIBS"
+
+LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS"
+LIBS="-lXext -lX11 $LIBSOCKET"
+
+AC_TRY_LINK([
+#include <stdio.h>
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+#endif
+],
+[
+printf("hello Xext\n");
+],
+kde_cv_have_libXext=yes,
+kde_cv_have_libXext=no
+)
+
+LDFLAGS=$kde_ldflags_safe
+LIBS=$kde_libs_safe
+])
+
+AC_MSG_RESULT($kde_cv_have_libXext)
+
+if test "$kde_cv_have_libXext" = "no"; then
+ AC_MSG_ERROR([We need a working libXext to proceed. Since configure
+can't find it itself, we stop here assuming that make wouldn't find
+them either.])
+fi
+
+LIB_XEXT="-lXext"
+QTE_NORTTI=""
+
+elif test "$kde_use_qt_emb" = "yes"; then
+ dnl We're using QT Embedded
+ CPPFLAGS=-DQWS
+ CXXFLAGS="$CXXFLAGS -fno-rtti"
+ QTE_NORTTI="-fno-rtti -DQWS"
+ X_PRE_LIBS=""
+ LIB_X11=""
+ LIB_XEXT=""
+ LIB_XRENDER=""
+ LIBSM=""
+ X_INCLUDES=""
+ X_LDFLAGS=""
+ x_includes=""
+ x_libraries=""
+elif test "$kde_use_qt_mac" = "yes"; then
+ dnl We're using QT/Mac (I use QT_MAC so that qglobal.h doesn't *have* to
+ dnl be included to get the information) --Sam
+ CXXFLAGS="$CXXFLAGS -DQT_MAC -no-cpp-precomp"
+ CFLAGS="$CFLAGS -DQT_MAC -no-cpp-precomp"
+ X_PRE_LIBS=""
+ LIB_X11=""
+ LIB_XEXT=""
+ LIB_XRENDER=""
+ LIBSM=""
+ X_INCLUDES=""
+ X_LDFLAGS=""
+ x_includes=""
+ x_libraries=""
+fi
+AC_SUBST(X_PRE_LIBS)
+AC_SUBST(LIB_X11)
+AC_SUBST(LIB_XRENDER)
+AC_SUBST(LIBSM)
+AC_SUBST(X_INCLUDES)
+AC_SUBST(X_LDFLAGS)
+AC_SUBST(x_includes)
+AC_SUBST(x_libraries)
+AC_SUBST(QTE_NORTTI)
+AC_SUBST(LIB_XEXT)
+
+])
+
+AC_DEFUN([KDE_PRINT_QT_PROGRAM],
+[
+AC_REQUIRE([KDE_USE_QT])
+cat > conftest.$ac_ext <<EOF
+#include "confdefs.h"
+#include <qglobal.h>
+#include <qapplication.h>
+EOF
+if test "$kde_qtver" = "2"; then
+cat >> conftest.$ac_ext <<EOF
+#include <qevent.h>
+#include <qstring.h>
+#include <qstyle.h>
+EOF
+
+if test $kde_qtsubver -gt 0; then
+cat >> conftest.$ac_ext <<EOF
+#if QT_VERSION < 210
+#error 1
+#endif
+EOF
+fi
+fi
+
+if test "$kde_qtver" = "3"; then
+cat >> conftest.$ac_ext <<EOF
+#include <qcursor.h>
+#include <qstylefactory.h>
+#include <private/qucomextra_p.h>
+EOF
+fi
+
+echo "#if ! ($kde_qt_verstring)" >> conftest.$ac_ext
+cat >> conftest.$ac_ext <<EOF
+#error 1
+#endif
+
+int main() {
+EOF
+if test "$kde_qtver" = "2"; then
+cat >> conftest.$ac_ext <<EOF
+ QStringList *t = new QStringList();
+ Q_UNUSED(t);
+EOF
+if test $kde_qtsubver -gt 0; then
+cat >> conftest.$ac_ext <<EOF
+ QString s;
+ s.setLatin1("Elvis is alive", 14);
+EOF
+fi
+fi
+if test "$kde_qtver" = "3"; then
+cat >> conftest.$ac_ext <<EOF
+ (void)QStyleFactory::create(QString::null);
+ QCursor c(Qt::WhatsThisCursor);
+EOF
+fi
+cat >> conftest.$ac_ext <<EOF
+ return 0;
+}
+EOF
+])
+
+AC_DEFUN([KDE_USE_QT],
+[
+if test -z "$1"; then
+ # Current default Qt version: 3.3
+ kde_qtver=3
+ kde_qtsubver=3
+else
+ kde_qtsubver=`echo "$1" | sed -e 's#[0-9][0-9]*\.\([0-9][0-9]*\).*#\1#'`
+ # following is the check if subversion isnt found in passed argument
+ if test "$kde_qtsubver" = "$1"; then
+ kde_qtsubver=1
+ fi
+ kde_qtver=`echo "$1" | sed -e 's#^\([0-9][0-9]*\)\..*#\1#'`
+ if test "$kde_qtver" = "1"; then
+ kde_qtsubver=42
+ fi
+fi
+
+if test -z "$2"; then
+ if test "$kde_qtver" = "2"; then
+ if test $kde_qtsubver -gt 0; then
+ kde_qt_minversion=">= Qt 2.2.2"
+ else
+ kde_qt_minversion=">= Qt 2.0.2"
+ fi
+ fi
+ if test "$kde_qtver" = "3"; then
+ if test $kde_qtsubver -gt 0; then
+ if test $kde_qtsubver -gt 1; then
+ if test $kde_qtsubver -gt 2; then
+ kde_qt_minversion=">= Qt 3.3 and < 4.0"
+ else
+ kde_qt_minversion=">= Qt 3.2 and < 4.0"
+ fi
+ else
+ kde_qt_minversion=">= Qt 3.1 (20021021) and < 4.0"
+ fi
+ else
+ kde_qt_minversion=">= Qt 3.0 and < 4.0"
+ fi
+ fi
+ if test "$kde_qtver" = "1"; then
+ kde_qt_minversion=">= 1.42 and < 2.0"
+ fi
+else
+ kde_qt_minversion="$2"
+fi
+
+if test -z "$3"; then
+ if test $kde_qtver = 3; then
+ if test $kde_qtsubver -gt 0; then
+ kde_qt_verstring="QT_VERSION >= 0x03@VER@00 && QT_VERSION < 0x040000"
+ qtsubver=`echo "00$kde_qtsubver" | sed -e 's,.*\(..\)$,\1,'`
+ kde_qt_verstring=`echo $kde_qt_verstring | sed -e "s,@VER@,$qtsubver,"`
+ else
+ kde_qt_verstring="QT_VERSION >= 300 && QT_VERSION < 0x040000"
+ fi
+ fi
+ if test $kde_qtver = 2; then
+ if test $kde_qtsubver -gt 0; then
+ kde_qt_verstring="QT_VERSION >= 222"
+ else
+ kde_qt_verstring="QT_VERSION >= 200"
+ fi
+ fi
+ if test $kde_qtver = 1; then
+ kde_qt_verstring="QT_VERSION >= 142 && QT_VERSION < 200"
+ fi
+else
+ kde_qt_verstring="$3"
+fi
+
+if test $kde_qtver = 4; then
+ kde_qt_dirs="$QTDIR /usr/lib/qt4 /usr/lib/qt /usr/share/qt4"
+fi
+if test $kde_qtver = 3; then
+ kde_qt_dirs="$QTDIR /usr/lib/qt3 /usr/lib/qt /usr/share/qt3"
+fi
+if test $kde_qtver = 2; then
+ kde_qt_dirs="$QTDIR /usr/lib/qt2 /usr/lib/qt"
+fi
+if test $kde_qtver = 1; then
+ kde_qt_dirs="$QTDIR /usr/lib/qt"
+fi
+])
+
+AC_DEFUN([KDE_CHECK_QT_DIRECT],
+[
+AC_REQUIRE([KDE_USE_QT])
+AC_MSG_CHECKING([if Qt compiles without flags])
+AC_CACHE_VAL(kde_cv_qt_direct,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+ac_LD_LIBRARY_PATH_safe=$LD_LIBRARY_PATH
+ac_LIBRARY_PATH="$LIBRARY_PATH"
+ac_cxxflags_safe="$CXXFLAGS"
+ac_ldflags_safe="$LDFLAGS"
+ac_libs_safe="$LIBS"
+
+CXXFLAGS="$CXXFLAGS -I$qt_includes"
+LDFLAGS="$LDFLAGS $X_LDFLAGS"
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIBS="$LIBQT -lXext -lX11 $LIBSOCKET"
+else
+LIBS="$LIBQT $LIBSOCKET"
+fi
+LD_LIBRARY_PATH=
+export LD_LIBRARY_PATH
+LIBRARY_PATH=
+export LIBRARY_PATH
+
+KDE_PRINT_QT_PROGRAM
+
+if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ kde_cv_qt_direct="yes"
+else
+ kde_cv_qt_direct="no"
+ echo "configure: failed program was:" >&AC_FD_CC
+ cat conftest.$ac_ext >&AC_FD_CC
+fi
+
+rm -f conftest*
+CXXFLAGS="$ac_cxxflags_safe"
+LDFLAGS="$ac_ldflags_safe"
+LIBS="$ac_libs_safe"
+
+LD_LIBRARY_PATH="$ac_LD_LIBRARY_PATH_safe"
+export LD_LIBRARY_PATH
+LIBRARY_PATH="$ac_LIBRARY_PATH"
+export LIBRARY_PATH
+AC_LANG_RESTORE
+])
+
+if test "$kde_cv_qt_direct" = "yes"; then
+ AC_MSG_RESULT(yes)
+ $1
+else
+ AC_MSG_RESULT(no)
+ $2
+fi
+])
+
+dnl ------------------------------------------------------------------------
+dnl Try to find the Qt headers and libraries.
+dnl $(QT_LDFLAGS) will be -Lqtliblocation (if needed)
+dnl and $(QT_INCLUDES) will be -Iqthdrlocation (if needed)
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_PATH_QT_1_3],
+[
+AC_REQUIRE([K_PATH_X])
+AC_REQUIRE([KDE_USE_QT])
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+dnl ------------------------------------------------------------------------
+dnl Add configure flag to enable linking to MT version of Qt library.
+dnl ------------------------------------------------------------------------
+
+AC_ARG_ENABLE(
+ mt,
+ AC_HELP_STRING([--disable-mt],[link to non-threaded Qt (deprecated)]),
+ kde_use_qt_mt=$enableval,
+ [
+ if test $kde_qtver = 3; then
+ kde_use_qt_mt=yes
+ else
+ kde_use_qt_mt=no
+ fi
+ ]
+)
+
+USING_QT_MT=""
+
+dnl ------------------------------------------------------------------------
+dnl If we not get --disable-qt-mt then adjust some vars for the host.
+dnl ------------------------------------------------------------------------
+
+KDE_MT_LDFLAGS=
+KDE_MT_LIBS=
+if test "x$kde_use_qt_mt" = "xyes"; then
+ KDE_CHECK_THREADING
+ if test "x$kde_use_threading" = "xyes"; then
+ CPPFLAGS="$USE_THREADS -DQT_THREAD_SUPPORT $CPPFLAGS"
+ KDE_MT_LDFLAGS="$USE_THREADS"
+ KDE_MT_LIBS="$LIBPTHREAD"
+ else
+ kde_use_qt_mt=no
+ fi
+fi
+AC_SUBST(KDE_MT_LDFLAGS)
+AC_SUBST(KDE_MT_LIBS)
+
+kde_qt_was_given=yes
+
+dnl ------------------------------------------------------------------------
+dnl If we haven't been told how to link to Qt, we work it out for ourselves.
+dnl ------------------------------------------------------------------------
+if test -z "$LIBQT_GLOB"; then
+ if test "x$kde_use_qt_emb" = "xyes"; then
+ LIBQT_GLOB="libqte.*"
+ else
+ LIBQT_GLOB="libqt.*"
+ fi
+fi
+
+dnl ------------------------------------------------------------
+dnl If we got --enable-embedded then adjust the Qt library name.
+dnl ------------------------------------------------------------
+if test "x$kde_use_qt_emb" = "xyes"; then
+ qtlib="qte"
+else
+ qtlib="qt"
+fi
+
+kde_int_qt="-l$qtlib"
+
+if test -z "$LIBQPE"; then
+dnl ------------------------------------------------------------
+dnl If we got --enable-palmtop then add -lqpe to the link line
+dnl ------------------------------------------------------------
+ if test "x$kde_use_qt_emb" = "xyes"; then
+ if test "x$kde_use_qt_emb_palm" = "xyes"; then
+ LIB_QPE="-lqpe"
+ else
+ LIB_QPE=""
+ fi
+ else
+ LIB_QPE=""
+ fi
+fi
+
+dnl ------------------------------------------------------------------------
+dnl If we got --enable-qt-mt then adjust the Qt library name for the host.
+dnl ------------------------------------------------------------------------
+
+if test "x$kde_use_qt_mt" = "xyes"; then
+ LIBQT="-l$qtlib-mt"
+ kde_int_qt="-l$qtlib-mt"
+ LIBQT_GLOB="lib$qtlib-mt.*"
+ USING_QT_MT="using -mt"
+else
+ LIBQT="-l$qtlib"
+fi
+
+if test $kde_qtver != 1; then
+
+ AC_REQUIRE([AC_FIND_PNG])
+ AC_REQUIRE([AC_FIND_JPEG])
+ LIBQT="$LIBQT $LIBPNG $LIBJPEG"
+fi
+
+if test $kde_qtver = 3; then
+ AC_REQUIRE([KDE_CHECK_LIBDL])
+ LIBQT="$LIBQT $LIBDL"
+fi
+
+AC_MSG_CHECKING([for Qt])
+
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIBQT="$LIBQT $X_PRE_LIBS -lXext -lX11 $LIBSM $LIBSOCKET"
+fi
+ac_qt_includes=NO ac_qt_libraries=NO ac_qt_bindir=NO
+qt_libraries=""
+qt_includes=""
+AC_ARG_WITH(qt-dir,
+ AC_HELP_STRING([--with-qt-dir=DIR],[where the root of Qt is installed ]),
+ [ ac_qt_includes="$withval"/include
+ ac_qt_libraries="$withval"/lib${kdelibsuff}
+ ac_qt_bindir="$withval"/bin
+ ])
+
+AC_ARG_WITH(qt-includes,
+ AC_HELP_STRING([--with-qt-includes=DIR],[where the Qt includes are. ]),
+ [
+ ac_qt_includes="$withval"
+ ])
+
+kde_qt_libs_given=no
+
+AC_ARG_WITH(qt-libraries,
+ AC_HELP_STRING([--with-qt-libraries=DIR],[where the Qt library is installed.]),
+ [ ac_qt_libraries="$withval"
+ kde_qt_libs_given=yes
+ ])
+
+AC_CACHE_VAL(ac_cv_have_qt,
+[#try to guess Qt locations
+
+qt_incdirs=""
+for dir in $kde_qt_dirs; do
+ qt_incdirs="$qt_incdirs $dir/include $dir"
+done
+qt_incdirs="$QTINC $qt_incdirs /usr/local/qt/include /usr/include/qt /usr/include /usr/X11R6/include/X11/qt /usr/X11R6/include/qt /usr/X11R6/include/qt2 /usr/include/qt3 $x_includes"
+if test ! "$ac_qt_includes" = "NO"; then
+ qt_incdirs="$ac_qt_includes $qt_incdirs"
+fi
+
+if test "$kde_qtver" != "1"; then
+ kde_qt_header=qstyle.h
+else
+ kde_qt_header=qglobal.h
+fi
+
+AC_FIND_FILE($kde_qt_header, $qt_incdirs, qt_incdir)
+ac_qt_includes="$qt_incdir"
+
+qt_libdirs=""
+for dir in $kde_qt_dirs; do
+ qt_libdirs="$qt_libdirs $dir/lib${kdelibsuff} $dir"
+done
+qt_libdirs="$QTLIB $qt_libdirs /usr/X11R6/lib /usr/lib /usr/local/qt/lib $x_libraries"
+if test ! "$ac_qt_libraries" = "NO"; then
+ qt_libdir=$ac_qt_libraries
+else
+ qt_libdirs="$ac_qt_libraries $qt_libdirs"
+ # if the Qt was given, the chance is too big that libqt.* doesn't exist
+ qt_libdir=NONE
+ for dir in $qt_libdirs; do
+ try="ls -1 $dir/${LIBQT_GLOB}"
+ if test -n "`$try 2> /dev/null`"; then qt_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi
+ done
+fi
+for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do
+ if test -e "$a"; then
+ LIBQT="$LIBQT ${kde_int_qt}_incremental"
+ break
+ fi
+done
+
+ac_qt_libraries="$qt_libdir"
+
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+
+ac_cxxflags_safe="$CXXFLAGS"
+ac_ldflags_safe="$LDFLAGS"
+ac_libs_safe="$LIBS"
+
+CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes"
+LDFLAGS="$LDFLAGS -L$qt_libdir $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS"
+LIBS="$LIBS $LIBQT $KDE_MT_LIBS"
+
+KDE_PRINT_QT_PROGRAM
+
+if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ rm -f conftest*
+else
+ echo "configure: failed program was:" >&AC_FD_CC
+ cat conftest.$ac_ext >&AC_FD_CC
+ ac_qt_libraries="NO"
+fi
+rm -f conftest*
+CXXFLAGS="$ac_cxxflags_safe"
+LDFLAGS="$ac_ldflags_safe"
+LIBS="$ac_libs_safe"
+
+AC_LANG_RESTORE
+if test "$ac_qt_includes" = NO || test "$ac_qt_libraries" = NO; then
+ ac_cv_have_qt="have_qt=no"
+ ac_qt_notfound=""
+ missing_qt_mt=""
+ if test "$ac_qt_includes" = NO; then
+ if test "$ac_qt_libraries" = NO; then
+ ac_qt_notfound="(headers and libraries)";
+ else
+ ac_qt_notfound="(headers)";
+ fi
+ else
+ if test "x$kde_use_qt_mt" = "xyes"; then
+ missing_qt_mt="
+Make sure that you have compiled Qt with thread support!"
+ ac_qt_notfound="(library $qtlib-mt)";
+ else
+ ac_qt_notfound="(library $qtlib)";
+ fi
+ fi
+
+ AC_MSG_ERROR([Qt ($kde_qt_minversion) $ac_qt_notfound not found. Please check your installation!
+For more details about this problem, look at the end of config.log.$missing_qt_mt])
+else
+ have_qt="yes"
+fi
+])
+
+eval "$ac_cv_have_qt"
+
+if test "$have_qt" != yes; then
+ AC_MSG_RESULT([$have_qt]);
+else
+ ac_cv_have_qt="have_qt=yes \
+ ac_qt_includes=$ac_qt_includes ac_qt_libraries=$ac_qt_libraries"
+ AC_MSG_RESULT([libraries $ac_qt_libraries, headers $ac_qt_includes $USING_QT_MT])
+
+ qt_libraries="$ac_qt_libraries"
+ qt_includes="$ac_qt_includes"
+fi
+
+if test ! "$kde_qt_libs_given" = "yes" && test ! "$kde_qtver" = 3; then
+ KDE_CHECK_QT_DIRECT(qt_libraries= ,[])
+fi
+
+AC_SUBST(qt_libraries)
+AC_SUBST(qt_includes)
+
+if test "$qt_includes" = "$x_includes" || test -z "$qt_includes"; then
+ QT_INCLUDES=""
+else
+ QT_INCLUDES="-I$qt_includes"
+ all_includes="$QT_INCLUDES $all_includes"
+fi
+
+if test "$qt_libraries" = "$x_libraries" || test -z "$qt_libraries"; then
+ QT_LDFLAGS=""
+else
+ QT_LDFLAGS="-L$qt_libraries"
+ all_libraries="$QT_LDFLAGS $all_libraries"
+fi
+test -z "$KDE_MT_LDFLAGS" || all_libraries="$all_libraries $KDE_MT_LDFLAGS"
+
+AC_SUBST(QT_INCLUDES)
+AC_SUBST(QT_LDFLAGS)
+AC_PATH_QT_MOC_UIC
+
+KDE_CHECK_QT_JPEG
+
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG) -lXext $(LIB_X11) $(LIBSM)'
+else
+LIB_QT="$kde_int_qt $LIBJPEG_QT "'$(LIBZ) $(LIBPNG)'
+fi
+test -z "$KDE_MT_LIBS" || LIB_QT="$LIB_QT $KDE_MT_LIBS"
+for a in $qt_libdir/lib`echo ${kde_int_qt} | sed 's,^-l,,'`_incremental.*; do
+ if test -e "$a"; then
+ LIB_QT="$LIB_QT ${kde_int_qt}_incremental"
+ break
+ fi
+done
+
+AC_SUBST(LIB_QT)
+AC_SUBST(LIB_QPE)
+
+AC_SUBST(kde_qtver)
+])
+
+AC_DEFUN([AC_PATH_QT],
+[
+AC_PATH_QT_1_3
+])
+
+AC_DEFUN([KDE_CHECK_UIC_PLUGINS],
+[
+AC_REQUIRE([AC_PATH_QT_MOC_UIC])
+
+if test x$ac_uic_supports_libpath = xyes; then
+
+AC_MSG_CHECKING([if UIC has KDE plugins available])
+AC_CACHE_VAL(kde_cv_uic_plugins,
+[
+cat > actest.ui << EOF
+<!DOCTYPE UI><UI version="3.0" stdsetdef="1">
+<class>NewConnectionDialog</class>
+<widget class="QDialog">
+ <widget class="KLineEdit">
+ <property name="name">
+ <cstring>testInput</cstring>
+ </property>
+ </widget>
+</widget>
+</UI>
+EOF
+
+
+
+kde_cv_uic_plugins=no
+kde_line="$UIC_PATH -L $kde_widgetdir"
+if test x$ac_uic_supports_nounload = xyes; then
+ kde_line="$kde_line -nounload"
+fi
+kde_line="$kde_line -impl actest.h actest.ui > actest.cpp"
+if AC_TRY_EVAL(kde_line); then
+ # if you're trying to debug this check and think it's incorrect,
+ # better check your installation. The check _is_ correct - your
+ # installation is not.
+ if test -f actest.cpp && grep klineedit actest.cpp > /dev/null; then
+ kde_cv_uic_plugins=yes
+ fi
+fi
+rm -f actest.ui actest.cpp
+])
+
+AC_MSG_RESULT([$kde_cv_uic_plugins])
+if test "$kde_cv_uic_plugins" != yes; then
+ AC_MSG_ERROR([
+you need to install kdelibs first.
+
+If you did install kdelibs, then the Qt version that is picked up by
+this configure is not the same version you used to compile kdelibs.
+The Qt Plugin installed by kdelibs is *ONLY* loadable if it is the
+_same Qt version_, compiled with the _same compiler_ and the same Qt
+configuration settings.
+])
+fi
+fi
+])
+
+AC_DEFUN([KDE_CHECK_FINAL],
+[
+ AC_ARG_ENABLE(final,
+ AC_HELP_STRING([--enable-final],
+ [build size optimized apps (experimental - needs lots of memory)]),
+ kde_use_final=$enableval, kde_use_final=no)
+
+ if test "x$kde_use_final" = "xyes"; then
+ KDE_USE_FINAL_TRUE=""
+ KDE_USE_FINAL_FALSE="#"
+ else
+ KDE_USE_FINAL_TRUE="#"
+ KDE_USE_FINAL_FALSE=""
+ fi
+ AC_SUBST(KDE_USE_FINAL_TRUE)
+ AC_SUBST(KDE_USE_FINAL_FALSE)
+])
+
+AC_DEFUN([KDE_CHECK_CLOSURE],
+[
+ AC_ARG_ENABLE(closure,
+ AC_HELP_STRING([--enable-closure],[delay template instantiation]),
+ kde_use_closure=$enableval, kde_use_closure=no)
+
+ KDE_NO_UNDEFINED=""
+ if test "x$kde_use_closure" = "xyes"; then
+ KDE_USE_CLOSURE_TRUE=""
+ KDE_USE_CLOSURE_FALSE="#"
+# CXXFLAGS="$CXXFLAGS $REPO"
+ else
+ KDE_USE_CLOSURE_TRUE="#"
+ KDE_USE_CLOSURE_FALSE=""
+ KDE_NO_UNDEFINED=""
+ fi
+ AC_SUBST(KDE_USE_CLOSURE_TRUE)
+ AC_SUBST(KDE_USE_CLOSURE_FALSE)
+ AC_SUBST(KDE_NO_UNDEFINED)
+])
+
+dnl Check if the linker supports --enable-new-dtags and --as-needed
+AC_DEFUN([KDE_CHECK_NEW_LDFLAGS],
+[
+ AC_ARG_ENABLE(new_ldflags,
+ AC_HELP_STRING([--enable-new-ldflags],
+ [enable the new linker flags]),
+ kde_use_new_ldflags=$enableval,
+ kde_use_new_ldflags=no)
+
+ LDFLAGS_AS_NEEDED=""
+ LDFLAGS_NEW_DTAGS=""
+ if test "x$kde_use_new_ldflags" = "xyes"; then
+ LDFLAGS_NEW_DTAGS=""
+ KDE_CHECK_COMPILER_FLAG([Wl,--enable-new-dtags],
+ [LDFLAGS_NEW_DTAGS="-Wl,--enable-new-dtags"],)
+
+ KDE_CHECK_COMPILER_FLAG([Wl,--as-needed],
+ [LDFLAGS_AS_NEEDED="-Wl,--as-needed"],)
+ fi
+ AC_SUBST(LDFLAGS_AS_NEEDED)
+ AC_SUBST(LDFLAGS_NEW_DTAGS)
+])
+
+AC_DEFUN([KDE_CHECK_NMCHECK],
+[
+ AC_ARG_ENABLE(nmcheck,AC_HELP_STRING([--enable-nmcheck],[enable automatic namespace cleanness check]),
+ kde_use_nmcheck=$enableval, kde_use_nmcheck=no)
+
+ if test "$kde_use_nmcheck" = "yes"; then
+ KDE_USE_NMCHECK_TRUE=""
+ KDE_USE_NMCHECK_FALSE="#"
+ else
+ KDE_USE_NMCHECK_TRUE="#"
+ KDE_USE_NMCHECK_FALSE=""
+ fi
+ AC_SUBST(KDE_USE_NMCHECK_TRUE)
+ AC_SUBST(KDE_USE_NMCHECK_FALSE)
+])
+
+AC_DEFUN([KDE_EXPAND_MAKEVAR], [
+savex=$exec_prefix
+test "x$exec_prefix" = xNONE && exec_prefix=$prefix
+tmp=$$2
+while $1=`eval echo "$tmp"`; test "x$$1" != "x$tmp"; do tmp=$$1; done
+exec_prefix=$savex
+])
+
+dnl ------------------------------------------------------------------------
+dnl Now, the same with KDE
+dnl $(KDE_LDFLAGS) will be the kdeliblocation (if needed)
+dnl and $(kde_includes) will be the kdehdrlocation (if needed)
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_BASE_PATH_KDE],
+[
+AC_REQUIRE([KDE_CHECK_STL])
+AC_REQUIRE([AC_PATH_QT])dnl
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+AC_CHECK_RPATH
+AC_MSG_CHECKING([for KDE])
+
+if test "${prefix}" != NONE; then
+ kde_includes=${includedir}
+ KDE_EXPAND_MAKEVAR(ac_kde_includes, includedir)
+
+ kde_libraries=${libdir}
+ KDE_EXPAND_MAKEVAR(ac_kde_libraries, libdir)
+
+else
+ ac_kde_includes=
+ ac_kde_libraries=
+ kde_libraries=""
+ kde_includes=""
+fi
+
+AC_CACHE_VAL(ac_cv_have_kde,
+[#try to guess kde locations
+
+if test "$kde_qtver" = 1; then
+ kde_check_header="ksock.h"
+ kde_check_lib="libkdecore.la"
+else
+ kde_check_header="ksharedptr.h"
+ kde_check_lib="libkio.la"
+fi
+
+if test -z "$1"; then
+
+kde_incdirs="$kde_libs_prefix/include /usr/lib/kde/include /usr/local/kde/include /usr/local/include /usr/kde/include /usr/include/kde /usr/include /opt/kde3/include /opt/kde/include $x_includes $qt_includes"
+test -n "$KDEDIR" && kde_incdirs="$KDEDIR/include $KDEDIR/include/kde $KDEDIR $kde_incdirs"
+kde_incdirs="$ac_kde_includes $kde_incdirs"
+AC_FIND_FILE($kde_check_header, $kde_incdirs, kde_incdir)
+ac_kde_includes="$kde_incdir"
+
+if test -n "$ac_kde_includes" && test ! -r "$ac_kde_includes/$kde_check_header"; then
+ AC_MSG_ERROR([
+in the prefix, you've chosen, are no KDE headers installed. This will fail.
+So, check this please and use another prefix!])
+fi
+
+kde_libdirs="$kde_libs_prefix/lib${kdelibsuff} /usr/lib/kde/lib${kdelibsuff} /usr/local/kde/lib${kdelibsuff} /usr/kde/lib${kdelibsuff} /usr/lib${kdelibsuff}/kde /usr/lib${kdelibsuff}/kde3 /usr/lib${kdelibsuff} /usr/X11R6/lib${kdelibsuff} /usr/local/lib${kdelibsuff} /opt/kde3/lib${kdelibsuff} /opt/kde/lib${kdelibsuff} /usr/X11R6/kde/lib${kdelibsuff}"
+test -n "$KDEDIR" && kde_libdirs="$KDEDIR/lib${kdelibsuff} $KDEDIR $kde_libdirs"
+kde_libdirs="$ac_kde_libraries $libdir $kde_libdirs"
+AC_FIND_FILE($kde_check_lib, $kde_libdirs, kde_libdir)
+ac_kde_libraries="$kde_libdir"
+
+kde_widgetdir=NO
+dnl this might be somewhere else
+AC_FIND_FILE("kde3/plugins/designer/kdewidgets.la", $kde_libdirs, kde_widgetdir)
+
+if test -n "$ac_kde_libraries" && test ! -r "$ac_kde_libraries/$kde_check_lib"; then
+AC_MSG_ERROR([
+in the prefix, you've chosen, are no KDE libraries installed. This will fail.
+So, check this please and use another prefix!])
+fi
+
+if test -n "$kde_widgetdir" && test ! -r "$kde_widgetdir/kde3/plugins/designer/kdewidgets.la"; then
+AC_MSG_ERROR([
+I can't find the designer plugins. These are required and should have been installed
+by kdelibs])
+fi
+
+if test -n "$kde_widgetdir"; then
+ kde_widgetdir="$kde_widgetdir/kde3/plugins/designer"
+fi
+
+
+if test "$ac_kde_includes" = NO || test "$ac_kde_libraries" = NO || test "$kde_widgetdir" = NO; then
+ ac_cv_have_kde="have_kde=no"
+else
+ ac_cv_have_kde="have_kde=yes \
+ ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries"
+fi
+
+else dnl test -z $1, e.g. from kdelibs
+
+ ac_cv_have_kde="have_kde=no"
+
+fi
+])dnl
+
+eval "$ac_cv_have_kde"
+
+if test "$have_kde" != "yes"; then
+ if test "${prefix}" = NONE; then
+ ac_kde_prefix="$ac_default_prefix"
+ else
+ ac_kde_prefix="$prefix"
+ fi
+ if test "$exec_prefix" = NONE; then
+ ac_kde_exec_prefix="$ac_kde_prefix"
+ AC_MSG_RESULT([will be installed in $ac_kde_prefix])
+ else
+ ac_kde_exec_prefix="$exec_prefix"
+ AC_MSG_RESULT([will be installed in $ac_kde_prefix and $ac_kde_exec_prefix])
+ fi
+
+ kde_libraries="${libdir}"
+ kde_includes="${includedir}"
+
+else
+ ac_cv_have_kde="have_kde=yes \
+ ac_kde_includes=$ac_kde_includes ac_kde_libraries=$ac_kde_libraries"
+ AC_MSG_RESULT([libraries $ac_kde_libraries, headers $ac_kde_includes])
+
+ kde_libraries="$ac_kde_libraries"
+ kde_includes="$ac_kde_includes"
+fi
+AC_SUBST(kde_libraries)
+AC_SUBST(kde_includes)
+
+if test "$kde_includes" = "$x_includes" || test "$kde_includes" = "$qt_includes" || test "$kde_includes" = "/usr/include"; then
+ KDE_INCLUDES=""
+else
+ KDE_INCLUDES="-I$kde_includes"
+ all_includes="$KDE_INCLUDES $all_includes"
+fi
+
+KDE_DEFAULT_CXXFLAGS="-DQT_CLEAN_NAMESPACE -DQT_NO_ASCII_CAST -DQT_NO_STL -DQT_NO_COMPAT -DQT_NO_TRANSLATION"
+
+KDE_LDFLAGS="-L$kde_libraries"
+if test ! "$kde_libraries" = "$x_libraries" && test ! "$kde_libraries" = "$qt_libraries" ; then
+ all_libraries="$KDE_LDFLAGS $all_libraries"
+fi
+
+AC_SUBST(KDE_LDFLAGS)
+AC_SUBST(KDE_INCLUDES)
+
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+
+all_libraries="$all_libraries $USER_LDFLAGS"
+all_includes="$all_includes $USER_INCLUDES"
+AC_SUBST(all_includes)
+AC_SUBST(all_libraries)
+
+if test -z "$1"; then
+KDE_CHECK_UIC_PLUGINS
+fi
+
+ac_kde_libraries="$kde_libdir"
+
+AC_SUBST(AUTODIRS)
+
+
+])
+
+AC_DEFUN([KDE_CHECK_EXTRA_LIBS],
+[
+AC_MSG_CHECKING(for extra includes)
+AC_ARG_WITH(extra-includes,AC_HELP_STRING([--with-extra-includes=DIR],[adds non standard include paths]),
+ kde_use_extra_includes="$withval",
+ kde_use_extra_includes=NONE
+)
+kde_extra_includes=
+if test -n "$kde_use_extra_includes" && \
+ test "$kde_use_extra_includes" != "NONE"; then
+
+ ac_save_ifs=$IFS
+ IFS=':'
+ for dir in $kde_use_extra_includes; do
+ kde_extra_includes="$kde_extra_includes $dir"
+ USER_INCLUDES="$USER_INCLUDES -I$dir"
+ done
+ IFS=$ac_save_ifs
+ kde_use_extra_includes="added"
+else
+ kde_use_extra_includes="no"
+fi
+AC_SUBST(USER_INCLUDES)
+
+AC_MSG_RESULT($kde_use_extra_includes)
+
+kde_extra_libs=
+AC_MSG_CHECKING(for extra libs)
+AC_ARG_WITH(extra-libs,AC_HELP_STRING([--with-extra-libs=DIR],[adds non standard library paths]),
+ kde_use_extra_libs=$withval,
+ kde_use_extra_libs=NONE
+)
+if test -n "$kde_use_extra_libs" && \
+ test "$kde_use_extra_libs" != "NONE"; then
+
+ ac_save_ifs=$IFS
+ IFS=':'
+ for dir in $kde_use_extra_libs; do
+ kde_extra_libs="$kde_extra_libs $dir"
+ KDE_EXTRA_RPATH="$KDE_EXTRA_RPATH -R $dir"
+ USER_LDFLAGS="$USER_LDFLAGS -L$dir"
+ done
+ IFS=$ac_save_ifs
+ kde_use_extra_libs="added"
+else
+ kde_use_extra_libs="no"
+fi
+
+AC_SUBST(USER_LDFLAGS)
+
+AC_MSG_RESULT($kde_use_extra_libs)
+
+])
+
+AC_DEFUN([KDE_1_CHECK_PATH_HEADERS],
+[
+ AC_MSG_CHECKING([for KDE headers installed])
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+cat > conftest.$ac_ext <<EOF
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+#endif
+#include <stdio.h>
+#include "confdefs.h"
+#include <kapp.h>
+
+int main() {
+ printf("kde_htmldir=\\"%s\\"\n", KApplication::kde_htmldir().data());
+ printf("kde_appsdir=\\"%s\\"\n", KApplication::kde_appsdir().data());
+ printf("kde_icondir=\\"%s\\"\n", KApplication::kde_icondir().data());
+ printf("kde_sounddir=\\"%s\\"\n", KApplication::kde_sounddir().data());
+ printf("kde_datadir=\\"%s\\"\n", KApplication::kde_datadir().data());
+ printf("kde_locale=\\"%s\\"\n", KApplication::kde_localedir().data());
+ printf("kde_cgidir=\\"%s\\"\n", KApplication::kde_cgidir().data());
+ printf("kde_confdir=\\"%s\\"\n", KApplication::kde_configdir().data());
+ printf("kde_mimedir=\\"%s\\"\n", KApplication::kde_mimedir().data());
+ printf("kde_toolbardir=\\"%s\\"\n", KApplication::kde_toolbardir().data());
+ printf("kde_wallpaperdir=\\"%s\\"\n",
+ KApplication::kde_wallpaperdir().data());
+ printf("kde_bindir=\\"%s\\"\n", KApplication::kde_bindir().data());
+ printf("kde_partsdir=\\"%s\\"\n", KApplication::kde_partsdir().data());
+ printf("kde_servicesdir=\\"/tmp/dummy\\"\n");
+ printf("kde_servicetypesdir=\\"/tmp/dummy\\"\n");
+ printf("kde_moduledir=\\"/tmp/dummy\\"\n");
+ printf("kde_styledir=\\"/tmp/dummy\\"\n");
+ printf("kde_widgetdir=\\"/tmp/dummy\\"\n");
+ printf("xdg_appsdir=\\"/tmp/dummy\\"\n");
+ printf("xdg_menudir=\\"/tmp/dummy\\"\n");
+ printf("xdg_directorydir=\\"/tmp/dummy\\"\n");
+ printf("kde_kcfgdir=\\"/tmp/dummy\\"\n");
+ return 0;
+ }
+EOF
+
+ ac_save_CPPFLAGS=$CPPFLAGS
+ CPPFLAGS="$all_includes $CPPFLAGS"
+ if AC_TRY_EVAL(ac_compile); then
+ AC_MSG_RESULT(yes)
+ else
+ AC_MSG_ERROR([your system is not able to compile a small KDE application!
+Check, if you installed the KDE header files correctly.
+For more details about this problem, look at the end of config.log.])
+ fi
+ CPPFLAGS=$ac_save_CPPFLAGS
+
+ AC_LANG_RESTORE
+])
+
+AC_DEFUN([KDE_CHECK_KDEQTADDON],
+[
+AC_MSG_CHECKING(for kde-qt-addon)
+AC_CACHE_VAL(kde_cv_have_kdeqtaddon,
+[
+ kde_ldflags_safe="$LDFLAGS"
+ kde_libs_safe="$LIBS"
+ kde_cxxflags_safe="$CXXFLAGS"
+
+ LIBS="-lkde-qt-addon $LIBQT $LIBS"
+ CXXFLAGS="$CXXFLAGS -I$prefix/include -I$prefix/include/kde $all_includes"
+ LDFLAGS="$LDFLAGS $all_libraries $USER_LDFLAGS"
+
+ AC_TRY_LINK([
+ #include <qdom.h>
+ ],
+ [
+ QDomDocument doc;
+ ],
+ kde_cv_have_kdeqtaddon=yes,
+ kde_cv_have_kdeqtaddon=no
+ )
+
+ LDFLAGS=$kde_ldflags_safe
+ LIBS=$kde_libs_safe
+ CXXFLAGS=$kde_cxxflags_safe
+])
+
+AC_MSG_RESULT($kde_cv_have_kdeqtaddon)
+
+if test "$kde_cv_have_kdeqtaddon" = "no"; then
+ AC_MSG_ERROR([Can't find libkde-qt-addon. You need to install it first.
+It is a separate package (and CVS module) named kde-qt-addon.])
+fi
+])
+
+AC_DEFUN([KDE_CREATE_LIBS_ALIASES],
+[
+ AC_REQUIRE([KDE_MISC_TESTS])
+ AC_REQUIRE([KDE_CHECK_LIBDL])
+ AC_REQUIRE([K_PATH_X])
+
+if test $kde_qtver = 3; then
+ case $host in
+ *cygwin*) lib_kded="-lkdeinit_kded" ;;
+ *) lib_kded="" ;;
+ esac
+ AC_SUBST(LIB_KDED, $lib_kded)
+ AC_SUBST(LIB_KDECORE, "-lkdecore")
+ AC_SUBST(LIB_KDEUI, "-lkdeui")
+ AC_SUBST(LIB_KIO, "-lkio")
+ AC_SUBST(LIB_KJS, "-lkjs")
+ AC_SUBST(LIB_SMB, "-lsmb")
+ AC_SUBST(LIB_KAB, "-lkab")
+ AC_SUBST(LIB_KABC, "-lkabc")
+ AC_SUBST(LIB_KHTML, "-lkhtml")
+ AC_SUBST(LIB_KSPELL, "-lkspell")
+ AC_SUBST(LIB_KPARTS, "-lkparts")
+ AC_SUBST(LIB_KDEPRINT, "-lkdeprint")
+ AC_SUBST(LIB_KUTILS, "-lkutils")
+ AC_SUBST(LIB_KDEPIM, "-lkdepim")
+ AC_SUBST(LIB_KIMPROXY, "-lkimproxy")
+ AC_SUBST(LIB_KNEWSTUFF, "-lknewstuff")
+ AC_SUBST(LIB_KDNSSD, "-lkdnssd")
+ AC_SUBST(LIB_KUNITTEST, "-lkunittest")
+# these are for backward compatibility
+ AC_SUBST(LIB_KSYCOCA, "-lkio")
+ AC_SUBST(LIB_KFILE, "-lkio")
+elif test $kde_qtver = 2; then
+ AC_SUBST(LIB_KDECORE, "-lkdecore")
+ AC_SUBST(LIB_KDEUI, "-lkdeui")
+ AC_SUBST(LIB_KIO, "-lkio")
+ AC_SUBST(LIB_KSYCOCA, "-lksycoca")
+ AC_SUBST(LIB_SMB, "-lsmb")
+ AC_SUBST(LIB_KFILE, "-lkfile")
+ AC_SUBST(LIB_KAB, "-lkab")
+ AC_SUBST(LIB_KHTML, "-lkhtml")
+ AC_SUBST(LIB_KSPELL, "-lkspell")
+ AC_SUBST(LIB_KPARTS, "-lkparts")
+ AC_SUBST(LIB_KDEPRINT, "-lkdeprint")
+else
+ AC_SUBST(LIB_KDECORE, "-lkdecore -lXext $(LIB_QT)")
+ AC_SUBST(LIB_KDEUI, "-lkdeui $(LIB_KDECORE)")
+ AC_SUBST(LIB_KFM, "-lkfm $(LIB_KDECORE)")
+ AC_SUBST(LIB_KFILE, "-lkfile $(LIB_KFM) $(LIB_KDEUI)")
+ AC_SUBST(LIB_KAB, "-lkab $(LIB_KIMGIO) $(LIB_KDECORE)")
+fi
+])
+
+AC_DEFUN([AC_PATH_KDE],
+[
+ AC_BASE_PATH_KDE
+ AC_ARG_ENABLE(path-check,AC_HELP_STRING([--disable-path-check],[don't try to find out, where to install]),
+ [
+ if test "$enableval" = "no";
+ then ac_use_path_checking="default"
+ else ac_use_path_checking=""
+ fi
+ ],
+ [
+ if test "$kde_qtver" = 1;
+ then ac_use_path_checking=""
+ else ac_use_path_checking="default"
+ fi
+ ]
+ )
+
+ AC_CREATE_KFSSTND($ac_use_path_checking)
+
+ AC_SUBST_KFSSTND
+ KDE_CREATE_LIBS_ALIASES
+])
+
+dnl KDE_CHECK_FUNC_EXT(<func>, [headers], [sample-use], [C prototype], [autoheader define], [call if found])
+AC_DEFUN([KDE_CHECK_FUNC_EXT],
+[
+AC_MSG_CHECKING(for $1)
+AC_CACHE_VAL(kde_cv_func_$1,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+save_CXXFLAGS="$CXXFLAGS"
+kde_safe_LIBS="$LIBS"
+LIBS="$LIBS $X_EXTRA_LIBS"
+AC_TRY_COMPILE([
+$2
+],
+[
+$3
+],
+kde_cv_func_$1=yes,
+kde_cv_func_$1=no)
+CXXFLAGS="$save_CXXFLAGS"
+LIBS="$kde_safe_LIBS"
+AC_LANG_RESTORE
+])
+
+AC_MSG_RESULT($kde_cv_func_$1)
+
+AC_MSG_CHECKING([if $1 needs custom prototype])
+AC_CACHE_VAL(kde_cv_proto_$1,
+[
+if test "x$kde_cv_func_$1" = xyes; then
+ kde_cv_proto_$1=no
+else
+ case "$1" in
+ setenv|unsetenv|usleep|random|srandom|seteuid|mkstemps|mkstemp|revoke|vsnprintf|strlcpy|strlcat)
+ kde_cv_proto_$1="yes - in libkdefakes"
+ ;;
+ *)
+ kde_cv_proto_$1=unknown
+ ;;
+ esac
+fi
+
+if test "x$kde_cv_proto_$1" = xunknown; then
+
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+ kde_safe_libs=$LIBS
+ LIBS="$LIBS $X_EXTRA_LIBS"
+ AC_TRY_LINK([
+$2
+
+extern "C" $4;
+],
+[
+$3
+],
+[ kde_cv_func_$1=yes
+ kde_cv_proto_$1=yes ],
+ [kde_cv_proto_$1="$1 unavailable"]
+)
+LIBS=$kde_safe_libs
+AC_LANG_RESTORE
+fi
+])
+AC_MSG_RESULT($kde_cv_proto_$1)
+
+if test "x$kde_cv_func_$1" = xyes; then
+ AC_DEFINE(HAVE_$5, 1, [Define if you have $1])
+ $6
+fi
+if test "x$kde_cv_proto_$1" = xno; then
+ AC_DEFINE(HAVE_$5_PROTO, 1,
+ [Define if you have the $1 prototype])
+fi
+
+AH_VERBATIM([_HAVE_$5_PROTO],
+[
+#if !defined(HAVE_$5_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+$4;
+#ifdef __cplusplus
+}
+#endif
+#endif
+])
+])
+
+AC_DEFUN([AC_CHECK_SETENV],
+[
+ KDE_CHECK_FUNC_EXT(setenv, [
+#include <stdlib.h>
+],
+ [setenv("VAR", "VALUE", 1);],
+ [int setenv (const char *, const char *, int)],
+ [SETENV])
+])
+
+AC_DEFUN([AC_CHECK_UNSETENV],
+[
+ KDE_CHECK_FUNC_EXT(unsetenv, [
+#include <stdlib.h>
+],
+ [unsetenv("VAR");],
+ [void unsetenv (const char *)],
+ [UNSETENV])
+])
+
+AC_DEFUN([AC_CHECK_GETDOMAINNAME],
+[
+ KDE_CHECK_FUNC_EXT(getdomainname, [
+#include <stdlib.h>
+#include <unistd.h>
+#include <netdb.h>
+],
+ [
+char buffer[200];
+getdomainname(buffer, 200);
+],
+ [#include <sys/types.h>
+ int getdomainname (char *, size_t)],
+ [GETDOMAINNAME])
+])
+
+AC_DEFUN([AC_CHECK_GETHOSTNAME],
+[
+ KDE_CHECK_FUNC_EXT(gethostname, [
+#include <stdlib.h>
+#include <unistd.h>
+],
+ [
+char buffer[200];
+gethostname(buffer, 200);
+],
+ [int gethostname (char *, unsigned int)],
+ [GETHOSTNAME])
+])
+
+AC_DEFUN([AC_CHECK_USLEEP],
+[
+ KDE_CHECK_FUNC_EXT(usleep, [
+#include <unistd.h>
+],
+ [
+usleep(200);
+],
+ [int usleep (unsigned int)],
+ [USLEEP])
+])
+
+
+AC_DEFUN([AC_CHECK_RANDOM],
+[
+ KDE_CHECK_FUNC_EXT(random, [
+#include <stdlib.h>
+],
+ [
+random();
+],
+ [long int random(void)],
+ [RANDOM])
+
+ KDE_CHECK_FUNC_EXT(srandom, [
+#include <stdlib.h>
+],
+ [
+srandom(27);
+],
+ [void srandom(unsigned int)],
+ [SRANDOM])
+
+])
+
+AC_DEFUN([AC_CHECK_INITGROUPS],
+[
+ KDE_CHECK_FUNC_EXT(initgroups, [
+#include <sys/types.h>
+#include <unistd.h>
+#include <grp.h>
+],
+ [
+char buffer[200];
+initgroups(buffer, 27);
+],
+ [int initgroups(const char *, gid_t)],
+ [INITGROUPS])
+])
+
+AC_DEFUN([AC_CHECK_MKSTEMPS],
+[
+ KDE_CHECK_FUNC_EXT(mkstemps, [
+#include <stdlib.h>
+#include <unistd.h>
+],
+ [
+mkstemps("/tmp/aaaXXXXXX", 6);
+],
+ [int mkstemps(char *, int)],
+ [MKSTEMPS])
+])
+
+AC_DEFUN([AC_CHECK_MKSTEMP],
+[
+ KDE_CHECK_FUNC_EXT(mkstemp, [
+#include <stdlib.h>
+#include <unistd.h>
+],
+ [
+mkstemp("/tmp/aaaXXXXXX");
+],
+ [int mkstemp(char *)],
+ [MKSTEMP])
+])
+
+AC_DEFUN([AC_CHECK_MKDTEMP],
+[
+ KDE_CHECK_FUNC_EXT(mkdtemp, [
+#include <stdlib.h>
+#include <unistd.h>
+],
+ [
+mkdtemp("/tmp/aaaXXXXXX");
+],
+ [char *mkdtemp(char *)],
+ [MKDTEMP])
+])
+
+
+AC_DEFUN([AC_CHECK_RES_INIT],
+[
+ AC_MSG_CHECKING([if res_init needs -lresolv])
+ kde_libs_safe="$LIBS"
+ LIBS="$LIBS $X_EXTRA_LIBS -lresolv"
+ AC_TRY_LINK(
+ [
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+ ],
+ [
+ res_init();
+ ],
+ [
+ LIBRESOLV="-lresolv"
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_RES_INIT, 1, [Define if you have the res_init function])
+ ],
+ [ AC_MSG_RESULT(no) ]
+ )
+ LIBS=$kde_libs_safe
+ AC_SUBST(LIBRESOLV)
+
+ KDE_CHECK_FUNC_EXT(res_init,
+ [
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+ ],
+ [res_init()],
+ [int res_init(void)],
+ [RES_INIT])
+])
+
+AC_DEFUN([AC_CHECK_STRLCPY],
+[
+ KDE_CHECK_FUNC_EXT(strlcpy, [
+#include <string.h>
+],
+[ char buf[20];
+ strlcpy(buf, "KDE function test", sizeof(buf));
+],
+ [unsigned long strlcpy(char*, const char*, unsigned long)],
+ [STRLCPY])
+])
+
+AC_DEFUN([AC_CHECK_STRLCAT],
+[
+ KDE_CHECK_FUNC_EXT(strlcat, [
+#include <string.h>
+],
+[ char buf[20];
+ buf[0]='\0';
+ strlcat(buf, "KDE function test", sizeof(buf));
+],
+ [unsigned long strlcat(char*, const char*, unsigned long)],
+ [STRLCAT])
+])
+
+AC_DEFUN([AC_CHECK_RES_QUERY],
+[
+ KDE_CHECK_FUNC_EXT(res_query, [
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+#include <netdb.h>
+],
+[
+res_query(NULL, 0, 0, NULL, 0);
+],
+ [int res_query(const char *, int, int, unsigned char *, int)],
+ [RES_QUERY])
+])
+
+AC_DEFUN([AC_CHECK_DN_SKIPNAME],
+[
+ KDE_CHECK_FUNC_EXT(dn_skipname, [
+#include <sys/types.h>
+#include <netinet/in.h>
+#include <arpa/nameser.h>
+#include <resolv.h>
+],
+[
+dn_skipname (NULL, NULL);
+],
+ [int dn_skipname (unsigned char *, unsigned char *)],
+ [DN_SKIPNAME])
+])
+
+
+AC_DEFUN([AC_FIND_GIF],
+ [AC_MSG_CHECKING([for giflib])
+AC_CACHE_VAL(ac_cv_lib_gif,
+[ac_save_LIBS="$LIBS"
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIBS="$all_libraries -lgif -lX11 $LIBSOCKET"
+else
+LIBS="$all_libraries -lgif"
+fi
+AC_TRY_LINK(dnl
+[
+#ifdef __cplusplus
+extern "C" {
+#endif
+int GifLastError(void);
+#ifdef __cplusplus
+}
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+],
+ [return GifLastError();],
+ eval "ac_cv_lib_gif=yes",
+ eval "ac_cv_lib_gif=no")
+LIBS="$ac_save_LIBS"
+])dnl
+if eval "test \"`echo $ac_cv_lib_gif`\" = yes"; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE_UNQUOTED(HAVE_LIBGIF, 1, [Define if you have libgif])
+else
+ AC_MSG_ERROR(You need giflib30. Please install the kdesupport package)
+fi
+])
+
+AC_DEFUN([KDE_FIND_JPEG_HELPER],
+[
+AC_MSG_CHECKING([for libjpeg$2])
+AC_CACHE_VAL(ac_cv_lib_jpeg_$1,
+[
+ac_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS -ljpeg$2 -lm"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+AC_TRY_LINK(
+[
+#ifdef __cplusplus
+extern "C" {
+#endif
+void jpeg_CreateDecompress();
+#ifdef __cplusplus
+}
+#endif
+],
+[jpeg_CreateDecompress();],
+ eval "ac_cv_lib_jpeg_$1=-ljpeg$2",
+ eval "ac_cv_lib_jpeg_$1=no")
+LIBS="$ac_save_LIBS"
+CFLAGS="$ac_save_CFLAGS"
+])
+
+if eval "test ! \"`echo $ac_cv_lib_jpeg_$1`\" = no"; then
+ LIBJPEG="$ac_cv_lib_jpeg_$1"
+ AC_MSG_RESULT($ac_cv_lib_jpeg_$1)
+else
+ AC_MSG_RESULT(no)
+ $3
+fi
+
+])
+
+AC_DEFUN([AC_FIND_JPEG],
+[
+dnl first look for libraries
+KDE_FIND_JPEG_HELPER(6b, 6b,
+ KDE_FIND_JPEG_HELPER(normal, [],
+ [
+ LIBJPEG=
+ ]
+ )
+)
+
+dnl then search the headers (can't use simply AC_TRY_xxx, as jpeglib.h
+dnl requires system dependent includes loaded before it)
+jpeg_incdirs="$includedir /usr/include /usr/local/include $kde_extra_includes"
+AC_FIND_FILE(jpeglib.h, $jpeg_incdirs, jpeg_incdir)
+test "x$jpeg_incdir" = xNO && jpeg_incdir=
+
+dnl if headers _and_ libraries are missing, this is no error, and we
+dnl continue with a warning (the user will get no jpeg support in khtml)
+dnl if only one is missing, it means a configuration error, but we still
+dnl only warn
+if test -n "$jpeg_incdir" && test -n "$LIBJPEG" ; then
+ AC_DEFINE_UNQUOTED(HAVE_LIBJPEG, 1, [Define if you have libjpeg])
+else
+ if test -n "$jpeg_incdir" || test -n "$LIBJPEG" ; then
+ AC_MSG_WARN([
+There is an installation error in jpeg support. You seem to have only one
+of either the headers _or_ the libraries installed. You may need to either
+provide correct --with-extra-... options, or the development package of
+libjpeg6b. You can get a source package of libjpeg from http://www.ijg.org/
+Disabling JPEG support.
+])
+ else
+ AC_MSG_WARN([libjpeg not found. disable JPEG support.])
+ fi
+ jpeg_incdir=
+ LIBJPEG=
+fi
+
+AC_SUBST(LIBJPEG)
+AH_VERBATIM(_AC_CHECK_JPEG,
+[/*
+ * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
+ * headers and I'm too lazy to write a configure test as long as only
+ * unixware is related
+ */
+#ifdef _UNIXWARE
+#define HAVE_BOOLEAN
+#endif
+])
+])
+
+AC_DEFUN([KDE_CHECK_QT_JPEG],
+[
+if test -n "$LIBJPEG"; then
+AC_MSG_CHECKING([if Qt needs $LIBJPEG])
+AC_CACHE_VAL(kde_cv_qt_jpeg,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+ac_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS $LIBQT"
+LIBS=`echo $LIBS | sed "s/$LIBJPEG//"`
+ac_save_CXXFLAGS="$CXXFLAGS"
+CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES"
+AC_TRY_LINK(
+[#include <qapplication.h>],
+ [
+ int argc;
+ char** argv;
+ QApplication app(argc, argv);],
+ eval "kde_cv_qt_jpeg=no",
+ eval "kde_cv_qt_jpeg=yes")
+LIBS="$ac_save_LIBS"
+CXXFLAGS="$ac_save_CXXFLAGS"
+AC_LANG_RESTORE
+fi
+])
+
+if eval "test ! \"`echo $kde_cv_qt_jpeg`\" = no"; then
+ AC_MSG_RESULT(yes)
+ LIBJPEG_QT='$(LIBJPEG)'
+else
+ AC_MSG_RESULT(no)
+ LIBJPEG_QT=
+fi
+
+])
+
+AC_DEFUN([AC_FIND_ZLIB],
+[
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+AC_MSG_CHECKING([for libz])
+AC_CACHE_VAL(ac_cv_lib_z,
+[
+kde_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS -lz $LIBSOCKET"
+kde_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+AC_TRY_LINK(dnl
+[
+#include<zlib.h>
+],
+[
+ char buf[42];
+ gzFile f = (gzFile) 0;
+ /* this would segfault.. but we only link, don't run */
+ (void) gzgets(f, buf, sizeof(buf));
+
+ return (zlibVersion() == ZLIB_VERSION);
+],
+ eval "ac_cv_lib_z='-lz'",
+ eval "ac_cv_lib_z=no")
+LIBS="$kde_save_LIBS"
+CFLAGS="$kde_save_CFLAGS"
+])dnl
+if test ! "$ac_cv_lib_z" = no; then
+ AC_DEFINE_UNQUOTED(HAVE_LIBZ, 1, [Define if you have libz])
+ LIBZ="$ac_cv_lib_z"
+ AC_MSG_RESULT($ac_cv_lib_z)
+else
+ AC_MSG_ERROR(not found.
+ Possibly configure picks up an outdated version
+ installed by XFree86. Remove it from your system.
+
+ Check your installation and look into config.log)
+ LIBZ=""
+fi
+AC_SUBST(LIBZ)
+])
+
+AC_DEFUN([KDE_TRY_TIFFLIB],
+[
+AC_MSG_CHECKING([for libtiff $1])
+
+AC_CACHE_VAL(kde_cv_libtiff_$1,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+kde_save_LIBS="$LIBS"
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lX11 $LIBSOCKET -lm"
+else
+LIBS="$all_libraries $USER_LDFLAGS -l$1 $LIBJPEG $LIBZ -lm"
+fi
+kde_save_CXXFLAGS="$CXXFLAGS"
+CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES"
+
+AC_TRY_LINK(dnl
+[
+#include<tiffio.h>
+],
+ [return (TIFFOpen( "", "r") == 0); ],
+[
+ kde_cv_libtiff_$1="-l$1 $LIBJPEG $LIBZ"
+], [
+ kde_cv_libtiff_$1=no
+])
+
+LIBS="$kde_save_LIBS"
+CXXFLAGS="$kde_save_CXXFLAGS"
+AC_LANG_RESTORE
+])
+
+if test "$kde_cv_libtiff_$1" = "no"; then
+ AC_MSG_RESULT(no)
+ LIBTIFF=""
+ $3
+else
+ LIBTIFF="$kde_cv_libtiff_$1"
+ AC_MSG_RESULT(yes)
+ AC_DEFINE_UNQUOTED(HAVE_LIBTIFF, 1, [Define if you have libtiff])
+ $2
+fi
+
+])
+
+AC_DEFUN([AC_FIND_TIFF],
+[
+AC_REQUIRE([K_PATH_X])
+AC_REQUIRE([AC_FIND_ZLIB])
+AC_REQUIRE([AC_FIND_JPEG])
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+
+KDE_TRY_TIFFLIB(tiff, [],
+ KDE_TRY_TIFFLIB(tiff34))
+
+AC_SUBST(LIBTIFF)
+])
+
+AC_DEFUN([KDE_FIND_LIBEXR],
+[
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+AC_REQUIRE([AC_FIND_ZLIB])
+AC_CACHE_VAL(ac_cv_libexr,
+[
+ if test -z "$PKG_CONFIG"; then
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+ fi
+
+ AC_MSG_CHECKING([for OpenEXR libraries])
+
+ if test "$PKG_CONFIG" = "no" ; then
+ AC_MSG_RESULT(no)
+ echo "*** The pkg-config script could not be found. Make sure it is"
+ echo "*** in your path, or set the PKG_CONFIG environment variable"
+ echo "*** to the full path to pkg-config."
+ echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
+ else
+ if !(`$PKG_CONFIG --exists OpenEXR`) ; then
+ AC_MSG_RESULT(no)
+ EXRSTATUS=no
+ else
+ if !(`$PKG_CONFIG --atleast-version="1.1.1" OpenEXR`) ; then
+ AC_MSG_RESULT(no)
+ EXRSTATUS=old
+ else
+ kde_save_LIBS="$LIBS"
+ LIBS="$LIBS $all_libraries $USER_LDFLAGS `pkg-config --libs OpenEXR` $LIBZ"
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ kde_save_CXXFLAGS="$CXXFLAGS"
+ EXR_FLAGS=`$PKG_CONFIG --cflags OpenEXR`
+ CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES $EXR_FLAGS"
+
+ AC_TRY_LINK(dnl
+ [
+ #include <ImfRgbaFile.h>
+ ],
+ [
+ using namespace Imf;
+ RgbaInputFile file ("dummy");
+ return 0;
+ ],
+ eval "ac_cv_libexr='`pkg-config --libs OpenEXR`'",
+ eval "ac_cv_libexr=no"
+ )
+ LIBS="$kde_save_LIBS"
+ CXXFLAGS="$kde_save_CXXFLAGS"
+ AC_LANG_RESTORE
+ ])dnl
+ if eval "test ! \"`echo $ac_cv_libexr`\" = no"; then
+ AC_DEFINE_UNQUOTED(HAVE_EXR, 1, [Define if you have OpenEXR])
+ LIB_EXR="$ac_cv_libexr"
+ AC_MSG_RESULT($ac_cv_libexr)
+ else
+ AC_MSG_RESULT(no)
+ LIB_EXR=""
+ fi
+ fi
+ fi
+ fi
+ AC_SUBST(LIB_EXR)
+ AC_SUBST(EXR_FLAGS)
+])
+
+
+
+AC_DEFUN([AC_FIND_PNG],
+[
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+AC_REQUIRE([AC_FIND_ZLIB])
+AC_MSG_CHECKING([for libpng])
+AC_CACHE_VAL(ac_cv_lib_png,
+[
+kde_save_LIBS="$LIBS"
+if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm -lX11 $LIBSOCKET"
+else
+LIBS="$LIBS $all_libraries $USER_LDFLAGS -lpng $LIBZ -lm"
+fi
+kde_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+
+AC_TRY_LINK(dnl
+ [
+ #include<png.h>
+ ],
+ [
+ png_structp png_ptr = png_create_read_struct( /* image ptr */
+ PNG_LIBPNG_VER_STRING, 0, 0, 0 );
+ return( png_ptr != 0 );
+ ],
+ eval "ac_cv_lib_png='-lpng $LIBZ -lm'",
+ eval "ac_cv_lib_png=no"
+)
+LIBS="$kde_save_LIBS"
+CFLAGS="$kde_save_CFLAGS"
+])dnl
+if eval "test ! \"`echo $ac_cv_lib_png`\" = no"; then
+ AC_DEFINE_UNQUOTED(HAVE_LIBPNG, 1, [Define if you have libpng])
+ LIBPNG="$ac_cv_lib_png"
+ AC_SUBST(LIBPNG)
+ AC_MSG_RESULT($ac_cv_lib_png)
+else
+ AC_MSG_RESULT(no)
+ LIBPNG=""
+ AC_SUBST(LIBPNG)
+fi
+])
+
+
+AC_DEFUN([AC_FIND_JASPER],
+[
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+AC_REQUIRE([AC_FIND_JPEG])
+AC_MSG_CHECKING([for jasper])
+AC_CACHE_VAL(ac_cv_jasper,
+[
+kde_save_LIBS="$LIBS"
+LIBS="$LIBS $all_libraries $USER_LDFLAGS -ljasper $LIBJPEG -lm"
+kde_save_CFLAGS="$CFLAGS"
+CFLAGS="$CFLAGS $all_includes $USER_INCLUDES"
+
+AC_TRY_LINK(dnl
+ [
+ #include<jasper/jasper.h>
+ ],
+ [
+ return( jas_init() );
+ ],
+ eval "ac_cv_jasper='-ljasper $LIBJPEG -lm'",
+ eval "ac_cv_jasper=no"
+)
+LIBS="$kde_save_LIBS"
+CFLAGS="$kde_save_CFLAGS"
+])dnl
+if eval "test ! \"`echo $ac_cv_jasper`\" = no"; then
+ AC_DEFINE_UNQUOTED(HAVE_JASPER, 1, [Define if you have jasper])
+ LIB_JASPER="$ac_cv_jasper"
+ AC_MSG_RESULT($ac_cv_jasper)
+else
+ AC_MSG_RESULT(no)
+ LIB_JASPER=""
+fi
+AC_SUBST(LIB_JASPER)
+])
+
+AC_DEFUN([AC_CHECK_BOOL],
+[
+ AC_DEFINE_UNQUOTED(HAVE_BOOL, 1, [You _must_ have bool])
+])
+
+AC_DEFUN([AC_CHECK_GNU_EXTENSIONS],
+[
+AC_MSG_CHECKING(if you need GNU extensions)
+AC_CACHE_VAL(ac_cv_gnu_extensions,
+[
+cat > conftest.c << EOF
+#include <features.h>
+
+#ifdef __GNU_LIBRARY__
+yes
+#endif
+EOF
+
+if (eval "$ac_cpp conftest.c") 2>&5 |
+ egrep "yes" >/dev/null 2>&1; then
+ rm -rf conftest*
+ ac_cv_gnu_extensions=yes
+else
+ ac_cv_gnu_extensions=no
+fi
+])
+
+AC_MSG_RESULT($ac_cv_gnu_extensions)
+if test "$ac_cv_gnu_extensions" = "yes"; then
+ AC_DEFINE_UNQUOTED(_GNU_SOURCE, 1, [Define if you need to use the GNU extensions])
+fi
+])
+
+AC_DEFUN([KDE_CHECK_COMPILER_FLAG],
+[
+AC_MSG_CHECKING([whether $CXX supports -$1])
+kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'`
+AC_CACHE_VAL(kde_cv_prog_cxx_$kde_cache,
+[
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS -$1"
+ AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cxx_$kde_cache=yes"], [])
+ CXXFLAGS="$save_CXXFLAGS"
+ AC_LANG_RESTORE
+])
+if eval "test \"`echo '$kde_cv_prog_cxx_'$kde_cache`\" = yes"; then
+ AC_MSG_RESULT(yes)
+ :
+ $2
+else
+ AC_MSG_RESULT(no)
+ :
+ $3
+fi
+])
+
+AC_DEFUN([KDE_CHECK_C_COMPILER_FLAG],
+[
+AC_MSG_CHECKING([whether $CC supports -$1])
+kde_cache=`echo $1 | sed 'y% .=/+-,%____p__%'`
+AC_CACHE_VAL(kde_cv_prog_cc_$kde_cache,
+[
+ AC_LANG_SAVE
+ AC_LANG_C
+ save_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -$1"
+ AC_TRY_LINK([],[ return 0; ], [eval "kde_cv_prog_cc_$kde_cache=yes"], [])
+ CFLAGS="$save_CFLAGS"
+ AC_LANG_RESTORE
+])
+if eval "test \"`echo '$kde_cv_prog_cc_'$kde_cache`\" = yes"; then
+ AC_MSG_RESULT(yes)
+ :
+ $2
+else
+ AC_MSG_RESULT(no)
+ :
+ $3
+fi
+])
+
+
+dnl AC_REMOVE_FORBIDDEN removes forbidden arguments from variables
+dnl use: AC_REMOVE_FORBIDDEN(CC, [-forbid -bad-option whatever])
+dnl it's all white-space separated
+AC_DEFUN([AC_REMOVE_FORBIDDEN],
+[ __val=$$1
+ __forbid=" $2 "
+ if test -n "$__val"; then
+ __new=""
+ ac_save_IFS=$IFS
+ IFS=" "
+ for i in $__val; do
+ case "$__forbid" in
+ *" $i "*) AC_MSG_WARN([found forbidden $i in $1, removing it]) ;;
+ *) # Careful to not add spaces, where there were none, because otherwise
+ # libtool gets confused, if we change e.g. CXX
+ if test -z "$__new" ; then __new=$i ; else __new="$__new $i" ; fi ;;
+ esac
+ done
+ IFS=$ac_save_IFS
+ $1=$__new
+ fi
+])
+
+
+AC_DEFUN([KDE_CHECK_FOR_BAD_COMPILER],
+[
+ AC_MSG_CHECKING([whether $CC is blacklisted])
+
+ dnl In theory we have tu run this test against $CC and $CXX
+ dnl in C and in C++ mode, because its perfectly legal for
+ dnl the user to mix compiler versions, since C has a defined
+ dnl ABI.
+ dnl
+ dnl For now, we assume the user is not on crack.
+
+ AC_TRY_COMPILE([
+#ifdef __GNUC__
+#if __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 0
+choke me
+#endif
+#endif
+], ,
+ kde_bad_compiler=no,
+ kde_bad_compiler=yes
+)
+
+ AC_MSG_RESULT($kde_bad_compiler)
+
+if test "$kde_bad_compiler" = "yes"; then
+ AC_MSG_ERROR([
+
+This particular compiler version is blacklisted because it
+is known to miscompile KDE. Please use a newer version, or
+if that is not yet available, choose an older version.
+
+Please do not report a bug or bother us reporting this
+configure error. We know about it, and we introduced
+it by intention to avoid untraceable bugs or crashes in KDE.
+
+])
+fi
+
+])
+
+
+AC_DEFUN([KDE_CHECK_FOR_OPT_NOINLINE_MATCH],
+[
+ AC_CACHE_CHECK([whether system headers can cope with -O2 -fno-inline],
+ kde_cv_opt_noinline_match,
+ [
+ kde_cv_opt_noinline_match=irrelevant
+ dnl if we don't use both -O2 and -fno-inline, this check is moot
+ if echo "$CFLAGS" | grep -e -O2 >/dev/null 2>/dev/null \
+ && echo "$CFLAGS" | grep -e -fno-inline >/dev/null 2>/dev/null ; then
+
+ ac_cflags_save="$CFLAGS"
+ CFLAGS="$CFLAGS -D_USE_GNU"
+
+ AC_TRY_LINK([
+ #include <string.h>
+], [ const char *pt, *et;
+ et = __extension__ ({ char __a0, __a1, __a2; (__builtin_constant_p ( ";," ) && ((size_t)(const void *)(( ";," )+ 1) - (size_t)(const void *)( ";," ) == 1) ? ((__a0 =((__const char *) ( ";," ))[0], __a0 == '\0') ? ((void) ( pt ),((void *)0) ) : ((__a1 = ((__const char *) ( ";," ))[1], __a1== '\0') ? (__extension__ (__builtin_constant_p ( __a0 ) && ( __a0 ) == '\0' ? (char *) __rawmemchr ( pt , __a0) : strchr( pt , __a0 ))) : ((__a2 = ((__const char *) ( ";," ))[2], __a2 == '\0') ? __strpbrk_c2 ( pt , __a0, __a1) :(((__const char *) ( ";," ))[3] == '\0' ? __strpbrk_c3 ( pt ,__a0, __a1, __a2): strpbrk ( pt , ";," ))))) : strpbrk ( pt , ";," )); }) ;
+],
+ kde_cv_opt_noinline_match=yes,
+ kde_cv_opt_noinline_match=no
+ )
+
+ CFLAGS="$ac_cflags_save"
+ fi
+ ])
+])
+
+
+dnl AC_VALIDIFY_CXXFLAGS checks for forbidden flags the user may have given
+AC_DEFUN([AC_VALIDIFY_CXXFLAGS],
+[dnl
+if test "x$kde_use_qt_emb" != "xyes"; then
+ AC_REMOVE_FORBIDDEN(CXX, [-fno-rtti -rpath])
+ AC_REMOVE_FORBIDDEN(CXXFLAGS, [-fno-rtti -rpath])
+else
+ AC_REMOVE_FORBIDDEN(CXX, [-rpath])
+ AC_REMOVE_FORBIDDEN(CXXFLAGS, [-rpath])
+fi
+])
+
+AC_DEFUN([AC_CHECK_COMPILERS],
+[
+ AC_ARG_ENABLE(debug,
+ AC_HELP_STRING([--enable-debug=ARG],[enables debug symbols (yes|no|full) [default=no]]),
+ [
+ case $enableval in
+ yes)
+ kde_use_debug_code="yes"
+ kde_use_debug_define=no
+ ;;
+ full)
+ kde_use_debug_code="full"
+ kde_use_debug_define=no
+ ;;
+ *)
+ kde_use_debug_code="no"
+ kde_use_debug_define=yes
+ ;;
+ esac
+ ],
+ [kde_use_debug_code="no"
+ kde_use_debug_define=no
+ ])
+
+ dnl Just for configure --help
+ AC_ARG_ENABLE(dummyoption,
+ AC_HELP_STRING([--disable-debug],
+ [disables debug output and debug symbols [default=no]]),
+ [],[])
+
+ AC_ARG_ENABLE(strict,
+ AC_HELP_STRING([--enable-strict],
+ [compiles with strict compiler options (may not work!)]),
+ [
+ if test $enableval = "no"; then
+ kde_use_strict_options="no"
+ else
+ kde_use_strict_options="yes"
+ fi
+ ], [kde_use_strict_options="no"])
+
+ AC_ARG_ENABLE(warnings,AC_HELP_STRING([--disable-warnings],[disables compilation with -Wall and similar]),
+ [
+ if test $enableval = "no"; then
+ kde_use_warnings="no"
+ else
+ kde_use_warnings="yes"
+ fi
+ ], [kde_use_warnings="yes"])
+
+ dnl enable warnings for debug build
+ if test "$kde_use_debug_code" != "no"; then
+ kde_use_warnings=yes
+ fi
+
+ AC_ARG_ENABLE(profile,AC_HELP_STRING([--enable-profile],[creates profiling infos [default=no]]),
+ [kde_use_profiling=$enableval],
+ [kde_use_profiling="no"]
+ )
+
+ dnl this prevents stupid AC_PROG_CC to add "-g" to the default CFLAGS
+ CFLAGS=" $CFLAGS"
+
+ AC_PROG_CC
+
+ AC_PROG_CPP
+
+ if test "$GCC" = "yes"; then
+ if test "$kde_use_debug_code" != "no"; then
+ if test $kde_use_debug_code = "full"; then
+ CFLAGS="-g3 -fno-inline $CFLAGS"
+ else
+ CFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CFLAGS"
+ fi
+ else
+ CFLAGS="-O2 $CFLAGS"
+ fi
+ fi
+
+ if test "$kde_use_debug_define" = "yes"; then
+ CFLAGS="-DNDEBUG $CFLAGS"
+ fi
+
+
+ case "$host" in
+ *-*-sysv4.2uw*) CFLAGS="-D_UNIXWARE $CFLAGS";;
+ *-*-sysv5uw7*) CFLAGS="-D_UNIXWARE7 $CFLAGS";;
+ esac
+
+ if test -z "$LDFLAGS" && test "$kde_use_debug_code" = "no" && test "$GCC" = "yes"; then
+ LDFLAGS=""
+ fi
+
+ CXXFLAGS=" $CXXFLAGS"
+
+ AC_PROG_CXX
+
+ KDE_CHECK_FOR_BAD_COMPILER
+
+ if test "$GXX" = "yes" || test "$CXX" = "KCC"; then
+ if test "$kde_use_debug_code" != "no"; then
+ if test "$CXX" = "KCC"; then
+ CXXFLAGS="+K0 -Wall -pedantic -W -Wpointer-arith -Wwrite-strings $CXXFLAGS"
+ else
+ if test "$kde_use_debug_code" = "full"; then
+ CXXFLAGS="-g3 -fno-inline $CXXFLAGS"
+ else
+ CXXFLAGS="-g -O2 -fno-schedule-insns -fno-inline $CXXFLAGS"
+ fi
+ fi
+ KDE_CHECK_COMPILER_FLAG(fno-builtin,[CXXFLAGS="-fno-builtin $CXXFLAGS"])
+
+ dnl convenience compiler flags
+ KDE_CHECK_COMPILER_FLAG(Woverloaded-virtual, [WOVERLOADED_VIRTUAL="-Woverloaded-virtual"], [WOVERLOADED_VRITUAL=""])
+ AC_SUBST(WOVERLOADED_VIRTUAL)
+ else
+ if test "$CXX" = "KCC"; then
+ CXXFLAGS="+K3 $CXXFLAGS"
+ else
+ CXXFLAGS="-O2 $CXXFLAGS"
+ fi
+ fi
+ fi
+
+ if test "$kde_use_debug_define" = "yes"; then
+ CXXFLAGS="-DNDEBUG -DNO_DEBUG $CXXFLAGS"
+ fi
+
+ if test "$kde_use_profiling" = "yes"; then
+ KDE_CHECK_COMPILER_FLAG(pg,
+ [
+ CFLAGS="-pg $CFLAGS"
+ CXXFLAGS="-pg $CXXFLAGS"
+ ])
+ fi
+
+ if test "$kde_use_warnings" = "yes"; then
+ if test "$GCC" = "yes"; then
+ CXXFLAGS="-Wall -W -Wpointer-arith $CXXFLAGS"
+ case $host in
+ *-*-linux-gnu)
+ CFLAGS="-std=iso9899:1990 -W -Wall -Wchar-subscripts -Wshadow -Wpointer-arith -Wmissing-prototypes -Wwrite-strings -D_XOPEN_SOURCE=500 -D_BSD_SOURCE $CFLAGS"
+ CXXFLAGS="-D_XOPEN_SOURCE=500 -D_BSD_SOURCE -Wcast-align -Wchar-subscripts $CXXFLAGS"
+ KDE_CHECK_COMPILER_FLAG(Wmissing-format-attribute, [CXXFLAGS="$CXXFLAGS -Wformat-security -Wmissing-format-attribute"])
+ KDE_CHECK_C_COMPILER_FLAG(Wmissing-format-attribute, [CFLAGS="$CFLAGS -Wformat-security -Wmissing-format-attribute"])
+ ;;
+ esac
+ KDE_CHECK_COMPILER_FLAG(Wundef,[CXXFLAGS="-Wundef $CXXFLAGS"])
+ KDE_CHECK_COMPILER_FLAG(Wno-long-long,[CXXFLAGS="-Wno-long-long $CXXFLAGS"])
+ dnl ### FIXME: revert for KDE 4
+ KDE_CHECK_COMPILER_FLAG(Wno-non-virtual-dtor,[CXXFLAGS="$CXXFLAGS -Wno-non-virtual-dtor"])
+ fi
+ fi
+
+ if test "$GXX" = "yes" && test "$kde_use_strict_options" = "yes"; then
+ CXXFLAGS="-Wcast-qual -Wshadow -Wcast-align $CXXFLAGS"
+ fi
+
+ AC_ARG_ENABLE(pch,
+ AC_HELP_STRING([--enable-pch],
+ [enables precompiled header support (currently only KCC or gcc >=3.4+unsermake) [default=no]]),
+ [ kde_use_pch=$enableval ],[ kde_use_pch=no ])
+
+ HAVE_GCC_VISIBILITY=0
+ AC_SUBST([HAVE_GCC_VISIBILITY])
+
+ if test "$GXX" = "yes"; then
+ gcc_no_reorder_blocks=NO
+ KDE_CHECK_COMPILER_FLAG(fno-reorder-blocks,[gcc_no_reorder_blocks=YES])
+ if test $kde_use_debug_code != "no" && \
+ test $kde_use_debug_code != "full" && \
+ test "YES" = "$gcc_no_reorder_blocks" ; then
+ CXXFLAGS="$CXXFLAGS -fno-reorder-blocks"
+ CFLAGS="$CFLAGS -fno-reorder-blocks"
+ fi
+ KDE_CHECK_COMPILER_FLAG(fno-exceptions,[CXXFLAGS="$CXXFLAGS -fno-exceptions"])
+ KDE_CHECK_COMPILER_FLAG(fno-check-new, [CXXFLAGS="$CXXFLAGS -fno-check-new"])
+ KDE_CHECK_COMPILER_FLAG(fno-common, [CXXFLAGS="$CXXFLAGS -fno-common"])
+ KDE_CHECK_COMPILER_FLAG(fexceptions, [USE_EXCEPTIONS="-fexceptions"], USE_EXCEPTIONS= )
+ ENABLE_PERMISSIVE_FLAG="-fpermissive"
+
+ if test "$kde_use_pch" = "yes"; then
+ AC_MSG_CHECKING(whether gcc supports precompiling c header files)
+ echo >conftest.h
+ if $CC -x c-header conftest.h >/dev/null 2>/dev/null; then
+ kde_gcc_supports_pch=yes
+ AC_MSG_RESULT(yes)
+ else
+ kde_gcc_supports_pch=no
+ AC_MSG_RESULT(no)
+ fi
+ if test "$kde_gcc_supports_pch" = "yes"; then
+ AC_MSG_CHECKING(whether gcc supports precompiling c++ header files)
+ if $CXX -x c++-header conftest.h >/dev/null 2>/dev/null; then
+ kde_gcc_supports_pch=yes
+ AC_MSG_RESULT(yes)
+ else
+ kde_gcc_supports_pch=no
+ AC_MSG_RESULT(no)
+ fi
+ fi
+ rm -f conftest.h conftest.h.gch
+ fi
+
+ KDE_CHECK_FOR_OPT_NOINLINE_MATCH
+ if test "x$kde_cv_opt_noinline_match" = "xno" ; then
+ CFLAGS="`echo "$CFLAGS" | sed "s/ -fno-inline//"`"
+ fi
+ fi
+ AM_CONDITIONAL(unsermake_enable_pch, test "$kde_use_pch" = "yes" && test "$kde_gcc_supports_pch" = "yes")
+ if test "$CXX" = "KCC"; then
+ dnl unfortunately we currently cannot disable exception support in KCC
+ dnl because doing so is binary incompatible and Qt by default links with exceptions :-(
+ dnl KDE_CHECK_COMPILER_FLAG(-no_exceptions,[CXXFLAGS="$CXXFLAGS --no_exceptions"])
+ dnl KDE_CHECK_COMPILER_FLAG(-exceptions, [USE_EXCEPTIONS="--exceptions"], USE_EXCEPTIONS= )
+
+ if test "$kde_use_pch" = "yes"; then
+ dnl TODO: support --pch-dir!
+ KDE_CHECK_COMPILER_FLAG(-pch,[CXXFLAGS="$CXXFLAGS --pch"])
+ dnl the below works (but the dir must exist), but it's
+ dnl useless for a whole package.
+ dnl The are precompiled headers for each source file, so when compiling
+ dnl from scratch, it doesn't make a difference, and they take up
+ dnl around ~5Mb _per_ sourcefile.
+ dnl KDE_CHECK_COMPILER_FLAG(-pch_dir /tmp,
+ dnl [CXXFLAGS="$CXXFLAGS --pch_dir `pwd`/pcheaders"])
+ fi
+ dnl this flag controls inlining. by default KCC inlines in optimisation mode
+ dnl all implementations that are defined inside the class {} declaration.
+ dnl because of templates-compatibility with broken gcc compilers, this
+ dnl can cause excessive inlining. This flag limits it to a sane level
+ KDE_CHECK_COMPILER_FLAG(-inline_keyword_space_time=6,[CXXFLAGS="$CXXFLAGS --inline_keyword_space_time=6"])
+ KDE_CHECK_COMPILER_FLAG(-inline_auto_space_time=2,[CXXFLAGS="$CXXFLAGS --inline_auto_space_time=2"])
+ KDE_CHECK_COMPILER_FLAG(-inline_implicit_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_implicit_space_time=2.0"])
+ KDE_CHECK_COMPILER_FLAG(-inline_generated_space_time=2.0,[CXXFLAGS="$CXXFLAGS --inline_generated_space_time=2.0"])
+ dnl Some source files are shared between multiple executables
+ dnl (or libraries) and some of those need template instantiations.
+ dnl In that case KCC needs to compile those sources with
+ dnl --one_instantiation_per_object. To make it easy for us we compile
+ dnl _all_ objects with that flag (--one_per is a shorthand).
+ KDE_CHECK_COMPILER_FLAG(-one_per, [CXXFLAGS="$CXXFLAGS --one_per"])
+ fi
+ AC_SUBST(USE_EXCEPTIONS)
+ dnl obsolete macro - provided to keep things going
+ USE_RTTI=
+ AC_SUBST(USE_RTTI)
+
+ case "$host" in
+ *-*-irix*) test "$GXX" = yes && CXXFLAGS="-D_LANGUAGE_C_PLUS_PLUS -D__LANGUAGE_C_PLUS_PLUS $CXXFLAGS" ;;
+ *-*-sysv4.2uw*) CXXFLAGS="-D_UNIXWARE $CXXFLAGS";;
+ *-*-sysv5uw7*) CXXFLAGS="-D_UNIXWARE7 $CXXFLAGS";;
+ *-*-solaris*)
+ if test "$GXX" = yes; then
+ libstdcpp=`$CXX -print-file-name=libstdc++.so`
+ if test ! -f $libstdcpp; then
+ AC_MSG_ERROR([You've compiled gcc without --enable-shared. This doesn't work with KDE. Please recompile gcc with --enable-shared to receive a libstdc++.so])
+ fi
+ fi
+ ;;
+ esac
+
+ AC_VALIDIFY_CXXFLAGS
+
+ AC_PROG_CXXCPP
+
+ if test "$GCC" = yes; then
+ NOOPT_CFLAGS=-O0
+ fi
+ KDE_CHECK_COMPILER_FLAG(O0,[NOOPT_CXXFLAGS=-O0])
+
+ AC_ARG_ENABLE(coverage,
+ AC_HELP_STRING([--enable-coverage],[use gcc coverage testing]), [
+ if test "$am_cv_CC_dependencies_compiler_type" = "gcc3"; then
+ ac_coverage_compiler="-fprofile-arcs -ftest-coverage"
+ ac_coverage_linker="-lgcc"
+ elif test "$am_cv_CC_dependencies_compiler_type" = "gcc"; then
+ ac_coverage_compiler="-fprofile-arcs -ftest-coverage"
+ ac_coverage_linker=""
+ else
+ AC_MSG_ERROR([coverage with your compiler is not supported])
+ fi
+ CFLAGS="$CFLAGS $ac_coverage_compiler"
+ CXXFLAGS="$CXXFLAGS $ac_coverage_compiler"
+ LDFLAGS="$LDFLAGS $ac_coverage_linker"
+ ])
+
+ AC_SUBST(NOOPT_CXXFLAGS)
+ AC_SUBST(NOOPT_CFLAGS)
+ AC_SUBST(ENABLE_PERMISSIVE_FLAG)
+
+ KDE_CHECK_NEW_LDFLAGS
+ KDE_CHECK_FINAL
+ KDE_CHECK_CLOSURE
+ KDE_CHECK_NMCHECK
+
+ ifdef([AM_DEPENDENCIES], AC_REQUIRE([KDE_ADD_DEPENDENCIES]), [])
+])
+
+AC_DEFUN([KDE_CHECK_VISIBILITY_GCC_BUG],
+ [
+ AC_CACHE_CHECK([for gcc -fvisibility-inlines-hidden bug], kde_cv_val_gcc_visibility_bug,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ safe_CXXFLAGS=$CXXFLAGS
+ safe_LDFLAGS=$LDFLAGS
+ CXXFLAGS="$CXXFLAGS -fPIC -fvisibility-inlines-hidden -O0"
+ LDFLAGS="$LDFLAGS -shared -fPIC"
+
+ AC_TRY_LINK(
+ [
+ /* http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19664 */
+ #include <string>
+ int some_function( void ) __attribute__ ((visibility("default")));
+ int some_function( void )
+ {
+ std::string s("blafasel");
+ return 0;
+ }
+ ], [/* elvis is alive */],
+ kde_cv_val_gcc_visibility_bug=no, kde_cv_val_gcc_visibility_bug=yes)
+
+ CXXFLAGS=$safe_CXXFLAGS
+ LDFLAGS=$safe_LDFLAGS
+ AC_LANG_RESTORE
+ ]
+ )
+
+ if test x$kde_cv_val_gcc_visibility_bug = xno; then
+ CXXFLAGS="$CXXFLAGS -fvisibility-inlines-hidden"
+ fi
+ ]
+)
+
+AC_DEFUN([KDE_ENABLE_HIDDEN_VISIBILITY],
+[
+ AC_BEFORE([AC_PATH_QT_1_3], [KDE_ENABLE_HIDDEN_VISIBILITY])
+
+ AC_MSG_CHECKING([grepping for visibility push/pop in headers])
+
+ if test "x$GXX" = "xyes"; then
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_EGREP_CPP(
+ [GCC visibility push],
+ [ #include <exception>
+ ],
+ [
+ AC_MSG_RESULT(yes)
+ kde_stdc_visibility_patched=yes ],
+ [
+ AC_MSG_RESULT(no)
+ AC_MSG_WARN([Your libstdc++ doesn't appear to be patched for
+ visibility support. Disabling -fvisibility=hidden])
+
+ kde_stdc_visibility_patched=no ])
+
+ AC_LANG_RESTORE
+
+ kde_have_gcc_visibility=no
+ KDE_CHECK_COMPILER_FLAG(fvisibility=hidden,
+ [
+ kde_have_gcc_visibility=yes
+ dnl the whole toolchain is just a mess, gcc is just too buggy
+ dnl to handle STL with visibility enabled. Lets reconsider
+ dnl when gcc 4.2 is out or when things get fixed in the compiler.
+ dnl Contact mueller@kde.org for details.
+ AC_ARG_ENABLE(gcc-hidden-visibility,
+ AC_HELP_STRING([--enable-gcc-hidden-visibility],[toolchain hidden visibility [default=no]]),
+ [kde_have_gcc_visibility=$enableval],
+ [kde_have_gcc_visibility=no])
+
+ AC_CACHE_CHECK([if Qt is patched for -fvisibility], kde_cv_val_qt_gcc_visibility_patched,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ safe_CXXFLAGS=$CXXFLAGS
+ CXXFLAGS="$CXXFLAGS $all_includes"
+
+ AC_TRY_COMPILE(
+ [
+#include <qglobal.h>
+#if Q_EXPORT - 0 != 0
+/* if this compiles, then Q_EXPORT is undefined */
+/* if Q_EXPORT is nonempty, this will break compilation */
+#endif
+ ], [/* elvis is alive */],
+ kde_cv_val_qt_gcc_visibility_patched=no, kde_cv_val_qt_gcc_visibility_patched=yes)
+
+ CXXFLAGS=$safe_CXXFLAGS
+ AC_LANG_RESTORE
+ ]
+ )
+
+ if test x$kde_have_gcc_visibility = "xyes" && test x$kde_stdc_visibility_patched = "xyes" && test x$kde_cv_val_qt_gcc_visibility_patched = "xyes"; then
+ CXXFLAGS="$CXXFLAGS -fvisibility=hidden"
+ KDE_CHECK_VISIBILITY_GCC_BUG
+ HAVE_GCC_VISIBILITY=1
+ AC_DEFINE_UNQUOTED(__KDE_HAVE_GCC_VISIBILITY, "$HAVE_GCC_VISIBILITY", [define to 1 if -fvisibility is supported])
+ fi
+ ])
+ fi
+])
+
+AC_DEFUN([KDE_ADD_DEPENDENCIES],
+[
+ [A]M_DEPENDENCIES(CC)
+ [A]M_DEPENDENCIES(CXX)
+])
+
+dnl just a wrapper to clean up configure.in
+AC_DEFUN([KDE_PROG_LIBTOOL],
+[
+AC_REQUIRE([AC_CHECK_COMPILERS])
+AC_REQUIRE([AC_ENABLE_SHARED])
+AC_REQUIRE([AC_ENABLE_STATIC])
+
+AC_REQUIRE([AC_LIBTOOL_DLOPEN])
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+AC_OBJEXT
+AC_EXEEXT
+
+AM_PROG_LIBTOOL
+AC_LIBTOOL_CXX
+
+LIBTOOL_SHELL="/bin/sh ./libtool"
+# LIBTOOL="$LIBTOOL --silent"
+KDE_PLUGIN="-avoid-version -module -no-undefined \$(KDE_NO_UNDEFINED) \$(KDE_RPATH) \$(KDE_MT_LDFLAGS)"
+AC_SUBST(KDE_PLUGIN)
+
+# This hack ensures that libtool creates shared libs for kunittest plugins. By default check_LTLIBRARIES makes static libs.
+KDE_CHECK_PLUGIN="\$(KDE_PLUGIN) -rpath \$(libdir)"
+AC_SUBST(KDE_CHECK_PLUGIN)
+
+# we patch configure quite some so we better keep that consistent for incremental runs
+AC_SUBST(AUTOCONF,'$(SHELL) $(top_srcdir)/admin/cvs.sh configure || touch configure')
+])
+
+AC_DEFUN([KDE_CHECK_LIB64],
+[
+ AC_ARG_ENABLE(libsuffix,
+ AC_HELP_STRING([--enable-libsuffix],
+ [/lib directory suffix (64,32,none,auto[=default])]),
+ kdelibsuff=$enableval, kdelibsuff="auto")
+
+ if test "$kdelibsuff" = "auto"; then
+
+cat > conftest.c << EOF
+#include <stdio.h>
+int main() {
+ return 0;
+}
+EOF
+ kdelibsuff=`$CC conftest.c -o conftest.out; ldd conftest.out |sed -ne '/libc.so/{
+ s,.*/lib\([[^\/]]*\)/.*,\1,
+ p
+}'`
+ rm -rf conftest.*
+ fi
+
+ if test "$kdelibsuff" = "no" || test "$kdelibsuff" = "none"; then
+ kdelibsuff=
+ fi
+ if test -z "$kdelibsuff"; then
+ AC_MSG_RESULT([not using lib directory suffix])
+ AC_DEFINE(KDELIBSUFF, [""], Suffix for lib directories)
+ else
+ if test "$libdir" = '${exec_prefix}/lib'; then
+ libdir="$libdir${kdelibsuff}"
+ AC_SUBST([libdir], ["$libdir"]) dnl ugly hack for lib64 platforms
+ fi
+ AC_DEFINE_UNQUOTED(KDELIBSUFF, ["${kdelibsuff}"], Suffix for lib directories)
+ AC_MSG_RESULT([using lib directory suffix $kdelibsuff])
+ fi
+])
+
+AC_DEFUN([KDE_CHECK_TYPES],
+[ AC_CHECK_SIZEOF(int, 4)dnl
+ AC_CHECK_SIZEOF(short)dnl
+ AC_CHECK_SIZEOF(long, 4)dnl
+ AC_CHECK_SIZEOF(char *, 4)dnl
+])dnl
+
+dnl Not used - kept for compat only?
+AC_DEFUN([KDE_DO_IT_ALL],
+[
+AC_CANONICAL_SYSTEM
+AC_ARG_PROGRAM
+AM_INIT_AUTOMAKE($1, $2)
+AM_DISABLE_LIBRARIES
+AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde})
+AC_CHECK_COMPILERS
+KDE_PROG_LIBTOOL
+AM_KDE_WITH_NLS
+AC_PATH_KDE
+])
+
+AC_DEFUN([AC_CHECK_RPATH],
+[
+AC_MSG_CHECKING(for rpath)
+AC_ARG_ENABLE(rpath,
+ AC_HELP_STRING([--disable-rpath],[do not use the rpath feature of ld]),
+ USE_RPATH=$enableval, USE_RPATH=yes)
+
+if test -z "$KDE_RPATH" && test "$USE_RPATH" = "yes"; then
+
+ KDE_RPATH="-R \$(libdir)"
+
+ if test "$kde_libraries" != "$libdir"; then
+ KDE_RPATH="$KDE_RPATH -R \$(kde_libraries)"
+ fi
+
+ if test -n "$qt_libraries"; then
+ KDE_RPATH="$KDE_RPATH -R \$(qt_libraries)"
+ fi
+ dnl $x_libraries is set to /usr/lib in case
+ if test -n "$X_LDFLAGS"; then
+ X_RPATH="-R \$(x_libraries)"
+ KDE_RPATH="$KDE_RPATH $X_RPATH"
+ fi
+ if test -n "$KDE_EXTRA_RPATH"; then
+ KDE_RPATH="$KDE_RPATH \$(KDE_EXTRA_RPATH)"
+ fi
+fi
+AC_SUBST(KDE_EXTRA_RPATH)
+AC_SUBST(KDE_RPATH)
+AC_SUBST(X_RPATH)
+AC_MSG_RESULT($USE_RPATH)
+])
+
+dnl Check for the type of the third argument of getsockname
+AC_DEFUN([AC_CHECK_SOCKLEN_T],
+[
+ AC_MSG_CHECKING(for socklen_t)
+ AC_CACHE_VAL(kde_cv_socklen_t,
+ [
+ AC_LANG_PUSH(C++)
+ kde_cv_socklen_t=no
+ AC_TRY_COMPILE([
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ ],
+ [
+ socklen_t len;
+ getpeername(0,0,&len);
+ ],
+ [
+ kde_cv_socklen_t=yes
+ kde_cv_socklen_t_equiv=socklen_t
+ ])
+ AC_LANG_POP(C++)
+ ])
+ AC_MSG_RESULT($kde_cv_socklen_t)
+ if test $kde_cv_socklen_t = no; then
+ AC_MSG_CHECKING([for socklen_t equivalent for socket functions])
+ AC_CACHE_VAL(kde_cv_socklen_t_equiv,
+ [
+ kde_cv_socklen_t_equiv=int
+ AC_LANG_PUSH(C++)
+ for t in int size_t unsigned long "unsigned long"; do
+ AC_TRY_COMPILE([
+ #include <sys/types.h>
+ #include <sys/socket.h>
+ ],
+ [
+ $t len;
+ getpeername(0,0,&len);
+ ],
+ [
+ kde_cv_socklen_t_equiv="$t"
+ break
+ ])
+ done
+ AC_LANG_POP(C++)
+ ])
+ AC_MSG_RESULT($kde_cv_socklen_t_equiv)
+ fi
+ AC_DEFINE_UNQUOTED(kde_socklen_t, $kde_cv_socklen_t_equiv,
+ [type to use in place of socklen_t if not defined])
+ AC_DEFINE_UNQUOTED(ksize_t, $kde_cv_socklen_t_equiv,
+ [type to use in place of socklen_t if not defined (deprecated, use kde_socklen_t)])
+])
+
+dnl This is a merge of some macros out of the gettext aclocal.m4
+dnl since we don't need anything, I took the things we need
+dnl the copyright for them is:
+dnl >
+dnl Copyright (C) 1994, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+dnl This Makefile.in is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+dnl PARTICULAR PURPOSE.
+dnl >
+dnl for this file it is relicensed under LGPL
+
+AC_DEFUN([AM_KDE_WITH_NLS],
+ [
+ dnl If we use NLS figure out what method
+
+ AM_PATH_PROG_WITH_TEST_KDE(MSGFMT, msgfmt,
+ [test -n "`$ac_dir/$ac_word --version 2>&1 | grep 'GNU gettext'`"], msgfmt)
+ AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT)
+
+ if test -z "`$GMSGFMT --version 2>&1 | grep 'GNU gettext'`"; then
+ AC_MSG_RESULT([found msgfmt program is not GNU msgfmt; ignore it])
+ GMSGFMT=":"
+ fi
+ MSGFMT=$GMSGFMT
+ AC_SUBST(GMSGFMT)
+ AC_SUBST(MSGFMT)
+
+ AM_PATH_PROG_WITH_TEST_KDE(XGETTEXT, xgettext,
+ [test -z "`$ac_dir/$ac_word -h 2>&1 | grep '(HELP)'`"], :)
+
+ dnl Test whether we really found GNU xgettext.
+ if test "$XGETTEXT" != ":"; then
+ dnl If it is no GNU xgettext we define it as : so that the
+ dnl Makefiles still can work.
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ AC_MSG_RESULT(
+ [found xgettext programs is not GNU xgettext; ignore it])
+ XGETTEXT=":"
+ fi
+ fi
+ AC_SUBST(XGETTEXT)
+
+ ])
+
+# Search path for a program which passes the given test.
+# Ulrich Drepper <drepper@cygnus.com>, 1996.
+
+# serial 1
+# Stephan Kulow: I appended a _KDE against name conflicts
+
+dnl AM_PATH_PROG_WITH_TEST_KDE(VARIABLE, PROG-TO-CHECK-FOR,
+dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]])
+AC_DEFUN([AM_PATH_PROG_WITH_TEST_KDE],
+[# Extract the first word of "$2", so it can be a program name with args.
+set dummy $2; ac_word=[$]2
+AC_MSG_CHECKING([for $ac_word])
+AC_CACHE_VAL(ac_cv_path_$1,
+[case "[$]$1" in
+ /*)
+ ac_cv_path_$1="[$]$1" # Let the user override the test with a path.
+ ;;
+ *)
+ IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+ for ac_dir in ifelse([$5], , $PATH, [$5]); do
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$ac_word; then
+ if [$3]; then
+ ac_cv_path_$1="$ac_dir/$ac_word"
+ break
+ fi
+ fi
+ done
+ IFS="$ac_save_ifs"
+dnl If no 4th arg is given, leave the cache variable unset,
+dnl so AC_PATH_PROGS will keep looking.
+ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4"
+])dnl
+ ;;
+esac])dnl
+$1="$ac_cv_path_$1"
+if test -n "[$]$1"; then
+ AC_MSG_RESULT([$]$1)
+else
+ AC_MSG_RESULT(no)
+fi
+AC_SUBST($1)dnl
+])
+
+
+# Check whether LC_MESSAGES is available in <locale.h>.
+# Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# serial 1
+
+AC_DEFUN([AM_LC_MESSAGES],
+ [if test $ac_cv_header_locale_h = yes; then
+ AC_CACHE_CHECK([for LC_MESSAGES], am_cv_val_LC_MESSAGES,
+ [AC_TRY_LINK([#include <locale.h>], [return LC_MESSAGES],
+ am_cv_val_LC_MESSAGES=yes, am_cv_val_LC_MESSAGES=no)])
+ if test $am_cv_val_LC_MESSAGES = yes; then
+ AC_DEFINE(HAVE_LC_MESSAGES, 1, [Define if your locale.h file contains LC_MESSAGES])
+ fi
+ fi])
+
+dnl From Jim Meyering.
+dnl FIXME: migrate into libit.
+
+AC_DEFUN([AM_FUNC_OBSTACK],
+[AC_CACHE_CHECK([for obstacks], am_cv_func_obstack,
+ [AC_TRY_LINK([#include "obstack.h"],
+ [struct obstack *mem;obstack_free(mem,(char *) 0)],
+ am_cv_func_obstack=yes,
+ am_cv_func_obstack=no)])
+ if test $am_cv_func_obstack = yes; then
+ AC_DEFINE(HAVE_OBSTACK)
+ else
+ LIBOBJS="$LIBOBJS obstack.o"
+ fi
+])
+
+dnl From Jim Meyering. Use this if you use the GNU error.[ch].
+dnl FIXME: Migrate into libit
+
+AC_DEFUN([AM_FUNC_ERROR_AT_LINE],
+[AC_CACHE_CHECK([for error_at_line], am_cv_lib_error_at_line,
+ [AC_TRY_LINK([],[error_at_line(0, 0, "", 0, "");],
+ am_cv_lib_error_at_line=yes,
+ am_cv_lib_error_at_line=no)])
+ if test $am_cv_lib_error_at_line = no; then
+ LIBOBJS="$LIBOBJS error.o"
+ fi
+ AC_SUBST(LIBOBJS)dnl
+])
+
+# Macro to add for using GNU gettext.
+# Ulrich Drepper <drepper@cygnus.com>, 1995.
+
+# serial 1
+# Stephan Kulow: I put a KDE in it to avoid name conflicts
+
+AC_DEFUN([AM_KDE_GNU_GETTEXT],
+ [AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+ AC_REQUIRE([AC_PROG_RANLIB])dnl
+ AC_REQUIRE([AC_HEADER_STDC])dnl
+ AC_REQUIRE([AC_TYPE_OFF_T])dnl
+ AC_REQUIRE([AC_TYPE_SIZE_T])dnl
+ AC_REQUIRE([AC_FUNC_ALLOCA])dnl
+ AC_REQUIRE([AC_FUNC_MMAP])dnl
+ AC_REQUIRE([AM_KDE_WITH_NLS])dnl
+ AC_CHECK_HEADERS([limits.h locale.h nl_types.h string.h values.h alloca.h])
+ AC_CHECK_FUNCS([getcwd munmap putenv setlocale strchr strcasecmp \
+__argz_count __argz_stringify __argz_next])
+
+ AC_MSG_CHECKING(for stpcpy)
+ AC_CACHE_VAL(kde_cv_func_stpcpy,
+ [
+ kde_safe_cxxflags=$CXXFLAGS
+ CXXFLAGS="-Werror"
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_COMPILE([
+ #include <string.h>
+ ],
+ [
+ char buffer[200];
+ stpcpy(buffer, buffer);
+ ],
+ kde_cv_func_stpcpy=yes,
+ kde_cv_func_stpcpy=no)
+ AC_LANG_RESTORE
+ CXXFLAGS=$kde_safe_cxxflags
+ ])
+ AC_MSG_RESULT($kde_cv_func_stpcpy)
+ if eval "test \"`echo $kde_cv_func_stpcpy`\" = yes"; then
+ AC_DEFINE(HAVE_STPCPY, 1, [Define if you have stpcpy])
+ fi
+
+ AM_LC_MESSAGES
+
+ if test "x$CATOBJEXT" != "x"; then
+ if test "x$ALL_LINGUAS" = "x"; then
+ LINGUAS=
+ else
+ AC_MSG_CHECKING(for catalogs to be installed)
+ NEW_LINGUAS=
+ for lang in ${LINGUAS=$ALL_LINGUAS}; do
+ case "$ALL_LINGUAS" in
+ *$lang*) NEW_LINGUAS="$NEW_LINGUAS $lang" ;;
+ esac
+ done
+ LINGUAS=$NEW_LINGUAS
+ AC_MSG_RESULT($LINGUAS)
+ fi
+
+ dnl Construct list of names of catalog files to be constructed.
+ if test -n "$LINGUAS"; then
+ for lang in $LINGUAS; do CATALOGS="$CATALOGS $lang$CATOBJEXT"; done
+ fi
+ fi
+
+ ])
+
+AC_DEFUN([AC_HAVE_XPM],
+ [AC_REQUIRE_CPP()dnl
+ AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+
+ test -z "$XPM_LDFLAGS" && XPM_LDFLAGS=
+ test -z "$XPM_INCLUDE" && XPM_INCLUDE=
+
+ AC_ARG_WITH(xpm,AC_HELP_STRING([--without-xpm],[disable color pixmap XPM tests]),
+ xpm_test=$withval, xpm_test="yes")
+ if test "x$xpm_test" = xno; then
+ ac_cv_have_xpm=no
+ else
+ AC_MSG_CHECKING(for XPM)
+ AC_CACHE_VAL(ac_cv_have_xpm,
+ [
+ ac_save_ldflags="$LDFLAGS"
+ ac_save_cflags="$CFLAGS"
+ if test "x$kde_use_qt_emb" != "xyes" && test "x$kde_use_qt_mac" != "xyes"; then
+ LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm -lX11 -lXext $LIBZ $LIBSOCKET"
+ else
+ LDFLAGS="$LDFLAGS $X_LDFLAGS $USER_LDFLAGS $LDFLAGS $XPM_LDFLAGS $all_libraries -lXpm $LIBZ $LIBSOCKET"
+ fi
+ CFLAGS="$CFLAGS $X_INCLUDES $USER_INCLUDES"
+ test -n "$XPM_INCLUDE" && CFLAGS="-I$XPM_INCLUDE $CFLAGS"
+ AC_TRY_LINK([#include <X11/xpm.h>],[],
+ ac_cv_have_xpm="yes",ac_cv_have_xpm="no")
+ LDFLAGS="$ac_save_ldflags"
+ CFLAGS="$ac_save_cflags"
+ ])dnl
+
+ if test "$ac_cv_have_xpm" = no; then
+ AC_MSG_RESULT(no)
+ XPM_LDFLAGS=""
+ XPMINC=""
+ $2
+ else
+ AC_DEFINE(HAVE_XPM, 1, [Define if you have XPM support])
+ if test "$XPM_LDFLAGS" = ""; then
+ XPMLIB='-lXpm $(LIB_X11)'
+ else
+ XPMLIB="-L$XPM_LDFLAGS -lXpm "'$(LIB_X11)'
+ fi
+ if test "$XPM_INCLUDE" = ""; then
+ XPMINC=""
+ else
+ XPMINC="-I$XPM_INCLUDE"
+ fi
+ AC_MSG_RESULT(yes)
+ $1
+ fi
+ fi
+ AC_SUBST(XPMINC)
+ AC_SUBST(XPMLIB)
+])
+
+AC_DEFUN([AC_HAVE_DPMS],
+ [AC_REQUIRE_CPP()dnl
+ AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+
+ test -z "$DPMS_LDFLAGS" && DPMS_LDFLAGS=
+ test -z "$DPMS_INCLUDE" && DPMS_INCLUDE=
+ DPMS_LIB=
+
+ AC_ARG_WITH(dpms,AC_HELP_STRING([--without-dpms],[disable DPMS power saving]),
+ dpms_test=$withval, dpms_test="yes")
+ if test "x$dpms_test" = xno; then
+ ac_cv_have_dpms=no
+ else
+ AC_MSG_CHECKING(for DPMS)
+ dnl Note: ac_cv_have_dpms can be no, yes, or -lXdpms.
+ dnl 'yes' means DPMS_LIB="", '-lXdpms' means DPMS_LIB="-lXdpms".
+ AC_CACHE_VAL(ac_cv_have_dpms,
+ [
+ if test "x$kde_use_qt_emb" = "xyes" || test "x$kde_use_qt_mac" = "xyes"; then
+ AC_MSG_RESULT(no)
+ ac_cv_have_dpms="no"
+ else
+ ac_save_ldflags="$LDFLAGS"
+ ac_save_cflags="$CFLAGS"
+ ac_save_libs="$LIBS"
+ LDFLAGS="$LDFLAGS $DPMS_LDFLAGS $all_libraries"
+ LIBS="-lX11 -lXext $LIBSOCKET"
+ CFLAGS="$CFLAGS $X_INCLUDES"
+ test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS"
+ AC_TRY_LINK([
+ #include <X11/Xproto.h>
+ #include <X11/X.h>
+ #include <X11/Xlib.h>
+ #include <X11/extensions/dpms.h>
+ int foo_test_dpms()
+ { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[],
+ ac_cv_have_dpms="yes", [
+ LIBS="-lXdpms $LIBS"
+ AC_TRY_LINK([
+ #include <X11/Xproto.h>
+ #include <X11/X.h>
+ #include <X11/Xlib.h>
+ #include <X11/extensions/dpms.h>
+ int foo_test_dpms()
+ { return DPMSSetTimeouts( 0, 0, 0, 0 ); }],[],
+ [
+ ac_cv_have_dpms="-lXdpms"
+ ],ac_cv_have_dpms="no")
+ ])
+ LDFLAGS="$ac_save_ldflags"
+ CFLAGS="$ac_save_cflags"
+ LIBS="$ac_save_libs"
+ fi
+ ])dnl
+
+ if test "$ac_cv_have_dpms" = no; then
+ AC_MSG_RESULT(no)
+ DPMS_LDFLAGS=""
+ DPMSINC=""
+ $2
+ else
+ AC_DEFINE(HAVE_DPMS, 1, [Define if you have DPMS support])
+ if test "$ac_cv_have_dpms" = "-lXdpms"; then
+ DPMS_LIB="-lXdpms"
+ fi
+ if test "$DPMS_LDFLAGS" = ""; then
+ DPMSLIB="$DPMS_LIB "'$(LIB_X11)'
+ else
+ DPMSLIB="$DPMS_LDFLAGS $DPMS_LIB "'$(LIB_X11)'
+ fi
+ if test "$DPMS_INCLUDE" = ""; then
+ DPMSINC=""
+ else
+ DPMSINC="-I$DPMS_INCLUDE"
+ fi
+ AC_MSG_RESULT(yes)
+ $1
+ fi
+ fi
+ ac_save_cflags="$CFLAGS"
+ CFLAGS="$CFLAGS $X_INCLUDES"
+ test -n "$DPMS_INCLUDE" && CFLAGS="-I$DPMS_INCLUDE $CFLAGS"
+ AH_TEMPLATE(HAVE_DPMSCAPABLE_PROTO,
+ [Define if you have the DPMSCapable prototype in <X11/extensions/dpms.h>])
+ AC_CHECK_DECL(DPMSCapable,
+ AC_DEFINE(HAVE_DPMSCAPABLE_PROTO),,
+ [#include <X11/Xlib.h>
+ #include <X11/extensions/dpms.h>])
+ AH_TEMPLATE(HAVE_DPMSINFO_PROTO,
+ [Define if you have the DPMSInfo prototype in <X11/extensions/dpms.h>])
+ AC_CHECK_DECL(DPMSInfo,
+ AC_DEFINE(HAVE_DPMSINFO_PROTO),,
+ [#include <X11/Xlib.h>
+ #include <X11/extensions/dpms.h>])
+ CFLAGS="$ac_save_cflags"
+ AC_SUBST(DPMSINC)
+ AC_SUBST(DPMSLIB)
+])
+
+AC_DEFUN([AC_HAVE_GL],
+ [AC_REQUIRE_CPP()dnl
+ AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+
+ test -z "$GL_LDFLAGS" && GL_LDFLAGS=
+ test -z "$GL_INCLUDE" && GL_INCLUDE=
+
+ AC_ARG_WITH(gl,AC_HELP_STRING([--without-gl],[disable 3D GL modes]),
+ gl_test=$withval, gl_test="yes")
+ if test "x$kde_use_qt_emb" = "xyes"; then
+ # GL and Qt Embedded is a no-go for now.
+ ac_cv_have_gl=no
+ elif test "x$gl_test" = xno; then
+ ac_cv_have_gl=no
+ else
+ AC_MSG_CHECKING(for GL)
+ AC_CACHE_VAL(ac_cv_have_gl,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ ac_save_ldflags=$LDFLAGS
+ ac_save_cxxflags=$CXXFLAGS
+ ac_save_libs=$LIBS
+ LDFLAGS="$LDFLAGS $GL_LDFLAGS $X_LDFLAGS $all_libraries"
+ LIBS="$LIBS -lGL -lGLU"
+ test "x$kde_use_qt_mac" != xyes && test "x$kde_use_qt_emb" != xyes && LIBS="$LIBS -lX11"
+ LIBS="$LIBS $LIB_XEXT -lm $LIBSOCKET"
+ CXXFLAGS="$CFLAGS $X_INCLUDES"
+ test -n "$GL_INCLUDE" && CFLAGS="-I$GL_INCLUDE $CFLAGS"
+ AC_TRY_LINK([#include <GL/gl.h>
+#include <GL/glu.h>
+], [],
+ ac_cv_have_gl="yes", ac_cv_have_gl="no")
+ AC_LANG_RESTORE
+ LDFLAGS=$ac_save_ldflags
+ CXXFLAGS=$ac_save_cxxflags
+ LIBS=$ac_save_libs
+ ])dnl
+
+ if test "$ac_cv_have_gl" = "no"; then
+ AC_MSG_RESULT(no)
+ GL_LDFLAGS=""
+ GLINC=""
+ $2
+ else
+ AC_DEFINE(HAVE_GL, 1, [Defines if you have GL (Mesa, OpenGL, ...)])
+ if test "$GL_LDFLAGS" = ""; then
+ GLLIB='-lGLU -lGL $(LIB_X11)'
+ else
+ GLLIB="$GL_LDFLAGS -lGLU -lGL "'$(LIB_X11)'
+ fi
+ if test "$GL_INCLUDE" = ""; then
+ GLINC=""
+ else
+ GLINC="-I$GL_INCLUDE"
+ fi
+ AC_MSG_RESULT($ac_cv_have_gl)
+ $1
+ fi
+ fi
+ AC_SUBST(GLINC)
+ AC_SUBST(GLLIB)
+])
+
+
+ dnl shadow password and PAM magic - maintained by ossi@kde.org
+
+AC_DEFUN([KDE_PAM], [
+ AC_REQUIRE([KDE_CHECK_LIBDL])
+
+ want_pam=
+ AC_ARG_WITH(pam,
+ AC_HELP_STRING([--with-pam[=ARG]],[enable support for PAM: ARG=[yes|no|service name]]),
+ [ if test "x$withval" = "xyes"; then
+ want_pam=yes
+ pam_service=kde
+ elif test "x$withval" = "xno"; then
+ want_pam=no
+ else
+ want_pam=yes
+ pam_service=$withval
+ fi
+ ], [ pam_service=kde ])
+
+ use_pam=
+ PAMLIBS=
+ if test "x$want_pam" != xno; then
+ AC_CHECK_LIB(pam, pam_start, [
+ AC_CHECK_HEADER(security/pam_appl.h,
+ [ pam_header=security/pam_appl.h ],
+ [ AC_CHECK_HEADER(pam/pam_appl.h,
+ [ pam_header=pam/pam_appl.h ],
+ [
+ AC_MSG_WARN([PAM detected, but no headers found!
+Make sure you have the necessary development packages installed.])
+ ]
+ )
+ ]
+ )
+ ], , $LIBDL)
+ if test -z "$pam_header"; then
+ if test "x$want_pam" = xyes; then
+ AC_MSG_ERROR([--with-pam was specified, but cannot compile with PAM!])
+ fi
+ else
+ AC_DEFINE(HAVE_PAM, 1, [Defines if you have PAM (Pluggable Authentication Modules)])
+ PAMLIBS="$PAM_MISC_LIB -lpam $LIBDL"
+ use_pam=yes
+
+ dnl darwin claims to be something special
+ if test "$pam_header" = "pam/pam_appl.h"; then
+ AC_DEFINE(HAVE_PAM_PAM_APPL_H, 1, [Define if your PAM headers are in pam/ instead of security/])
+ fi
+
+ dnl test whether struct pam_message is const (Linux) or not (Sun)
+ AC_MSG_CHECKING(for const pam_message)
+ AC_EGREP_HEADER([struct pam_message], $pam_header,
+ [ AC_EGREP_HEADER([const struct pam_message], $pam_header,
+ [AC_MSG_RESULT([const: Linux-type PAM])],
+ [AC_MSG_RESULT([nonconst: Sun-type PAM])
+ AC_DEFINE(PAM_MESSAGE_NONCONST, 1, [Define if your PAM support takes non-const arguments (Solaris)])]
+ )],
+ [AC_MSG_RESULT([not found - assume const, Linux-type PAM])])
+ fi
+ fi
+
+ AC_SUBST(PAMLIBS)
+])
+
+dnl DEF_PAM_SERVICE(arg name, full name, define name)
+AC_DEFUN([DEF_PAM_SERVICE], [
+ AC_ARG_WITH($1-pam,
+ AC_HELP_STRING([--with-$1-pam=[val]],[override PAM service from --with-pam for $2]),
+ [ if test "x$use_pam" = xyes; then
+ $3_PAM_SERVICE=$withval
+ else
+ AC_MSG_ERROR([Cannot use use --with-$1-pam, as no PAM was detected.
+You may want to enforce it by using --with-pam.])
+ fi
+ ],
+ [ if test "x$use_pam" = xyes; then
+ $3_PAM_SERVICE="$pam_service"
+ fi
+ ])
+ if test -n "$$3_PAM_SERVICE"; then
+ AC_MSG_RESULT([The PAM service used by $2 will be $$3_PAM_SERVICE])
+ AC_DEFINE_UNQUOTED($3_PAM_SERVICE, "$$3_PAM_SERVICE", [The PAM service to be used by $2])
+ fi
+ AC_SUBST($3_PAM_SERVICE)
+])
+
+AC_DEFUN([KDE_SHADOWPASSWD], [
+ AC_REQUIRE([KDE_PAM])
+
+ AC_CHECK_LIB(shadow, getspent,
+ [ LIBSHADOW="-lshadow"
+ ac_use_shadow=yes
+ ],
+ [ dnl for UnixWare
+ AC_CHECK_LIB(gen, getspent,
+ [ LIBGEN="-lgen"
+ ac_use_shadow=yes
+ ],
+ [ AC_CHECK_FUNC(getspent,
+ [ ac_use_shadow=yes ],
+ [ ac_use_shadow=no ])
+ ])
+ ])
+ AC_SUBST(LIBSHADOW)
+ AC_SUBST(LIBGEN)
+
+ AC_MSG_CHECKING([for shadow passwords])
+
+ AC_ARG_WITH(shadow,
+ AC_HELP_STRING([--with-shadow],[If you want shadow password support]),
+ [ if test "x$withval" != "xno"; then
+ use_shadow=yes
+ else
+ use_shadow=no
+ fi
+ ], [
+ use_shadow="$ac_use_shadow"
+ ])
+
+ if test "x$use_shadow" = xyes; then
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_SHADOW, 1, [Define if you use shadow passwords])
+ else
+ AC_MSG_RESULT(no)
+ LIBSHADOW=
+ LIBGEN=
+ fi
+
+ dnl finally make the relevant binaries setuid root, if we have shadow passwds.
+ dnl this still applies, if we could use it indirectly through pam.
+ if test "x$use_shadow" = xyes ||
+ ( test "x$use_pam" = xyes && test "x$ac_use_shadow" = xyes ); then
+ case $host in
+ *-*-freebsd* | *-*-netbsd* | *-*-openbsd*)
+ SETUIDFLAGS="-m 4755 -o root";;
+ *)
+ SETUIDFLAGS="-m 4755";;
+ esac
+ fi
+ AC_SUBST(SETUIDFLAGS)
+
+])
+
+AC_DEFUN([KDE_PASSWDLIBS], [
+ AC_REQUIRE([KDE_MISC_TESTS]) dnl for LIBCRYPT
+ AC_REQUIRE([KDE_PAM])
+ AC_REQUIRE([KDE_SHADOWPASSWD])
+
+ if test "x$use_pam" = "xyes"; then
+ PASSWDLIBS="$PAMLIBS"
+ else
+ PASSWDLIBS="$LIBCRYPT $LIBSHADOW $LIBGEN"
+ fi
+
+ dnl FreeBSD uses a shadow-like setup, where /etc/passwd holds the users, but
+ dnl /etc/master.passwd holds the actual passwords. /etc/master.passwd requires
+ dnl root to read, so kcheckpass needs to be root (even when using pam, since pam
+ dnl may need to read /etc/master.passwd).
+ case $host in
+ *-*-freebsd*)
+ SETUIDFLAGS="-m 4755 -o root"
+ ;;
+ *)
+ ;;
+ esac
+
+ AC_SUBST(PASSWDLIBS)
+])
+
+AC_DEFUN([KDE_CHECK_LIBDL],
+[
+AC_CHECK_LIB(dl, dlopen, [
+LIBDL="-ldl"
+ac_cv_have_dlfcn=yes
+])
+
+AC_CHECK_LIB(dld, shl_unload, [
+LIBDL="-ldld"
+ac_cv_have_shload=yes
+])
+
+AC_SUBST(LIBDL)
+])
+
+AC_DEFUN([KDE_CHECK_DLOPEN],
+[
+KDE_CHECK_LIBDL
+AC_CHECK_HEADERS(dlfcn.h dl.h)
+if test "$ac_cv_header_dlfcn_h" = "no"; then
+ ac_cv_have_dlfcn=no
+fi
+
+if test "$ac_cv_header_dl_h" = "no"; then
+ ac_cv_have_shload=no
+fi
+
+dnl XXX why change enable_dlopen? its already set by autoconf's AC_ARG_ENABLE
+dnl (MM)
+AC_ARG_ENABLE(dlopen,
+AC_HELP_STRING([--disable-dlopen],[link statically [default=no]]),
+enable_dlopen=$enableval,
+enable_dlopen=yes)
+
+# override the user's opinion, if we know it better ;)
+if test "$ac_cv_have_dlfcn" = "no" && test "$ac_cv_have_shload" = "no"; then
+ enable_dlopen=no
+fi
+
+if test "$ac_cv_have_dlfcn" = "yes"; then
+ AC_DEFINE_UNQUOTED(HAVE_DLFCN, 1, [Define if you have dlfcn])
+fi
+
+if test "$ac_cv_have_shload" = "yes"; then
+ AC_DEFINE_UNQUOTED(HAVE_SHLOAD, 1, [Define if you have shload])
+fi
+
+if test "$enable_dlopen" = no ; then
+ test -n "$1" && eval $1
+else
+ test -n "$2" && eval $2
+fi
+
+])
+
+AC_DEFUN([KDE_CHECK_DYNAMIC_LOADING],
+[
+KDE_CHECK_DLOPEN(libtool_enable_shared=yes, libtool_enable_static=no)
+KDE_PROG_LIBTOOL
+AC_MSG_CHECKING([dynamic loading])
+eval "`egrep '^build_libtool_libs=' libtool`"
+if test "$build_libtool_libs" = "yes" && test "$enable_dlopen" = "yes"; then
+ dynamic_loading=yes
+ AC_DEFINE_UNQUOTED(HAVE_DYNAMIC_LOADING)
+else
+ dynamic_loading=no
+fi
+AC_MSG_RESULT($dynamic_loading)
+if test "$dynamic_loading" = "yes"; then
+ $1
+else
+ $2
+fi
+])
+
+AC_DEFUN([KDE_ADD_INCLUDES],
+[
+if test -z "$1"; then
+ test_include="Pix.h"
+else
+ test_include="$1"
+fi
+
+AC_MSG_CHECKING([for libg++ ($test_include)])
+
+AC_CACHE_VAL(kde_cv_libgpp_includes,
+[
+kde_cv_libgpp_includes=no
+
+ for ac_dir in \
+ \
+ /usr/include/g++ \
+ /usr/include \
+ /usr/unsupported/include \
+ /opt/include \
+ $extra_include \
+ ; \
+ do
+ if test -r "$ac_dir/$test_include"; then
+ kde_cv_libgpp_includes=$ac_dir
+ break
+ fi
+ done
+])
+
+AC_MSG_RESULT($kde_cv_libgpp_includes)
+if test "$kde_cv_libgpp_includes" != "no"; then
+ all_includes="-I$kde_cv_libgpp_includes $all_includes $USER_INCLUDES"
+fi
+])
+])
+
+AC_DEFUN([KDE_CHECK_LIBPTHREAD],
+[
+ dnl This code is here specifically to handle the
+ dnl various flavors of threading library on FreeBSD
+ dnl 4-, 5-, and 6-, and the (weird) rules around it.
+ dnl There may be an environment PTHREAD_LIBS that
+ dnl specifies what to use; otherwise, search for it.
+ dnl -pthread is special cased and unsets LIBPTHREAD
+ dnl below if found.
+ LIBPTHREAD=""
+
+ if test -n "$PTHREAD_LIBS"; then
+ if test "x$PTHREAD_LIBS" = "x-pthread" ; then
+ LIBPTHREAD="PTHREAD"
+ else
+ PTHREAD_LIBS_save="$PTHREAD_LIBS"
+ PTHREAD_LIBS=`echo "$PTHREAD_LIBS_save" | sed -e 's,^-l,,g'`
+ AC_MSG_CHECKING([for pthread_create in $PTHREAD_LIBS])
+ KDE_CHECK_LIB($PTHREAD_LIBS, pthread_create, [
+ LIBPTHREAD="$PTHREAD_LIBS_save"])
+ PTHREAD_LIBS="$PTHREAD_LIBS_save"
+ fi
+ fi
+
+ dnl Is this test really needed, in the face of the Tru64 test below?
+ if test -z "$LIBPTHREAD"; then
+ AC_CHECK_LIB(pthread, pthread_create, [LIBPTHREAD="-lpthread"])
+ fi
+
+ dnl This is a special Tru64 check, see BR 76171 issue #18.
+ if test -z "$LIBPTHREAD" ; then
+ AC_MSG_CHECKING([for pthread_create in -lpthread])
+ kde_safe_libs=$LIBS
+ LIBS="$LIBS -lpthread"
+ AC_TRY_LINK([#include <pthread.h>],[(void)pthread_create(0,0,0,0);],[
+ AC_MSG_RESULT(yes)
+ LIBPTHREAD="-lpthread"],[
+ AC_MSG_RESULT(no)])
+ LIBS=$kde_safe_libs
+ fi
+
+ dnl Un-special-case for FreeBSD.
+ if test "x$LIBPTHREAD" = "xPTHREAD" ; then
+ LIBPTHREAD=""
+ fi
+
+ AC_SUBST(LIBPTHREAD)
+])
+
+AC_DEFUN([KDE_CHECK_PTHREAD_OPTION],
+[
+ USE_THREADS=""
+ if test -z "$LIBPTHREAD"; then
+ KDE_CHECK_COMPILER_FLAG(pthread, [USE_THREADS="-D_THREAD_SAFE -pthread"])
+ fi
+
+ AH_VERBATIM(__svr_define, [
+#if defined(__SVR4) && !defined(__svr4__)
+#define __svr4__ 1
+#endif
+])
+ case $host_os in
+ solaris*)
+ KDE_CHECK_COMPILER_FLAG(mt, [USE_THREADS="-mt"])
+ CPPFLAGS="$CPPFLAGS -D_REENTRANT -D_POSIX_PTHREAD_SEMANTICS -DUSE_SOLARIS -DSVR4"
+ ;;
+ freebsd*)
+ CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE $PTHREAD_CFLAGS"
+ ;;
+ aix*)
+ CPPFLAGS="$CPPFLAGS -D_THREAD_SAFE"
+ LIBPTHREAD="$LIBPTHREAD -lc_r"
+ ;;
+ linux*) CPPFLAGS="$CPPFLAGS -D_REENTRANT"
+ if test "$CXX" = "KCC"; then
+ CXXFLAGS="$CXXFLAGS --thread_safe"
+ NOOPT_CXXFLAGS="$NOOPT_CXXFLAGS --thread_safe"
+ fi
+ ;;
+ *)
+ ;;
+ esac
+ AC_SUBST(USE_THREADS)
+ AC_SUBST(LIBPTHREAD)
+])
+
+AC_DEFUN([KDE_CHECK_THREADING],
+[
+ AC_REQUIRE([KDE_CHECK_LIBPTHREAD])
+ AC_REQUIRE([KDE_CHECK_PTHREAD_OPTION])
+ dnl default is yes if libpthread is found and no if no libpthread is available
+ if test -z "$LIBPTHREAD"; then
+ if test -z "$USE_THREADS"; then
+ kde_check_threading_default=no
+ else
+ kde_check_threading_default=yes
+ fi
+ else
+ kde_check_threading_default=yes
+ fi
+ AC_ARG_ENABLE(threading,AC_HELP_STRING([--disable-threading],[disables threading even if libpthread found]),
+ kde_use_threading=$enableval, kde_use_threading=$kde_check_threading_default)
+ if test "x$kde_use_threading" = "xyes"; then
+ AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if you have a working libpthread (will enable threaded code)])
+ fi
+])
+
+AC_DEFUN([KDE_TRY_LINK_PYTHON],
+[
+if test "$kde_python_link_found" = no; then
+
+if test "$1" = normal; then
+ AC_MSG_CHECKING(if a Python application links)
+else
+ AC_MSG_CHECKING(if Python depends on $2)
+fi
+
+AC_CACHE_VAL(kde_cv_try_link_python_$1,
+[
+kde_save_cflags="$CFLAGS"
+CFLAGS="$CFLAGS $PYTHONINC"
+kde_save_libs="$LIBS"
+LIBS="$LIBS $LIBPYTHON $2 $LIBDL $LIBSOCKET"
+kde_save_ldflags="$LDFLAGS"
+LDFLAGS="$LDFLAGS $PYTHONLIB"
+
+AC_TRY_LINK(
+[
+#include <Python.h>
+],[
+ PySys_SetArgv(1, 0);
+],
+ [kde_cv_try_link_python_$1=yes],
+ [kde_cv_try_link_python_$1=no]
+)
+CFLAGS="$kde_save_cflags"
+LIBS="$kde_save_libs"
+LDFLAGS="$kde_save_ldflags"
+])
+
+if test "$kde_cv_try_link_python_$1" = "yes"; then
+ AC_MSG_RESULT(yes)
+ kde_python_link_found=yes
+ if test ! "$1" = normal; then
+ LIBPYTHON="$LIBPYTHON $2"
+ fi
+ $3
+else
+ AC_MSG_RESULT(no)
+ $4
+fi
+
+fi
+
+])
+
+AC_DEFUN([KDE_CHECK_PYTHON_DIR],
+[
+AC_MSG_CHECKING([for Python directory])
+
+AC_CACHE_VAL(kde_cv_pythondir,
+[
+ if test -z "$PYTHONDIR"; then
+ kde_cv_pythondir=/usr/local
+ else
+ kde_cv_pythondir="$PYTHONDIR"
+ fi
+])
+
+AC_ARG_WITH(pythondir,
+AC_HELP_STRING([--with-pythondir=pythondir],[use python installed in pythondir]),
+[
+ ac_python_dir=$withval
+], ac_python_dir=$kde_cv_pythondir
+)
+
+AC_MSG_RESULT($ac_python_dir)
+])
+
+AC_DEFUN([KDE_CHECK_PYTHON_INTERN],
+[
+AC_REQUIRE([KDE_CHECK_LIBDL])
+AC_REQUIRE([KDE_CHECK_LIBPTHREAD])
+AC_REQUIRE([KDE_CHECK_PYTHON_DIR])
+
+if test -z "$1"; then
+ version="1.5"
+else
+ version="$1"
+fi
+
+AC_MSG_CHECKING([for Python$version])
+
+python_incdirs="$ac_python_dir/include /usr/include /usr/local/include/ $kde_extra_includes"
+AC_FIND_FILE(Python.h, $python_incdirs, python_incdir)
+if test ! -r $python_incdir/Python.h; then
+ AC_FIND_FILE(python$version/Python.h, $python_incdirs, python_incdir)
+ python_incdir=$python_incdir/python$version
+ if test ! -r $python_incdir/Python.h; then
+ python_incdir=no
+ fi
+fi
+
+PYTHONINC=-I$python_incdir
+
+python_libdirs="$ac_python_dir/lib$kdelibsuff /usr/lib$kdelibsuff /usr/local /usr/lib$kdelibsuff $kde_extra_libs"
+AC_FIND_FILE(libpython$version.so, $python_libdirs, python_libdir)
+if test ! -r $python_libdir/libpython$version.so; then
+ AC_FIND_FILE(libpython$version.a, $python_libdirs, python_libdir)
+ if test ! -r $python_libdir/libpython$version.a; then
+ AC_FIND_FILE(python$version/config/libpython$version.a, $python_libdirs, python_libdir)
+ python_libdir=$python_libdir/python$version/config
+ if test ! -r $python_libdir/libpython$version.a; then
+ python_libdir=no
+ fi
+ fi
+fi
+
+PYTHONLIB=-L$python_libdir
+kde_orig_LIBPYTHON=$LIBPYTHON
+if test -z "$LIBPYTHON"; then
+ LIBPYTHON=-lpython$version
+fi
+
+AC_FIND_FILE(python$version/copy.py, $python_libdirs, python_moddir)
+python_moddir=$python_moddir/python$version
+if test ! -r $python_moddir/copy.py; then
+ python_moddir=no
+fi
+
+PYTHONMODDIR=$python_moddir
+
+AC_MSG_RESULT(header $python_incdir library $python_libdir modules $python_moddir)
+
+if test x$python_incdir = xno || test x$python_libdir = xno || test x$python_moddir = xno; then
+ LIBPYTHON=$kde_orig_LIBPYTHON
+ test "x$PYTHONLIB" = "x-Lno" && PYTHONLIB=""
+ test "x$PYTHONINC" = "x-Ino" && PYTHONINC=""
+ $2
+else
+ dnl Note: this test is very weak
+ kde_python_link_found=no
+ KDE_TRY_LINK_PYTHON(normal)
+ KDE_TRY_LINK_PYTHON(m, -lm)
+ KDE_TRY_LINK_PYTHON(pthread, $LIBPTHREAD)
+ KDE_TRY_LINK_PYTHON(tcl, -ltcl)
+ KDE_TRY_LINK_PYTHON(db2, -ldb2)
+ KDE_TRY_LINK_PYTHON(m_and_thread, [$LIBPTHREAD -lm])
+ KDE_TRY_LINK_PYTHON(m_and_thread_and_util, [$LIBPTHREAD -lm -lutil])
+ KDE_TRY_LINK_PYTHON(m_and_thread_and_db3, [$LIBPTHREAD -lm -ldb-3 -lutil])
+ KDE_TRY_LINK_PYTHON(pthread_and_db3, [$LIBPTHREAD -ldb-3])
+ KDE_TRY_LINK_PYTHON(m_and_thread_and_db, [$LIBPTHREAD -lm -ldb -ltermcap -lutil])
+ KDE_TRY_LINK_PYTHON(pthread_and_dl, [$LIBPTHREAD $LIBDL -lutil -lreadline -lncurses -lm])
+ KDE_TRY_LINK_PYTHON(pthread_and_panel_curses, [$LIBPTHREAD $LIBDL -lm -lpanel -lcurses])
+ KDE_TRY_LINK_PYTHON(m_and_thread_and_db_special, [$LIBPTHREAD -lm -ldb -lutil], [],
+ [AC_MSG_WARN([it seems, Python depends on another library.
+ Please set LIBPYTHON to '-lpython$version -lotherlib' before calling configure to fix this
+ and contact the authors to let them know about this problem])
+ ])
+
+ LIBPYTHON="$LIBPYTHON $LIBDL $LIBSOCKET"
+ AC_SUBST(PYTHONINC)
+ AC_SUBST(PYTHONLIB)
+ AC_SUBST(LIBPYTHON)
+ AC_SUBST(PYTHONMODDIR)
+ AC_DEFINE(HAVE_PYTHON, 1, [Define if you have the development files for python])
+fi
+
+])
+
+
+AC_DEFUN([KDE_CHECK_PYTHON],
+[
+ KDE_CHECK_PYTHON_INTERN("2.5",
+ [KDE_CHECK_PYTHON_INTERN("2.4",
+ [KDE_CHECK_PYTHON_INTERN("2.3",
+ [KDE_CHECK_PYTHON_INTERN("2.2",
+ [KDE_CHECK_PYTHON_INTERN("2.1",
+ [KDE_CHECK_PYTHON_INTERN("2.0",
+ [KDE_CHECK_PYTHON_INTERN($1, $2) ])
+ ])
+ ])
+ ])
+ ])
+ ])
+])
+
+AC_DEFUN([KDE_CHECK_STL],
+[
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ ac_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="`echo $CXXFLAGS | sed s/-fno-exceptions//`"
+
+ AC_MSG_CHECKING([if C++ programs can be compiled])
+ AC_CACHE_VAL(kde_cv_stl_works,
+ [
+ AC_TRY_COMPILE([
+#include <string>
+using namespace std;
+],[
+ string astring="Hallo Welt.";
+ astring.erase(0, 6); // now astring is "Welt"
+ return 0;
+], kde_cv_stl_works=yes,
+ kde_cv_stl_works=no)
+])
+
+ AC_MSG_RESULT($kde_cv_stl_works)
+
+ if test "$kde_cv_stl_works" = "yes"; then
+ # back compatible
+ AC_DEFINE_UNQUOTED(HAVE_SGI_STL, 1, [Define if you have a STL implementation by SGI])
+ else
+ AC_MSG_ERROR([Your Installation isn't able to compile simple C++ programs.
+Check config.log for details - if you're using a Linux distribution you might miss
+a package named similar to libstdc++-dev.])
+ fi
+
+ CXXFLAGS="$ac_save_CXXFLAGS"
+ AC_LANG_RESTORE
+])
+
+AC_DEFUN([AC_FIND_QIMGIO],
+ [AC_REQUIRE([AC_FIND_JPEG])
+AC_REQUIRE([KDE_CHECK_EXTRA_LIBS])
+AC_MSG_CHECKING([for qimgio])
+AC_CACHE_VAL(ac_cv_lib_qimgio,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+ac_save_LIBS="$LIBS"
+ac_save_CXXFLAGS="$CXXFLAGS"
+LIBS="$all_libraries -lqimgio -lpng -lz $LIBJPEG $LIBQT"
+CXXFLAGS="$CXXFLAGS -I$qt_incdir $all_includes"
+AC_TRY_RUN(dnl
+[
+#include <qimageio.h>
+#include <qstring.h>
+int main() {
+ QString t = "hallo";
+ t.fill('t');
+ qInitImageIO();
+}
+],
+ ac_cv_lib_qimgio=yes,
+ ac_cv_lib_qimgio=no,
+ ac_cv_lib_qimgio=no)
+LIBS="$ac_save_LIBS"
+CXXFLAGS="$ac_save_CXXFLAGS"
+AC_LANG_RESTORE
+])dnl
+if eval "test \"`echo $ac_cv_lib_qimgio`\" = yes"; then
+ LIBQIMGIO="-lqimgio -lpng -lz $LIBJPEG"
+ AC_MSG_RESULT(yes)
+ AC_DEFINE_UNQUOTED(HAVE_QIMGIO, 1, [Define if you have the Qt extension qimgio available])
+ AC_SUBST(LIBQIMGIO)
+else
+ AC_MSG_RESULT(not found)
+fi
+])
+
+AC_DEFUN([AM_DISABLE_LIBRARIES],
+[
+ AC_PROVIDE([AM_ENABLE_STATIC])
+ AC_PROVIDE([AM_ENABLE_SHARED])
+ enable_static=no
+ enable_shared=yes
+])
+
+
+AC_DEFUN([AC_CHECK_UTMP_FILE],
+[
+ AC_MSG_CHECKING([for utmp file])
+
+ AC_CACHE_VAL(kde_cv_utmp_file,
+ [
+ kde_cv_utmp_file=no
+
+ for ac_file in \
+ \
+ /var/run/utmp \
+ /var/adm/utmp \
+ /etc/utmp \
+ ; \
+ do
+ if test -r "$ac_file"; then
+ kde_cv_utmp_file=$ac_file
+ break
+ fi
+ done
+ ])
+
+ if test "$kde_cv_utmp_file" != "no"; then
+ AC_DEFINE_UNQUOTED(UTMP, "$kde_cv_utmp_file", [Define the file for utmp entries])
+ $1
+ AC_MSG_RESULT($kde_cv_utmp_file)
+ else
+ $2
+ AC_MSG_RESULT([non found])
+ fi
+])
+
+
+AC_DEFUN([KDE_CREATE_SUBDIRSLIST],
+[
+
+DO_NOT_COMPILE="$DO_NOT_COMPILE CVS debian bsd-port admin"
+TOPSUBDIRS=""
+
+if test ! -s $srcdir/subdirs; then
+ dnl Note: Makefile.common creates subdirs, so this is just a fallback
+ files=`cd $srcdir && ls -1`
+ dirs=`for i in $files; do if test -d $i; then echo $i; fi; done`
+ for i in $dirs; do
+ echo $i >> $srcdir/subdirs
+ done
+fi
+
+ac_topsubdirs=
+if test -s $srcdir/inst-apps; then
+ ac_topsubdirs="`cat $srcdir/inst-apps`"
+elif test -s $srcdir/subdirs; then
+ ac_topsubdirs="`cat $srcdir/subdirs`"
+fi
+
+for i in $ac_topsubdirs; do
+ AC_MSG_CHECKING([if $i should be compiled])
+ if test -d $srcdir/$i; then
+ install_it="yes"
+ for j in $DO_NOT_COMPILE; do
+ if test $i = $j; then
+ install_it="no"
+ fi
+ done
+ else
+ install_it="no"
+ fi
+ AC_MSG_RESULT($install_it)
+ vari=`echo $i | sed -e 's,[[-+.@]],_,g'`
+ if test $install_it = "yes"; then
+ TOPSUBDIRS="$TOPSUBDIRS $i"
+ eval "$vari""_SUBDIR_included=yes"
+ else
+ eval "$vari""_SUBDIR_included=no"
+ fi
+done
+
+AC_SUBST(TOPSUBDIRS)
+])
+
+AC_DEFUN([KDE_CHECK_NAMESPACES],
+[
+AC_MSG_CHECKING(whether C++ compiler supports namespaces)
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+AC_TRY_COMPILE([
+],
+[
+namespace Foo {
+ extern int i;
+ namespace Bar {
+ extern int i;
+ }
+}
+
+int Foo::i = 0;
+int Foo::Bar::i = 1;
+],[
+ AC_MSG_RESULT(yes)
+ AC_DEFINE(HAVE_NAMESPACES)
+], [
+AC_MSG_RESULT(no)
+])
+AC_LANG_RESTORE
+])
+
+dnl ------------------------------------------------------------------------
+dnl Check for S_ISSOCK macro. Doesn't exist on Unix SCO. faure@kde.org
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_CHECK_S_ISSOCK],
+[
+AC_MSG_CHECKING(for S_ISSOCK)
+AC_CACHE_VAL(ac_cv_have_s_issock,
+[
+AC_TRY_LINK(
+[
+#include <sys/stat.h>
+],
+[
+struct stat buff;
+int b = S_ISSOCK( buff.st_mode );
+],
+ac_cv_have_s_issock=yes,
+ac_cv_have_s_issock=no)
+])
+AC_MSG_RESULT($ac_cv_have_s_issock)
+if test "$ac_cv_have_s_issock" = "yes"; then
+ AC_DEFINE_UNQUOTED(HAVE_S_ISSOCK, 1, [Define if sys/stat.h declares S_ISSOCK.])
+fi
+
+AH_VERBATIM(_ISSOCK,
+[
+#ifndef HAVE_S_ISSOCK
+#define HAVE_S_ISSOCK
+#define S_ISSOCK(mode) (1==0)
+#endif
+])
+
+])
+
+dnl ------------------------------------------------------------------------
+dnl Check for MAXPATHLEN macro, defines KDEMAXPATHLEN. faure@kde.org
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([AC_CHECK_KDEMAXPATHLEN],
+[
+AC_MSG_CHECKING(for MAXPATHLEN)
+AC_CACHE_VAL(ac_cv_maxpathlen,
+[
+cat > conftest.$ac_ext <<EOF
+#ifdef STDC_HEADERS
+# include <stdlib.h>
+#endif
+#include <stdio.h>
+#include <sys/param.h>
+#ifndef MAXPATHLEN
+#define MAXPATHLEN 1024
+#endif
+
+KDE_HELLO MAXPATHLEN
+
+EOF
+
+ac_try="$ac_cpp conftest.$ac_ext 2>/dev/null | grep '^KDE_HELLO' >conftest.out"
+
+if AC_TRY_EVAL(ac_try) && test -s conftest.out; then
+ ac_cv_maxpathlen=`sed 's#KDE_HELLO ##' conftest.out`
+else
+ ac_cv_maxpathlen=1024
+fi
+
+rm conftest.*
+
+])
+AC_MSG_RESULT($ac_cv_maxpathlen)
+AC_DEFINE_UNQUOTED(KDEMAXPATHLEN,$ac_cv_maxpathlen, [Define a safe value for MAXPATHLEN] )
+])
+
+AC_DEFUN([KDE_CHECK_HEADER],
+[
+ kde_safe_cppflags=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS $all_includes"
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_CHECK_HEADER([$1], [$2], [$3], [$4])
+ AC_LANG_RESTORE
+ CPPFLAGS=$kde_safe_cppflags
+])
+
+AC_DEFUN([KDE_CHECK_HEADERS],
+[
+ AH_CHECK_HEADERS([$1])
+ AC_LANG_SAVE
+ kde_safe_cppflags=$CPPFLAGS
+ CPPFLAGS="$CPPFLAGS $all_includes"
+ AC_LANG_CPLUSPLUS
+ AC_CHECK_HEADERS([$1], [$2], [$3], [$4])
+ CPPFLAGS=$kde_safe_cppflags
+ AC_LANG_RESTORE
+])
+
+AC_DEFUN([KDE_FAST_CONFIGURE],
+[
+ dnl makes configure fast (needs perl)
+ AC_ARG_ENABLE(fast-perl, AC_HELP_STRING([--disable-fast-perl],[disable fast Makefile generation (needs perl)]),
+ with_fast_perl=$enableval, with_fast_perl=yes)
+])
+
+AC_DEFUN([KDE_CONF_FILES],
+[
+ val=
+ if test -f $srcdir/configure.files ; then
+ val=`sed -e 's%^%\$(top_srcdir)/%' $srcdir/configure.files`
+ fi
+ CONF_FILES=
+ if test -n "$val" ; then
+ for i in $val ; do
+ CONF_FILES="$CONF_FILES $i"
+ done
+ fi
+ AC_SUBST(CONF_FILES)
+])dnl
+
+dnl This sets the prefix, for arts and kdelibs
+dnl Do NOT use in any other module.
+dnl It only looks at --prefix, KDEDIR and falls back to /usr/local/kde
+AC_DEFUN([KDE_SET_PREFIX_CORE],
+[
+ unset CDPATH
+ dnl make $KDEDIR the default for the installation
+ AC_PREFIX_DEFAULT(${KDEDIR:-/usr/local/kde})
+
+ if test "x$prefix" = "xNONE"; then
+ prefix=$ac_default_prefix
+ ac_configure_args="$ac_configure_args --prefix=$prefix"
+ fi
+ # And delete superfluous '/' to make compares easier
+ prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'`
+ exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'`
+
+ kde_libs_prefix='$(prefix)'
+ kde_libs_htmldir='$(kde_htmldir)'
+ AC_SUBST(kde_libs_prefix)
+ AC_SUBST(kde_libs_htmldir)
+ KDE_FAST_CONFIGURE
+ KDE_CONF_FILES
+])
+
+
+AC_DEFUN([KDE_SET_PREFIX],
+[
+ unset CDPATH
+ dnl We can't give real code to that macro, only a value.
+ dnl It only matters for --help, since we set the prefix in this function anyway.
+ AC_PREFIX_DEFAULT(${KDEDIR:-the kde prefix})
+
+ KDE_SET_DEFAULT_BINDIRS
+ if test "x$prefix" = "xNONE"; then
+ dnl no prefix given: look for kde-config in the PATH and deduce the prefix from it
+ KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend)
+ else
+ dnl prefix given: look for kde-config, preferrably in prefix, otherwise in PATH
+ kde_save_PATH="$PATH"
+ PATH="$exec_prefix/bin:$prefix/bin:$PATH"
+ KDE_FIND_PATH(kde-config, KDECONFIG, [$kde_default_bindirs], [KDE_MISSING_PROG_ERROR(kde-config)], [], prepend)
+ PATH="$kde_save_PATH"
+ fi
+
+ kde_libs_prefix=`$KDECONFIG --prefix`
+ if test -z "$kde_libs_prefix" || test ! -x "$kde_libs_prefix"; then
+ AC_MSG_ERROR([$KDECONFIG --prefix outputed the non existant prefix '$kde_libs_prefix' for kdelibs.
+ This means it has been moved since you installed it.
+ This won't work. Please recompile kdelibs for the new prefix.
+ ])
+ fi
+ kde_libs_htmldir=`$KDECONFIG --install html --expandvars`
+
+ AC_MSG_CHECKING([where to install])
+ if test "x$prefix" = "xNONE"; then
+ prefix=$kde_libs_prefix
+ AC_MSG_RESULT([$prefix (as returned by kde-config)])
+ else
+ dnl --prefix was given. Compare prefixes and warn (in configure.in.bot.end) if different
+ given_prefix=$prefix
+ AC_MSG_RESULT([$prefix (as requested)])
+ fi
+
+ # And delete superfluous '/' to make compares easier
+ prefix=`echo "$prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'`
+ exec_prefix=`echo "$exec_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'`
+ given_prefix=`echo "$given_prefix" | sed 's,//*,/,g' | sed -e 's,/$,,'`
+
+ AC_SUBST(KDECONFIG)
+ AC_SUBST(kde_libs_prefix)
+ AC_SUBST(kde_libs_htmldir)
+
+ KDE_FAST_CONFIGURE
+ KDE_CONF_FILES
+])
+
+pushdef([AC_PROG_INSTALL],
+[
+ dnl our own version, testing for a -p flag
+ popdef([AC_PROG_INSTALL])
+ dnl as AC_PROG_INSTALL works as it works we first have
+ dnl to save if the user didn't specify INSTALL, as the
+ dnl autoconf one overwrites INSTALL and we have no chance to find
+ dnl out afterwards
+ test -n "$INSTALL" && kde_save_INSTALL_given=$INSTALL
+ test -n "$INSTALL_PROGRAM" && kde_save_INSTALL_PROGRAM_given=$INSTALL_PROGRAM
+ test -n "$INSTALL_SCRIPT" && kde_save_INSTALL_SCRIPT_given=$INSTALL_SCRIPT
+ AC_PROG_INSTALL
+
+ if test -z "$kde_save_INSTALL_given" ; then
+ # OK, user hasn't given any INSTALL, autoconf found one for us
+ # now we test, if it supports the -p flag
+ AC_MSG_CHECKING(for -p flag to install)
+ rm -f confinst.$$.* > /dev/null 2>&1
+ echo "Testtest" > confinst.$$.orig
+ ac_res=no
+ if ${INSTALL} -p confinst.$$.orig confinst.$$.new > /dev/null 2>&1 ; then
+ if test -f confinst.$$.new ; then
+ # OK, -p seems to do no harm to install
+ INSTALL="${INSTALL} -p"
+ ac_res=yes
+ fi
+ fi
+ rm -f confinst.$$.*
+ AC_MSG_RESULT($ac_res)
+ fi
+ dnl the following tries to resolve some signs and wonders coming up
+ dnl with different autoconf/automake versions
+ dnl e.g.:
+ dnl *automake 1.4 install-strip sets A_M_INSTALL_PROGRAM_FLAGS to -s
+ dnl and has INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(A_M_INSTALL_PROGRAM_FLAGS)
+ dnl it header-vars.am, so there the actual INSTALL_PROGRAM gets the -s
+ dnl *automake 1.4a (and above) use INSTALL_STRIP_FLAG and only has
+ dnl INSTALL_PROGRAM = @INSTALL_PROGRAM@ there, but changes the
+ dnl install-@DIR@PROGRAMS targets to explicitly use that flag
+ dnl *autoconf 2.13 is dumb, and thinks it can use INSTALL_PROGRAM as
+ dnl INSTALL_SCRIPT, which breaks with automake <= 1.4
+ dnl *autoconf >2.13 (since 10.Apr 1999) has not that failure
+ dnl *sometimes KDE does not use the install-@DIR@PROGRAM targets from
+ dnl automake (due to broken Makefile.am or whatever) to install programs,
+ dnl and so does not see the -s flag in automake > 1.4
+ dnl to clean up that mess we:
+ dnl +set INSTALL_PROGRAM to use INSTALL_STRIP_FLAG
+ dnl which cleans KDE's program with automake > 1.4;
+ dnl +set INSTALL_SCRIPT to only use INSTALL, to clean up autoconf's problems
+ dnl with automake<=1.4
+ dnl note that dues to this sometimes two '-s' flags are used (if KDE
+ dnl properly uses install-@DIR@PROGRAMS, but I don't care
+ dnl
+ dnl And to all this comes, that I even can't write in comments variable
+ dnl names used by automake, because it is so stupid to think I wanted to
+ dnl _use_ them, therefor I have written A_M_... instead of AM_
+ dnl hmm, I wanted to say something ... ahh yes: Arghhh.
+
+ if test -z "$kde_save_INSTALL_PROGRAM_given" ; then
+ INSTALL_PROGRAM='${INSTALL} $(INSTALL_STRIP_FLAG)'
+ fi
+ if test -z "$kde_save_INSTALL_SCRIPT_given" ; then
+ INSTALL_SCRIPT='${INSTALL}'
+ fi
+])dnl
+
+AC_DEFUN([KDE_LANG_CPLUSPLUS],
+[AC_LANG_CPLUSPLUS
+ac_link='rm -rf SunWS_cache; ${CXX-g++} -o conftest${ac_exeext} $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&AC_FD_CC'
+pushdef([AC_LANG_CPLUSPLUS], [popdef([AC_LANG_CPLUSPLUS]) KDE_LANG_CPLUSPLUS])
+])
+
+pushdef([AC_LANG_CPLUSPLUS],
+[popdef([AC_LANG_CPLUSPLUS])
+KDE_LANG_CPLUSPLUS
+])
+
+AC_DEFUN([KDE_CHECK_LONG_LONG],
+[
+AC_MSG_CHECKING(for long long)
+AC_CACHE_VAL(kde_cv_c_long_long,
+[
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ AC_TRY_LINK([], [
+ long long foo = 0;
+ foo = foo+1;
+ ],
+ kde_cv_c_long_long=yes, kde_cv_c_long_long=no)
+ AC_LANG_RESTORE
+])
+AC_MSG_RESULT($kde_cv_c_long_long)
+if test "$kde_cv_c_long_long" = yes; then
+ AC_DEFINE(HAVE_LONG_LONG, 1, [Define if you have long long as datatype])
+fi
+])
+
+AC_DEFUN([KDE_CHECK_LIB],
+[
+ kde_save_LDFLAGS="$LDFLAGS"
+ dnl AC_CHECK_LIB modifies LIBS, so save it here
+ kde_save_LIBS="$LIBS"
+ LDFLAGS="$LDFLAGS $all_libraries"
+ case $host_os in
+ aix*) LDFLAGS="-brtl $LDFLAGS"
+ test "$GCC" = yes && LDFLAGS="-Wl,$LDFLAGS"
+ ;;
+ esac
+ AC_CHECK_LIB($1, $2, $3, $4, $5)
+ LDFLAGS="$kde_save_LDFLAGS"
+ LIBS="$kde_save_LIBS"
+])
+
+AC_DEFUN([KDE_JAVA_PREFIX],
+[
+ dir=`dirname "$1"`
+ base=`basename "$1"`
+ list=`ls -1 $dir 2> /dev/null`
+ for entry in $list; do
+ if test -d $dir/$entry/bin; then
+ case $entry in
+ $base)
+ javadirs="$javadirs $dir/$entry/bin"
+ ;;
+ esac
+ elif test -d $dir/$entry/jre/bin; then
+ case $entry in
+ $base)
+ javadirs="$javadirs $dir/$entry/jre/bin"
+ ;;
+ esac
+ fi
+ done
+])
+
+dnl KDE_CHEC_JAVA_DIR(onlyjre)
+AC_DEFUN([KDE_CHECK_JAVA_DIR],
+[
+
+AC_ARG_WITH(java,
+AC_HELP_STRING([--with-java=javadir],[use java installed in javadir, --without-java disables]),
+[ ac_java_dir=$withval
+], ac_java_dir=""
+)
+
+AC_MSG_CHECKING([for Java])
+
+dnl at this point ac_java_dir is either a dir, 'no' to disable, or '' to say look in $PATH
+if test "x$ac_java_dir" = "xno"; then
+ kde_java_bindir=no
+ kde_java_includedir=no
+ kde_java_libjvmdir=no
+ kde_java_libgcjdir=no
+ kde_java_libhpidir=no
+else
+ if test "x$ac_java_dir" = "x"; then
+
+
+ dnl No option set -> collect list of candidate paths
+ if test -n "$JAVA_HOME"; then
+ KDE_JAVA_PREFIX($JAVA_HOME)
+ fi
+ KDE_JAVA_PREFIX(/usr/j2se)
+ KDE_JAVA_PREFIX(/usr/lib/j2se)
+ KDE_JAVA_PREFIX(/usr/j*dk*)
+ KDE_JAVA_PREFIX(/usr/lib/j*dk*)
+ KDE_JAVA_PREFIX(/opt/j*sdk*)
+ KDE_JAVA_PREFIX(/usr/lib/java*)
+ KDE_JAVA_PREFIX(/usr/java*)
+ KDE_JAVA_PREFIX(/usr/java/j*dk*)
+ KDE_JAVA_PREFIX(/usr/java/j*re*)
+ KDE_JAVA_PREFIX(/usr/lib/SunJava2*)
+ KDE_JAVA_PREFIX(/usr/lib/SunJava*)
+ KDE_JAVA_PREFIX(/usr/lib/IBMJava2*)
+ KDE_JAVA_PREFIX(/usr/lib/IBMJava*)
+ KDE_JAVA_PREFIX(/opt/java*)
+
+ kde_cv_path="NONE"
+ kde_save_IFS=$IFS
+ IFS=':'
+ for dir in $PATH; do
+ if test -d "$dir"; then
+ javadirs="$javadirs $dir"
+ fi
+ done
+ IFS=$kde_save_IFS
+ jredirs=
+
+ dnl Now javadirs contains a list of paths that exist, all ending with bin/
+ for dir in $javadirs; do
+ dnl Check for the java executable
+ if test -x "$dir/java"; then
+ sane_path=$(cd $dir; /bin/pwd)
+ dnl And also check for a libjvm.so somewhere under there
+ dnl Since we have to go to the parent dir, /usr/bin is excluded, /usr is too big.
+ if test "$sane_path" != "/usr/bin"; then
+ libjvmdir=`find $dir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1`
+ if test ! -f $libjvmdir/libjvm.so; then continue; fi
+ jredirs="$jredirs $dir"
+ fi
+ fi
+ done
+
+ dnl Now jredirs contains a reduced list, of paths where both java and ../**/libjvm.so was found
+ JAVAC=
+ JAVA=
+ kde_java_bindir=no
+ for dir in $jredirs; do
+ JAVA="$dir/java"
+ kde_java_bindir=$dir
+ if test -x "$dir/javac"; then
+ JAVAC="$dir/javac"
+ break
+ fi
+ done
+
+ if test -n "$JAVAC"; then
+ dnl this substitution might not work - well, we test for jni.h below
+ kde_java_includedir=`echo $JAVAC | sed -e 's,bin/javac$,include/,'`
+ else
+ kde_java_includedir=no
+ fi
+ else
+ dnl config option set
+ kde_java_bindir=$ac_java_dir/bin
+ if test -x $ac_java_dir/bin/java && test ! -x $ac_java_dir/bin/javac; then
+ kde_java_includedir=no
+ else
+ kde_java_includedir=$ac_java_dir/include
+ fi
+ fi
+fi
+
+dnl At this point kde_java_bindir and kde_java_includedir are either set or "no"
+if test "x$kde_java_bindir" != "xno"; then
+
+ dnl Look for libjvm.so
+ kde_java_libjvmdir=`find $kde_java_bindir/.. -name libjvm.so | sed 's,libjvm.so,,'|head -n 1`
+ dnl Look for libgcj.so
+ kde_java_libgcjdir=`find $kde_java_bindir/.. -name libgcj.so | sed 's,libgcj.so,,'|head -n 1`
+ dnl Look for libhpi.so and avoid green threads
+ kde_java_libhpidir=`find $kde_java_bindir/.. -name libhpi.so | grep -v green | sed 's,libhpi.so,,' | head -n 1`
+
+ dnl Now check everything's fine under there
+ dnl the include dir is our flag for having the JDK
+ if test -d "$kde_java_includedir"; then
+ if test ! -x "$kde_java_bindir/javac"; then
+ AC_MSG_ERROR([javac not found under $kde_java_bindir - it seems you passed a wrong --with-java.])
+ fi
+ if test ! -x "$kde_java_bindir/javah"; then
+ AC_MSG_ERROR([javah not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.])
+ fi
+ if test ! -x "$kde_java_bindir/jar"; then
+ AC_MSG_ERROR([jar not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.])
+ fi
+ if test ! -r "$kde_java_includedir/jni.h"; then
+ AC_MSG_ERROR([jni.h not found under $kde_java_includedir. Use --with-java or --without-java.])
+ fi
+
+ jni_includes="-I$kde_java_includedir"
+ dnl Strange thing, jni.h requires jni_md.h which is under genunix here..
+ dnl and under linux here..
+
+ dnl not needed for gcj
+
+ if test "x$kde_java_libgcjdir" = "x"; then
+ test -d "$kde_java_includedir/linux" && jni_includes="$jni_includes -I$kde_java_includedir/linux"
+ test -d "$kde_java_includedir/solaris" && jni_includes="$jni_includes -I$kde_java_includedir/solaris"
+ test -d "$kde_java_includedir/genunix" && jni_includes="$jni_includes -I$kde_java_includedir/genunix"
+ fi
+
+ else
+ JAVAC=
+ jni_includes=
+ fi
+
+ if test "x$kde_java_libgcjdir" = "x"; then
+ if test ! -r "$kde_java_libjvmdir/libjvm.so"; then
+ AC_MSG_ERROR([libjvm.so not found under $kde_java_libjvmdir. Use --without-java.])
+ fi
+ else
+ if test ! -r "$kde_java_libgcjdir/libgcj.so"; then
+ AC_MSG_ERROR([libgcj.so not found under $kde_java_libgcjdir. Use --without-java.])
+ fi
+ fi
+
+ if test ! -x "$kde_java_bindir/java"; then
+ AC_MSG_ERROR([java not found under $kde_java_bindir. javac was found though! Use --with-java or --without-java.])
+ fi
+
+ dnl not needed for gcj compile
+
+ if test "x$kde_java_libgcjdir" = "x"; then
+ if test ! -r "$kde_java_libhpidir/libhpi.so"; then
+ AC_MSG_ERROR([libhpi.so not found under $kde_java_libhpidir. Use --without-java.])
+ fi
+ fi
+
+ if test -n "$jni_includes"; then
+ dnl Check for JNI version
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ ac_cxxflags_safe="$CXXFLAGS"
+ CXXFLAGS="$CXXFLAGS $all_includes $jni_includes"
+
+ AC_TRY_COMPILE([
+ #include <jni.h>
+ ],
+ [
+ #ifndef JNI_VERSION_1_2
+ Syntax Error
+ #endif
+ ],[ kde_jni_works=yes ],
+ [ kde_jni_works=no ])
+
+ if test $kde_jni_works = no; then
+ AC_MSG_ERROR([Incorrect version of $kde_java_includedir/jni.h.
+ You need to have Java Development Kit (JDK) version 1.2.
+
+ Use --with-java to specify another location.
+ Use --without-java to configure without java support.
+ Or download a newer JDK and try again.
+ See e.g. http://java.sun.com/products/jdk/1.2 ])
+ fi
+
+ CXXFLAGS="$ac_cxxflags_safe"
+ AC_LANG_RESTORE
+
+ dnl All tests ok, inform and subst the variables
+
+ JAVAC=$kde_java_bindir/javac
+ JAVAH=$kde_java_bindir/javah
+ JAR=$kde_java_bindir/jar
+ AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is])
+ if test "x$kde_java_libgcjdir" = "x"; then
+ JVMLIBS="-L$kde_java_libjvmdir -ljvm -L$kde_java_libhpidir -lhpi"
+ else
+ JVMLIBS="-L$kde_java_libgcjdir -lgcj"
+ fi
+ AC_MSG_RESULT([java JDK in $kde_java_bindir])
+
+ else
+ AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is])
+ AC_MSG_RESULT([java JRE in $kde_java_bindir])
+ fi
+elif test -d "/Library/Java/Home"; then
+ kde_java_bindir="/Library/Java/Home/bin"
+ jni_includes="-I/Library/Java/Home/include"
+
+ JAVAC=$kde_java_bindir/javac
+ JAVAH=$kde_java_bindir/javah
+ JAR=$kde_java_bindir/jar
+ JVMLIBS="-Wl,-framework,JavaVM"
+
+ AC_DEFINE_UNQUOTED(PATH_JAVA, "$kde_java_bindir/java", [Define where your java executable is])
+ AC_MSG_RESULT([Apple Java Framework])
+else
+ AC_MSG_RESULT([none found])
+fi
+
+AC_SUBST(JAVAC)
+AC_SUBST(JAVAH)
+AC_SUBST(JAR)
+AC_SUBST(JVMLIBS)
+AC_SUBST(jni_includes)
+
+# for backward compat
+kde_cv_java_includedir=$kde_java_includedir
+kde_cv_java_bindir=$kde_java_bindir
+])
+
+dnl this is a redefinition of autoconf 2.5x's AC_FOREACH.
+dnl When the argument list becomes big, as in KDE for AC_OUTPUT in
+dnl big packages, m4_foreach is dog-slow. So use our own version of
+dnl it. (matz@kde.org)
+m4_define([mm_foreach],
+[m4_pushdef([$1])_mm_foreach($@)m4_popdef([$1])])
+m4_define([mm_car], [[$1]])
+m4_define([mm_car2], [[$@]])
+m4_define([_mm_foreach],
+[m4_if(m4_quote($2), [], [],
+ [m4_define([$1], mm_car($2))$3[]_mm_foreach([$1],
+ mm_car2(m4_shift($2)),
+ [$3])])])
+m4_define([AC_FOREACH],
+[mm_foreach([$1], m4_split(m4_normalize([$2])), [$3])])
+
+AC_DEFUN([KDE_NEED_FLEX],
+[
+kde_libs_safe=$LIBS
+LIBS="$LIBS $USER_LDFLAGS"
+AM_PROG_LEX
+LIBS=$kde_libs_safe
+if test -z "$LEXLIB"; then
+ AC_MSG_ERROR([You need to have flex installed.])
+fi
+AC_SUBST(LEXLIB)
+])
+
+AC_DEFUN([AC_PATH_QTOPIA],
+[
+ dnl TODO: use AC_CACHE_VAL
+
+ if test -z "$1"; then
+ qtopia_minver_maj=1
+ qtopia_minver_min=5
+ qtopia_minver_pat=0
+ else
+ qtopia_minver_maj=`echo "$1" | sed -e "s/^\(.*\)\..*\..*$/\1/"`
+ qtopia_minver_min=`echo "$1" | sed -e "s/^.*\.\(.*\)\..*$/\1/"`
+ qtopia_minver_pat=`echo "$1" | sed -e "s/^.*\..*\.\(.*\)$/\1/"`
+ fi
+
+ qtopia_minver="$qtopia_minver_maj$qtopia_minver_min$qtopia_minver_pat"
+ qtopia_minverstr="$qtopia_minver_maj.$qtopia_minver_min.$qtopia_minver_pat"
+
+ AC_REQUIRE([AC_PATH_QT])
+
+ AC_MSG_CHECKING([for Qtopia])
+
+ LIB_QTOPIA="-lqpe"
+ AC_SUBST(LIB_QTOPIA)
+
+ kde_qtopia_dirs="$QPEDIR /opt/Qtopia"
+
+ ac_qtopia_incdir=NO
+
+ AC_ARG_WITH(qtopia-dir,
+ AC_HELP_STRING([--with-qtopia-dir=DIR],[where the root of Qtopia is installed]),
+ [ ac_qtopia_incdir="$withval"/include] )
+
+ qtopia_incdirs=""
+ for dir in $kde_qtopia_dirs; do
+ qtopia_incdirs="$qtopia_incdirs $dir/include"
+ done
+
+ if test ! "$ac_qtopia_incdir" = "NO"; then
+ qtopia_incdirs="$ac_qtopia_incdir $qtopia_incdirs"
+ fi
+
+ qtopia_incdir=""
+ AC_FIND_FILE(qpe/qpeapplication.h, $qtopia_incdirs, qtopia_incdir)
+ ac_qtopia_incdir="$qtopia_incdir"
+
+ if test -z "$qtopia_incdir"; then
+ AC_MSG_ERROR([Cannot find Qtopia headers. Please check your installation.])
+ fi
+
+ qtopia_ver_maj=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION "\(.*\)\..*\..*".*,\1,p'`;
+ qtopia_ver_min=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\.\(.*\)\..*".*,\1,p'`;
+ qtopia_ver_pat=`cat $qtopia_incdir/qpe/version.h | sed -n -e 's,.*QPE_VERSION ".*\..*\.\(.*\)".*,\1,p'`;
+
+ qtopia_ver="$qtopia_ver_maj$qtopia_ver_min$qtopia_ver_pat"
+ qtopia_verstr="$qtopia_ver_maj.$qtopia_ver_min.$qtopia_ver_pat"
+ if test "$qtopia_ver" -lt "$qtopia_minver"; then
+ AC_MSG_ERROR([found Qtopia version $qtopia_verstr but version $qtopia_minverstr
+is required.])
+ fi
+
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+
+ ac_cxxflags_safe="$CXXFLAGS"
+ ac_ldflags_safe="$LDFLAGS"
+ ac_libs_safe="$LIBS"
+
+ CXXFLAGS="$CXXFLAGS -I$qtopia_incdir $all_includes"
+ LDFLAGS="$LDFLAGS $QT_LDFLAGS $all_libraries $USER_LDFLAGS $KDE_MT_LDFLAGS"
+ LIBS="$LIBS $LIB_QTOPIA $LIBQT"
+
+ cat > conftest.$ac_ext <<EOF
+#include "confdefs.h"
+#include <qpe/qpeapplication.h>
+#include <qpe/version.h>
+
+int main( int argc, char **argv )
+{
+ QPEApplication app( argc, argv );
+ return 0;
+}
+EOF
+
+ if AC_TRY_EVAL(ac_link) && test -s conftest; then
+ rm -f conftest*
+ else
+ rm -f conftest*
+ AC_MSG_ERROR([Cannot link small Qtopia Application. For more details look at
+the end of config.log])
+ fi
+
+ CXXFLAGS="$ac_cxxflags_safe"
+ LDFLAGS="$ac_ldflags_safe"
+ LIBS="$ac_libs_safe"
+
+ AC_LANG_RESTORE
+
+ QTOPIA_INCLUDES="-I$qtopia_incdir"
+ AC_SUBST(QTOPIA_INCLUDES)
+
+ AC_MSG_RESULT([found version $qtopia_verstr with headers at $qtopia_incdir])
+])
+
+
+AC_DEFUN([KDE_INIT_DOXYGEN],
+[
+AC_MSG_CHECKING([for Qt docs])
+kde_qtdir=
+if test "${with_qt_dir+set}" = set; then
+ kde_qtdir="$with_qt_dir"
+fi
+
+AC_FIND_FILE(qsql.html, [ $kde_qtdir/doc/html $QTDIR/doc/html /usr/share/doc/packages/qt3/html /usr/lib/qt/doc /usr/lib/qt3/doc /usr/lib/qt3/doc/html /usr/doc/qt3/html /usr/doc/qt3 /usr/share/doc/qt3-doc /usr/share/qt3/doc/html /usr/X11R6/share/doc/qt/html ], QTDOCDIR)
+AC_MSG_RESULT($QTDOCDIR)
+
+AC_SUBST(QTDOCDIR)
+
+KDE_FIND_PATH(dot, DOT, [], [])
+if test -n "$DOT"; then
+ KDE_HAVE_DOT="YES"
+else
+ KDE_HAVE_DOT="NO"
+fi
+AC_SUBST(KDE_HAVE_DOT)
+KDE_FIND_PATH(doxygen, DOXYGEN, [], [])
+AC_SUBST(DOXYGEN)
+
+DOXYGEN_PROJECT_NAME="$1"
+DOXYGEN_PROJECT_NUMBER="$2"
+AC_SUBST(DOXYGEN_PROJECT_NAME)
+AC_SUBST(DOXYGEN_PROJECT_NUMBER)
+
+KDE_HAS_DOXYGEN=no
+if test -n "$DOXYGEN" && test -x "$DOXYGEN" && test -f $QTDOCDIR/qsql.html; then
+ KDE_HAS_DOXYGEN=yes
+fi
+AC_SUBST(KDE_HAS_DOXYGEN)
+
+])
+
+
+AC_DEFUN([AC_FIND_BZIP2],
+[
+AC_MSG_CHECKING([for bzDecompress in libbz2])
+AC_CACHE_VAL(ac_cv_lib_bzip2,
+[
+AC_LANG_SAVE
+AC_LANG_CPLUSPLUS
+kde_save_LIBS="$LIBS"
+LIBS="$all_libraries $USER_LDFLAGS -lbz2 $LIBSOCKET"
+kde_save_CXXFLAGS="$CXXFLAGS"
+CXXFLAGS="$CXXFLAGS $all_includes $USER_INCLUDES"
+AC_TRY_LINK(dnl
+[
+#define BZ_NO_STDIO
+#include<bzlib.h>
+],
+ [ bz_stream s; (void) bzDecompress(&s); ],
+ eval "ac_cv_lib_bzip2='-lbz2'",
+ eval "ac_cv_lib_bzip2=no")
+LIBS="$kde_save_LIBS"
+CXXFLAGS="$kde_save_CXXFLAGS"
+AC_LANG_RESTORE
+])dnl
+AC_MSG_RESULT($ac_cv_lib_bzip2)
+
+if test ! "$ac_cv_lib_bzip2" = no; then
+ BZIP2DIR=bzip2
+
+ LIBBZ2="$ac_cv_lib_bzip2"
+ AC_SUBST(LIBBZ2)
+
+else
+
+ cxx_shared_flag=
+ ld_shared_flag=
+ KDE_CHECK_COMPILER_FLAG(shared, [
+ ld_shared_flag="-shared"
+ ])
+ KDE_CHECK_COMPILER_FLAG(fPIC, [
+ cxx_shared_flag="-fPIC"
+ ])
+
+ AC_MSG_CHECKING([for BZ2_bzDecompress in (shared) libbz2])
+ AC_CACHE_VAL(ac_cv_lib_bzip2_prefix,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ kde_save_LIBS="$LIBS"
+ LIBS="$all_libraries $USER_LDFLAGS $ld_shared_flag -lbz2 $LIBSOCKET"
+ kde_save_CXXFLAGS="$CXXFLAGS"
+ CXXFLAGS="$CFLAGS $cxx_shared_flag $all_includes $USER_INCLUDES"
+
+ AC_TRY_LINK(dnl
+ [
+ #define BZ_NO_STDIO
+ #include<bzlib.h>
+ ],
+ [ bz_stream s; (void) BZ2_bzDecompress(&s); ],
+ eval "ac_cv_lib_bzip2_prefix='-lbz2'",
+ eval "ac_cv_lib_bzip2_prefix=no")
+ LIBS="$kde_save_LIBS"
+ CXXFLAGS="$kde_save_CXXFLAGS"
+ AC_LANG_RESTORE
+ ])dnl
+
+ AC_MSG_RESULT($ac_cv_lib_bzip2_prefix)
+
+ if test ! "$ac_cv_lib_bzip2_prefix" = no; then
+ BZIP2DIR=bzip2
+
+ LIBBZ2="$ac_cv_lib_bzip2_prefix"
+ AC_SUBST(LIBBZ2)
+
+ AC_DEFINE(NEED_BZ2_PREFIX, 1, [Define if the libbz2 functions need the BZ2_ prefix])
+ dnl else, we just ignore this
+ fi
+
+fi
+AM_CONDITIONAL(include_BZIP2, test -n "$BZIP2DIR")
+])
+
+dnl ------------------------------------------------------------------------
+dnl Try to find the SSL headers and libraries.
+dnl $(SSL_LDFLAGS) will be -Lsslliblocation (if needed)
+dnl and $(SSL_INCLUDES) will be -Isslhdrlocation (if needed)
+dnl ------------------------------------------------------------------------
+dnl
+AC_DEFUN([KDE_CHECK_SSL],
+[
+LIBSSL="-lssl -lcrypto"
+AC_REQUIRE([KDE_CHECK_LIB64])
+
+ac_ssl_includes=NO ac_ssl_libraries=NO
+ssl_libraries=""
+ssl_includes=""
+AC_ARG_WITH(ssl-dir,
+ AC_HELP_STRING([--with-ssl-dir=DIR],[where the root of OpenSSL is installed]),
+ [ ac_ssl_includes="$withval"/include
+ ac_ssl_libraries="$withval"/lib$kdelibsuff
+ ])
+
+want_ssl=yes
+AC_ARG_WITH(ssl,
+ AC_HELP_STRING([--without-ssl],[disable SSL checks]),
+ [want_ssl=$withval])
+
+if test $want_ssl = yes; then
+
+AC_MSG_CHECKING(for OpenSSL)
+
+AC_CACHE_VAL(ac_cv_have_ssl,
+[#try to guess OpenSSL locations
+
+ ssl_incdirs="/usr/include /usr/local/include /usr/ssl/include /usr/local/ssl/include $prefix/include $kde_extra_includes"
+ ssl_incdirs="$ac_ssl_includes $ssl_incdirs"
+ AC_FIND_FILE(openssl/ssl.h, $ssl_incdirs, ssl_incdir)
+ ac_ssl_includes="$ssl_incdir"
+
+ ssl_libdirs="/usr/lib$kdelibsuff /usr/local/lib$kdelibsuff /usr/ssl/lib$kdelibsuff /usr/local/ssl/lib$kdelibsuff $libdir $prefix/lib$kdelibsuff $exec_prefix/lib$kdelibsuff $kde_extra_libs"
+ if test ! "$ac_ssl_libraries" = "NO"; then
+ ssl_libdirs="$ac_ssl_libraries $ssl_libdirs"
+ fi
+
+ test=NONE
+ ssl_libdir=NONE
+ for dir in $ssl_libdirs; do
+ try="ls -1 $dir/libssl*"
+ if test=`eval $try 2> /dev/null`; then ssl_libdir=$dir; break; else echo "tried $dir" >&AC_FD_CC ; fi
+ done
+
+ ac_ssl_libraries="$ssl_libdir"
+
+ ac_ldflags_safe="$LDFLAGS"
+ ac_libs_safe="$LIBS"
+
+ LDFLAGS="$LDFLAGS -L$ssl_libdir $all_libraries"
+ LIBS="$LIBS $LIBSSL -lRSAglue -lrsaref"
+
+ AC_TRY_LINK(,void RSAPrivateEncrypt(void);RSAPrivateEncrypt();,
+ ac_ssl_rsaref="yes"
+ ,
+ ac_ssl_rsaref="no"
+ )
+
+ LDFLAGS="$ac_ldflags_safe"
+ LIBS="$ac_libs_safe"
+
+ if test "$ac_ssl_includes" = NO || test "$ac_ssl_libraries" = NO; then
+ have_ssl=no
+ else
+ have_ssl=yes;
+ fi
+
+ ])
+
+ eval "$ac_cv_have_ssl"
+
+ AC_MSG_RESULT([libraries $ac_ssl_libraries, headers $ac_ssl_includes])
+
+ AC_MSG_CHECKING([whether OpenSSL uses rsaref])
+ AC_MSG_RESULT($ac_ssl_rsaref)
+
+ AC_MSG_CHECKING([for easter eggs])
+ AC_MSG_RESULT([none found])
+
+else
+ have_ssl=no
+fi
+
+if test "$have_ssl" = yes; then
+ AC_MSG_CHECKING(for OpenSSL version)
+ dnl Check for SSL version
+ AC_CACHE_VAL(ac_cv_ssl_version,
+ [
+
+ cat >conftest.$ac_ext <<EOF
+#include <openssl/opensslv.h>
+#include <stdio.h>
+ int main() {
+
+#ifndef OPENSSL_VERSION_NUMBER
+ printf("ssl_version=\\"error\\"\n");
+#else
+ if (OPENSSL_VERSION_NUMBER < 0x00906000)
+ printf("ssl_version=\\"old\\"\n");
+ else
+ printf("ssl_version=\\"ok\\"\n");
+#endif
+ return (0);
+ }
+EOF
+
+ ac_save_CPPFLAGS=$CPPFLAGS
+ if test "$ac_ssl_includes" != "/usr/include"; then
+ CPPFLAGS="$CPPFLAGS -I$ac_ssl_includes"
+ fi
+
+ if AC_TRY_EVAL(ac_link); then
+
+ if eval `./conftest 2>&5`; then
+ if test $ssl_version = error; then
+ AC_MSG_ERROR([$ssl_incdir/openssl/opensslv.h doesn't define OPENSSL_VERSION_NUMBER !])
+ else
+ if test $ssl_version = old; then
+ AC_MSG_WARN([OpenSSL version too old. Upgrade to 0.9.6 at least, see http://www.openssl.org. SSL support disabled.])
+ have_ssl=no
+ fi
+ fi
+ ac_cv_ssl_version="ssl_version=$ssl_version"
+ else
+ AC_MSG_ERROR([Your system couldn't run a small SSL test program.
+ Check config.log, and if you can't figure it out, send a mail to
+ David Faure <faure@kde.org>, attaching your config.log])
+ fi
+
+ else
+ AC_MSG_ERROR([Your system couldn't link a small SSL test program.
+ Check config.log, and if you can't figure it out, send a mail to
+ David Faure <faure@kde.org>, attaching your config.log])
+ fi
+ CPPFLAGS=$ac_save_CPPFLAGS
+
+ ])
+
+ eval "$ac_cv_ssl_version"
+ AC_MSG_RESULT($ssl_version)
+fi
+
+if test "$have_ssl" != yes; then
+ LIBSSL="";
+else
+ AC_DEFINE(HAVE_SSL, 1, [If we are going to use OpenSSL])
+ ac_cv_have_ssl="have_ssl=yes \
+ ac_ssl_includes=$ac_ssl_includes ac_ssl_libraries=$ac_ssl_libraries ac_ssl_rsaref=$ac_ssl_rsaref"
+
+
+ ssl_libraries="$ac_ssl_libraries"
+ ssl_includes="$ac_ssl_includes"
+
+ if test "$ac_ssl_rsaref" = yes; then
+ LIBSSL="-lssl -lcrypto -lRSAglue -lrsaref"
+ fi
+
+ if test $ssl_version = "old"; then
+ AC_DEFINE(HAVE_OLD_SSL_API, 1, [Define if you have OpenSSL < 0.9.6])
+ fi
+fi
+
+SSL_INCLUDES=
+
+if test "$ssl_includes" = "/usr/include"; then
+ if test -f /usr/kerberos/include/krb5.h; then
+ SSL_INCLUDES="-I/usr/kerberos/include"
+ fi
+elif test "$ssl_includes" != "/usr/local/include" && test -n "$ssl_includes"; then
+ SSL_INCLUDES="-I$ssl_includes"
+fi
+
+if test "$ssl_libraries" = "/usr/lib" || test "$ssl_libraries" = "/usr/local/lib" || test -z "$ssl_libraries" || test "$ssl_libraries" = "NONE"; then
+ SSL_LDFLAGS=""
+else
+ SSL_LDFLAGS="-L$ssl_libraries -R$ssl_libraries"
+fi
+
+AC_SUBST(SSL_INCLUDES)
+AC_SUBST(SSL_LDFLAGS)
+AC_SUBST(LIBSSL)
+])
+
+AC_DEFUN([KDE_CHECK_STRLCPY],
+[
+ AC_REQUIRE([AC_CHECK_STRLCAT])
+ AC_REQUIRE([AC_CHECK_STRLCPY])
+ AC_CHECK_SIZEOF(size_t)
+ AC_CHECK_SIZEOF(unsigned long)
+
+ AC_MSG_CHECKING([sizeof size_t == sizeof unsigned long])
+ AC_TRY_COMPILE(,[
+ #if SIZEOF_SIZE_T != SIZEOF_UNSIGNED_LONG
+ choke me
+ #endif
+ ],AC_MSG_RESULT([yes]),[
+ AC_MSG_RESULT(no)
+ AC_MSG_ERROR([
+ Apparently on your system our assumption sizeof size_t == sizeof unsigned long
+ does not apply. Please mail kde-devel@kde.org with a description of your system!
+ ])
+ ])
+])
+
+AC_DEFUN([KDE_CHECK_BINUTILS],
+[
+ AC_MSG_CHECKING([if ld supports unversioned version maps])
+
+ kde_save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS -Wl,--version-script=conftest.map"
+ echo "{ local: extern \"C++\" { foo }; };" > conftest.map
+ AC_TRY_LINK([int foo;],
+[
+#ifdef __INTEL_COMPILER
+icc apparently does not support libtools version-info and version-script
+at the same time. Dunno where the bug is, but until somebody figured out,
+better disable the optional version scripts.
+#endif
+
+ foo = 42;
+], kde_supports_versionmaps=yes, kde_supports_versionmaps=no)
+ LDFLAGS="$kde_save_LDFLAGS"
+ rm -f conftest.map
+ AM_CONDITIONAL(include_VERSION_SCRIPT,
+ [test "$kde_supports_versionmaps" = "yes" && test "$kde_use_debug_code" = "no"])
+
+ AC_MSG_RESULT($kde_supports_versionmaps)
+])
+
+AC_DEFUN([AM_PROG_OBJC],[
+AC_CHECK_PROGS(OBJC, gcc, gcc)
+test -z "$OBJC" && AC_MSG_ERROR([no acceptable objective-c gcc found in \$PATH])
+if test "x${OBJCFLAGS-unset}" = xunset; then
+ OBJCFLAGS="-g -O2"
+fi
+AC_SUBST(OBJCFLAGS)
+_AM_IF_OPTION([no-dependencies],, [_AM_DEPENDENCIES(OBJC)])
+])
+
+AC_DEFUN([KDE_CHECK_PERL],
+[
+ KDE_FIND_PATH(perl, PERL, [$bindir $exec_prefix/bin $prefix/bin], [
+ AC_MSG_ERROR([No Perl found in your $PATH.
+We need perl to generate some code.])
+ ])
+ AC_SUBST(PERL)
+])
+
+AC_DEFUN([KDE_CHECK_LARGEFILE],
+[
+AC_SYS_LARGEFILE
+if test "$ac_cv_sys_file_offset_bits" != no; then
+ CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits"
+fi
+
+if test "x$ac_cv_sys_large_files" != "xno"; then
+ CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=1"
+fi
+
+])
+
+dnl A small extension to PKG_CHECK_MODULES (defined in pkg.m4.in)
+dnl which allows to search for libs that get installed into the KDE prefix.
+dnl
+dnl Syntax: KDE_PKG_CHECK_MODULES(KSTUFF, libkexif >= 0.2 glib = 1.3.4, action-if, action-not)
+dnl defines KSTUFF_LIBS, KSTUFF_CFLAGS, see pkg-config man page
+dnl also defines KSTUFF_PKG_ERRORS on error
+AC_DEFUN([KDE_PKG_CHECK_MODULES], [
+
+ PKG_CONFIG_PATH="$prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH"
+ if test "$prefix" != "$kde_libs_prefix"; then
+ PKG_CONFIG_PATH="$kde_libs_prefix/lib${kdelibsuff}/pkgconfig:$PKG_CONFIG_PATH"
+ fi
+ export PKG_CONFIG_PATH
+ PKG_CHECK_MODULES([$1],[$2],[$3],[$4])
+])
+
+
+dnl Check for PIE support in the compiler and linker
+AC_DEFUN([KDE_CHECK_PIE_SUPPORT],
+[
+ AC_CACHE_CHECK([for PIE support], kde_cv_val_pie_support,
+ [
+ AC_LANG_SAVE
+ AC_LANG_CPLUSPLUS
+ safe_CXXFLAGS=$CXXFLAGS
+ safe_LDFLAGS=$LDFLAGS
+ CXXFLAGS="$CXXFLAGS -fPIE"
+ LDFLAGS="$LDFLAGS -pie"
+
+ AC_TRY_LINK([int foo;], [], [kde_cv_val_pie_support=yes], [kde_cv_val_pie_support=no])
+
+ CXXFLAGS=$safe_CXXFLAGS
+ LDFLAGS=$safe_LDFLAGS
+ AC_LANG_RESTORE
+ ])
+
+ AC_MSG_CHECKING(if enabling -pie/fPIE support)
+
+ AC_ARG_ENABLE(pie,
+ AC_HELP_STRING([--enable-pie],[platform supports PIE linking [default=detect]]),
+ [kde_has_pie_support=$enableval],
+ [kde_has_pie_support=detect])
+
+ if test "$kde_has_pie_support" = "detect"; then
+ kde_has_pie_support=$kde_cv_val_pie_support
+ fi
+
+ AC_MSG_RESULT([$kde_has_pie_support])
+
+ KDE_USE_FPIE=""
+ KDE_USE_PIE=""
+
+ AC_SUBST([KDE_USE_FPIE])
+ AC_SUBST([KDE_USE_PIE])
+
+ if test "$kde_has_pie_support" = "yes"; then
+ KDE_USE_FPIE="-fPIE"
+ KDE_USE_PIE="-pie"
+ fi
+])
+# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-
+## Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007
+## Free Software Foundation, Inc.
+## Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+##
+## This file is free software; the Free Software Foundation gives
+## unlimited permission to copy and/or distribute it, with or without
+## modifications, as long as this notice is preserved.
+
+# serial 51 Debian 1.5.24-1 AC_PROG_LIBTOOL
+
+
+# AC_PROVIDE_IFELSE(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED)
+# -----------------------------------------------------------
+# If this macro is not defined by Autoconf, define it here.
+m4_ifdef([AC_PROVIDE_IFELSE],
+ [],
+ [m4_define([AC_PROVIDE_IFELSE],
+ [m4_ifdef([AC_PROVIDE_$1],
+ [$2], [$3])])])
+
+
+# AC_PROG_LIBTOOL
+# ---------------
+AC_DEFUN([AC_PROG_LIBTOOL],
+[AC_REQUIRE([_AC_PROG_LIBTOOL])dnl
+dnl If AC_PROG_CXX has already been expanded, run AC_LIBTOOL_CXX
+dnl immediately, otherwise, hook it in at the end of AC_PROG_CXX.
+ AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [AC_LIBTOOL_CXX],
+ [define([AC_PROG_CXX], defn([AC_PROG_CXX])[AC_LIBTOOL_CXX
+ ])])
+dnl And a similar setup for Fortran 77 support
+ AC_PROVIDE_IFELSE([AC_PROG_F77],
+ [AC_LIBTOOL_F77],
+ [define([AC_PROG_F77], defn([AC_PROG_F77])[AC_LIBTOOL_F77
+])])
+
+dnl Quote A][M_PROG_GCJ so that aclocal doesn't bring it in needlessly.
+dnl If either AC_PROG_GCJ or A][M_PROG_GCJ have already been expanded, run
+dnl AC_LIBTOOL_GCJ immediately, otherwise, hook it in at the end of both.
+ AC_PROVIDE_IFELSE([AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],
+ [AC_LIBTOOL_GCJ],
+ [ifdef([AC_PROG_GCJ],
+ [define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([A][M_PROG_GCJ],
+ [define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[AC_LIBTOOL_GCJ])])
+ ifdef([LT_AC_PROG_GCJ],
+ [define([LT_AC_PROG_GCJ],
+ defn([LT_AC_PROG_GCJ])[AC_LIBTOOL_GCJ])])])])
+])])# AC_PROG_LIBTOOL
+
+
+# _AC_PROG_LIBTOOL
+# ----------------
+AC_DEFUN([_AC_PROG_LIBTOOL],
+[AC_REQUIRE([AC_LIBTOOL_SETUP])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_CXX])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_F77])dnl
+AC_BEFORE([$0],[AC_LIBTOOL_GCJ])dnl
+
+# This can be used to rebuild libtool when needed
+LIBTOOL_DEPS="$ac_aux_dir/ltmain.sh"
+
+# Always use our own libtool.
+LIBTOOL='$(SHELL) $(top_builddir)/libtool'
+AC_SUBST(LIBTOOL)dnl
+
+# Prevent multiple expansion
+define([AC_PROG_LIBTOOL], [])
+])# _AC_PROG_LIBTOOL
+
+
+# AC_LIBTOOL_SETUP
+# ----------------
+AC_DEFUN([AC_LIBTOOL_SETUP],
+[AC_PREREQ(2.50)dnl
+AC_REQUIRE([AC_ENABLE_SHARED])dnl
+AC_REQUIRE([AC_ENABLE_STATIC])dnl
+AC_REQUIRE([AC_ENABLE_FAST_INSTALL])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_PROG_LD])dnl
+AC_REQUIRE([AC_PROG_LD_RELOAD_FLAG])dnl
+AC_REQUIRE([AC_PROG_NM])dnl
+
+AC_REQUIRE([AC_PROG_LN_S])dnl
+AC_REQUIRE([AC_DEPLIBS_CHECK_METHOD])dnl
+# Autoconf 2.13's AC_OBJEXT and AC_EXEEXT macros only works for C compilers!
+AC_REQUIRE([AC_OBJEXT])dnl
+AC_REQUIRE([AC_EXEEXT])dnl
+dnl
+
+AC_LIBTOOL_SYS_MAX_CMD_LEN
+AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+AC_LIBTOOL_OBJDIR
+
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+_LT_AC_PROG_ECHO_BACKSLASH
+
+case $host_os in
+aix3*)
+ # AIX sometimes has problems with the GCC collect2 program. For some
+ # reason, if we set the COLLECT_NAMES environment variable, the problems
+ # vanish in a puff of smoke.
+ if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+ fi
+ ;;
+esac
+
+# Sed substitution that helps us do robust quoting. It backslashifies
+# metacharacters that are still active within double-quoted strings.
+Xsed='sed -e 1s/^X//'
+[sed_quote_subst='s/\([\\"\\`$\\\\]\)/\\\1/g']
+
+# Same as above, but do not quote variable references.
+[double_quote_subst='s/\([\\"\\`\\\\]\)/\\\1/g']
+
+# Sed substitution to delay expansion of an escaped shell variable in a
+# double_quote_subst'ed string.
+delay_variable_subst='s/\\\\\\\\\\\$/\\\\\\$/g'
+
+# Sed substitution to avoid accidental globbing in evaled expressions
+no_glob_subst='s/\*/\\\*/g'
+
+# Constants:
+rm="rm -f"
+
+# Global variables:
+default_ofile=libtool
+can_build_shared=yes
+
+# All known linkers require a `.a' archive for static linking (except MSVC,
+# which needs '.lib').
+libext=a
+ltmain="$ac_aux_dir/ltmain.sh"
+ofile="$default_ofile"
+with_gnu_ld="$lt_cv_prog_gnu_ld"
+
+AC_CHECK_TOOL(AR, ar, false)
+AC_CHECK_TOOL(RANLIB, ranlib, :)
+AC_CHECK_TOOL(STRIP, strip, :)
+
+old_CC="$CC"
+old_CFLAGS="$CFLAGS"
+
+# Set sane defaults for various variables
+test -z "$AR" && AR=ar
+test -z "$AR_FLAGS" && AR_FLAGS=cru
+test -z "$AS" && AS=as
+test -z "$CC" && CC=cc
+test -z "$LTCC" && LTCC=$CC
+test -z "$LTCFLAGS" && LTCFLAGS=$CFLAGS
+test -z "$DLLTOOL" && DLLTOOL=dlltool
+test -z "$LD" && LD=ld
+test -z "$LN_S" && LN_S="ln -s"
+test -z "$MAGIC_CMD" && MAGIC_CMD=file
+test -z "$NM" && NM=nm
+test -z "$SED" && SED=sed
+test -z "$OBJDUMP" && OBJDUMP=objdump
+test -z "$RANLIB" && RANLIB=:
+test -z "$STRIP" && STRIP=:
+test -z "$ac_objext" && ac_objext=o
+
+# Determine commands to create old-style static archives.
+old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'
+old_postinstall_cmds='chmod 644 $oldlib'
+old_postuninstall_cmds=
+
+if test -n "$RANLIB"; then
+ case $host_os in
+ openbsd*)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB -t \$oldlib"
+ ;;
+ *)
+ old_postinstall_cmds="$old_postinstall_cmds~\$RANLIB \$oldlib"
+ ;;
+ esac
+ old_archive_cmds="$old_archive_cmds~\$RANLIB \$oldlib"
+fi
+
+_LT_CC_BASENAME([$compiler])
+
+# Only perform the check for file, if the check method requires it
+case $deplibs_check_method in
+file_magic*)
+ if test "$file_magic_cmd" = '$MAGIC_CMD'; then
+ AC_PATH_MAGIC
+ fi
+ ;;
+esac
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_DLOPEN], enable_dlopen=yes, enable_dlopen=no)
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+enable_win32_dll=yes, enable_win32_dll=no)
+
+AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+AC_ARG_WITH([pic],
+ [AC_HELP_STRING([--with-pic],
+ [try to use only PIC/non-PIC objects @<:@default=use both@:>@])],
+ [pic_mode="$withval"],
+ [pic_mode=default])
+test -z "$pic_mode" && pic_mode=default
+
+# Use C for the default configuration in the libtool script
+tagname=
+AC_LIBTOOL_LANG_C_CONFIG
+_LT_AC_TAGCONFIG
+])# AC_LIBTOOL_SETUP
+
+
+# _LT_AC_SYS_COMPILER
+# -------------------
+AC_DEFUN([_LT_AC_SYS_COMPILER],
+[AC_REQUIRE([AC_PROG_CC])dnl
+
+# If no C compiler was specified, use CC.
+LTCC=${LTCC-"$CC"}
+
+# If no C compiler flags were specified, use CFLAGS.
+LTCFLAGS=${LTCFLAGS-"$CFLAGS"}
+
+# Allow CC to be a program name with arguments.
+compiler=$CC
+])# _LT_AC_SYS_COMPILER
+
+
+# _LT_CC_BASENAME(CC)
+# -------------------
+# Calculate cc_basename. Skip known compiler wrappers and cross-prefix.
+AC_DEFUN([_LT_CC_BASENAME],
+[for cc_temp in $1""; do
+ case $cc_temp in
+ compile | *[[\\/]]compile | ccache | *[[\\/]]ccache ) ;;
+ distcc | *[[\\/]]distcc | purify | *[[\\/]]purify ) ;;
+ \-*) ;;
+ *) break;;
+ esac
+done
+cc_basename=`$echo "X$cc_temp" | $Xsed -e 's%.*/%%' -e "s%^$host_alias-%%"`
+])
+
+
+# _LT_COMPILER_BOILERPLATE
+# ------------------------
+# Check for compiler boilerplate output or warnings with
+# the simple compiler test code.
+AC_DEFUN([_LT_COMPILER_BOILERPLATE],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_compile_test_code" >conftest.$ac_ext
+eval "$ac_compile" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_compiler_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_COMPILER_BOILERPLATE
+
+
+# _LT_LINKER_BOILERPLATE
+# ----------------------
+# Check for linker boilerplate output or warnings with
+# the simple link test code.
+AC_DEFUN([_LT_LINKER_BOILERPLATE],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+ac_outfile=conftest.$ac_objext
+echo "$lt_simple_link_test_code" >conftest.$ac_ext
+eval "$ac_link" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err
+_lt_linker_boilerplate=`cat conftest.err`
+$rm conftest*
+])# _LT_LINKER_BOILERPLATE
+
+
+# _LT_AC_SYS_LIBPATH_AIX
+# ----------------------
+# Links a minimal program and checks the executable
+# for the system default hardcoded library path. In most cases,
+# this is /usr/lib:/lib, but when the MPI compilers are used
+# the location of the communication and MPI libs are included too.
+# If we don't find anything, use the default library path according
+# to the aix ld manual.
+AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_LINK_IFELSE(AC_LANG_PROGRAM,[
+lt_aix_libpath_sed='
+ /Import File Strings/,/^$/ {
+ /^0/ {
+ s/^0 *\(.*\)$/\1/
+ p
+ }
+ }'
+aix_libpath=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+# Check for a 64-bit object if we didn't find anything.
+if test -z "$aix_libpath"; then
+ aix_libpath=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e "$lt_aix_libpath_sed"`
+fi],[])
+if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
+])# _LT_AC_SYS_LIBPATH_AIX
+
+
+# _LT_AC_SHELL_INIT(ARG)
+# ----------------------
+AC_DEFUN([_LT_AC_SHELL_INIT],
+[ifdef([AC_DIVERSION_NOTICE],
+ [AC_DIVERT_PUSH(AC_DIVERSION_NOTICE)],
+ [AC_DIVERT_PUSH(NOTICE)])
+$1
+AC_DIVERT_POP
+])# _LT_AC_SHELL_INIT
+
+
+# _LT_AC_PROG_ECHO_BACKSLASH
+# --------------------------
+# Add some code to the start of the generated configure script which
+# will find an echo command which doesn't interpret backslashes.
+AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH],
+[_LT_AC_SHELL_INIT([
+# Check that we are running under the correct shell.
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case X$ECHO in
+X*--fallback-echo)
+ # Remove one level of quotation (which was required for Make).
+ ECHO=`echo "$ECHO" | sed 's,\\\\\[$]\\[$]0,'[$]0','`
+ ;;
+esac
+
+echo=${ECHO-echo}
+if test "X[$]1" = X--no-reexec; then
+ # Discard the --no-reexec flag, and continue.
+ shift
+elif test "X[$]1" = X--fallback-echo; then
+ # Avoid inline document here, it may be left over
+ :
+elif test "X`($echo '\t') 2>/dev/null`" = 'X\t' ; then
+ # Yippee, $echo works!
+ :
+else
+ # Restart under the correct shell.
+ exec $SHELL "[$]0" --no-reexec ${1+"[$]@"}
+fi
+
+if test "X[$]1" = X--fallback-echo; then
+ # used as fallback echo
+ shift
+ cat <<EOF
+[$]*
+EOF
+ exit 0
+fi
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+if test -z "$ECHO"; then
+if test "X${echo_test_string+set}" != Xset; then
+# find a string as large as possible, as long as the shell can cope with it
+ for cmd in 'sed 50q "[$]0"' 'sed 20q "[$]0"' 'sed 10q "[$]0"' 'sed 2q "[$]0"' 'echo test'; do
+ # expected sizes: less than 2Kb, 1Kb, 512 bytes, 16 bytes, ...
+ if (echo_test_string=`eval $cmd`) 2>/dev/null &&
+ echo_test_string=`eval $cmd` &&
+ (test "X$echo_test_string" = "X$echo_test_string") 2>/dev/null
+ then
+ break
+ fi
+ done
+fi
+
+if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ :
+else
+ # The Solaris, AIX, and Digital Unix default echo programs unquote
+ # backslashes. This makes it impossible to quote backslashes using
+ # echo "$something" | sed 's/\\/\\\\/g'
+ #
+ # So, first we look for a working echo in the user's PATH.
+
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for dir in $PATH /usr/ucb; do
+ IFS="$lt_save_ifs"
+ if (test -f $dir/echo || test -f $dir/echo$ac_exeext) &&
+ test "X`($dir/echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($dir/echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$dir/echo"
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ if test "X$echo" = Xecho; then
+ # We didn't find a better echo, so look for alternatives.
+ if test "X`(print -r '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`(print -r "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # This shell has a builtin print -r that does the trick.
+ echo='print -r'
+ elif (test -f /bin/ksh || test -f /bin/ksh$ac_exeext) &&
+ test "X$CONFIG_SHELL" != X/bin/ksh; then
+ # If we have ksh, try running configure again with it.
+ ORIGINAL_CONFIG_SHELL=${CONFIG_SHELL-/bin/sh}
+ export ORIGINAL_CONFIG_SHELL
+ CONFIG_SHELL=/bin/ksh
+ export CONFIG_SHELL
+ exec $CONFIG_SHELL "[$]0" --no-reexec ${1+"[$]@"}
+ else
+ # Try using printf.
+ echo='printf %s\n'
+ if test "X`($echo '\t') 2>/dev/null`" = 'X\t' &&
+ echo_testing_string=`($echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ # Cool, printf works
+ :
+ elif echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($ORIGINAL_CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ CONFIG_SHELL=$ORIGINAL_CONFIG_SHELL
+ export CONFIG_SHELL
+ SHELL="$CONFIG_SHELL"
+ export SHELL
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ elif echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo '\t') 2>/dev/null` &&
+ test "X$echo_testing_string" = 'X\t' &&
+ echo_testing_string=`($CONFIG_SHELL "[$]0" --fallback-echo "$echo_test_string") 2>/dev/null` &&
+ test "X$echo_testing_string" = "X$echo_test_string"; then
+ echo="$CONFIG_SHELL [$]0 --fallback-echo"
+ else
+ # maybe with a smaller string...
+ prev=:
+
+ for cmd in 'echo test' 'sed 2q "[$]0"' 'sed 10q "[$]0"' 'sed 20q "[$]0"' 'sed 50q "[$]0"'; do
+ if (test "X$echo_test_string" = "X`eval $cmd`") 2>/dev/null
+ then
+ break
+ fi
+ prev="$cmd"
+ done
+
+ if test "$prev" != 'sed 50q "[$]0"'; then
+ echo_test_string=`eval $prev`
+ export echo_test_string
+ exec ${ORIGINAL_CONFIG_SHELL-${CONFIG_SHELL-/bin/sh}} "[$]0" ${1+"[$]@"}
+ else
+ # Oops. We lost completely, so just stick with echo.
+ echo=echo
+ fi
+ fi
+ fi
+ fi
+fi
+fi
+
+# Copy echo and quote the copy suitably for passing to libtool from
+# the Makefile, instead of quoting the original, which is used later.
+ECHO=$echo
+if test "X$ECHO" = "X$CONFIG_SHELL [$]0 --fallback-echo"; then
+ ECHO="$CONFIG_SHELL \\\$\[$]0 --fallback-echo"
+fi
+
+AC_SUBST(ECHO)
+])])# _LT_AC_PROG_ECHO_BACKSLASH
+
+
+# _LT_AC_LOCK
+# -----------
+AC_DEFUN([_LT_AC_LOCK],
+[AC_ARG_ENABLE([libtool-lock],
+ [AC_HELP_STRING([--disable-libtool-lock],
+ [avoid locking (might break parallel builds)])])
+test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
+
+# Some flags need to be propagated to the compiler or linker for good
+# libtool support.
+case $host in
+ia64-*-hpux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *ELF-32*)
+ HPUX_IA64_MODE="32"
+ ;;
+ *ELF-64*)
+ HPUX_IA64_MODE="64"
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+*-*-irix6*)
+ # Find out which ABI we are using.
+ echo '[#]line __oline__ "configure"' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -melf32bsmip"
+ ;;
+ *N32*)
+ LD="${LD-ld} -melf32bmipn32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -melf64bmip"
+ ;;
+ esac
+ else
+ case `/usr/bin/file conftest.$ac_objext` in
+ *32-bit*)
+ LD="${LD-ld} -32"
+ ;;
+ *N32*)
+ LD="${LD-ld} -n32"
+ ;;
+ *64-bit*)
+ LD="${LD-ld} -64"
+ ;;
+ esac
+ fi
+ fi
+ rm -rf conftest*
+ ;;
+
+x86_64-*kfreebsd*-gnu|x86_64-*linux*|ppc*-*linux*|powerpc*-*linux*| \
+s390*-*linux*|sparc*-*linux*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.o` in
+ *32-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_i386_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_i386"
+ ;;
+ ppc64-*linux*|powerpc64-*linux*)
+ LD="${LD-ld} -m elf32ppclinux"
+ ;;
+ s390x-*linux*)
+ LD="${LD-ld} -m elf_s390"
+ ;;
+ sparc64-*linux*)
+ LD="${LD-ld} -m elf32_sparc"
+ ;;
+ esac
+ ;;
+ *64-bit*)
+ case $host in
+ x86_64-*kfreebsd*-gnu)
+ LD="${LD-ld} -m elf_x86_64_fbsd"
+ ;;
+ x86_64-*linux*)
+ LD="${LD-ld} -m elf_x86_64"
+ ;;
+ ppc*-*linux*|powerpc*-*linux*)
+ LD="${LD-ld} -m elf64ppc"
+ ;;
+ s390*-*linux*)
+ LD="${LD-ld} -m elf64_s390"
+ ;;
+ sparc*-*linux*)
+ LD="${LD-ld} -m elf64_sparc"
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+*-*-sco3.2v5*)
+ # On SCO OpenServer 5, we need -belf to get full-featured binaries.
+ SAVE_CFLAGS="$CFLAGS"
+ CFLAGS="$CFLAGS -belf"
+ AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,
+ [AC_LANG_PUSH(C)
+ AC_TRY_LINK([],[],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])
+ AC_LANG_POP])
+ if test x"$lt_cv_cc_needs_belf" != x"yes"; then
+ # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf
+ CFLAGS="$SAVE_CFLAGS"
+ fi
+ ;;
+sparc*-*solaris*)
+ # Find out which ABI we are using.
+ echo 'int i;' > conftest.$ac_ext
+ if AC_TRY_EVAL(ac_compile); then
+ case `/usr/bin/file conftest.o` in
+ *64-bit*)
+ case $lt_cv_prog_gnu_ld in
+ yes*) LD="${LD-ld} -m elf64_sparc" ;;
+ *) LD="${LD-ld} -64" ;;
+ esac
+ ;;
+ esac
+ fi
+ rm -rf conftest*
+ ;;
+
+AC_PROVIDE_IFELSE([AC_LIBTOOL_WIN32_DLL],
+[*-*-cygwin* | *-*-mingw* | *-*-pw32*)
+ AC_CHECK_TOOL(DLLTOOL, dlltool, false)
+ AC_CHECK_TOOL(AS, as, false)
+ AC_CHECK_TOOL(OBJDUMP, objdump, false)
+ ;;
+ ])
+esac
+
+need_locks="$enable_libtool_lock"
+
+])# _LT_AC_LOCK
+
+
+# AC_LIBTOOL_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])
+# ----------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ ifelse([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+ lt_compiler_flag="$3"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ # The option is referenced via a variable to avoid confusing sed.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>conftest.err)
+ ac_status=$?
+ cat conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s "$ac_outfile"; then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings other than the usual output.
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' >conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$5], , :, [$5])
+else
+ ifelse([$6], , :, [$6])
+fi
+])# AC_LIBTOOL_COMPILER_OPTION
+
+
+# AC_LIBTOOL_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,
+# [ACTION-SUCCESS], [ACTION-FAILURE])
+# ------------------------------------------------------------
+# Check whether the given compiler option works
+AC_DEFUN([AC_LIBTOOL_LINKER_OPTION],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_CACHE_CHECK([$1], [$2],
+ [$2=no
+ save_LDFLAGS="$LDFLAGS"
+ LDFLAGS="$LDFLAGS $3"
+ echo "$lt_simple_link_test_code" > conftest.$ac_ext
+ if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then
+ # The linker can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ if test -s conftest.err; then
+ # Append any errors to the config.log.
+ cat conftest.err 1>&AS_MESSAGE_LOG_FD
+ $echo "X$_lt_linker_boilerplate" | $Xsed -e '/^$/d' > conftest.exp
+ $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2
+ if diff conftest.exp conftest.er2 >/dev/null; then
+ $2=yes
+ fi
+ else
+ $2=yes
+ fi
+ fi
+ $rm conftest*
+ LDFLAGS="$save_LDFLAGS"
+])
+
+if test x"[$]$2" = xyes; then
+ ifelse([$4], , :, [$4])
+else
+ ifelse([$5], , :, [$5])
+fi
+])# AC_LIBTOOL_LINKER_OPTION
+
+
+# AC_LIBTOOL_SYS_MAX_CMD_LEN
+# --------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN],
+[# find the maximum length of command line arguments
+AC_MSG_CHECKING([the maximum length of command line arguments])
+AC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl
+ i=0
+ teststring="ABCD"
+
+ case $build_os in
+ msdosdjgpp*)
+ # On DJGPP, this test can blow up pretty badly due to problems in libc
+ # (any single argument exceeding 2000 bytes causes a buffer overrun
+ # during glob expansion). Even if it were fixed, the result of this
+ # check would be larger than it should be.
+ lt_cv_sys_max_cmd_len=12288; # 12K is about right
+ ;;
+
+ gnu*)
+ # Under GNU Hurd, this test is not required because there is
+ # no limit to the length of command line arguments.
+ # Libtool will interpret -1 as no limit whatsoever
+ lt_cv_sys_max_cmd_len=-1;
+ ;;
+
+ cygwin* | mingw*)
+ # On Win9x/ME, this test blows up -- it succeeds, but takes
+ # about 5 minutes as the teststring grows exponentially.
+ # Worse, since 9x/ME are not pre-emptively multitasking,
+ # you end up with a "frozen" computer, even though with patience
+ # the test eventually succeeds (with a max line length of 256k).
+ # Instead, let's just punt: use the minimum linelength reported by
+ # all of the supported platforms: 8192 (on NT/2K/XP).
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ amigaos*)
+ # On AmigaOS with pdksh, this test takes hours, literally.
+ # So we just punt and use a minimum line length of 8192.
+ lt_cv_sys_max_cmd_len=8192;
+ ;;
+
+ netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)
+ # This has been around since 386BSD, at least. Likely further.
+ if test -x /sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`
+ elif test -x /usr/sbin/sysctl; then
+ lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`
+ else
+ lt_cv_sys_max_cmd_len=65536 # usable default for all BSDs
+ fi
+ # And add a safety zone
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ ;;
+
+ interix*)
+ # We know the value 262144 and hardcode it with a safety zone (like BSD)
+ lt_cv_sys_max_cmd_len=196608
+ ;;
+
+ osf*)
+ # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure
+ # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not
+ # nice to cause kernel panics so lets avoid the loop below.
+ # First set a reasonable default.
+ lt_cv_sys_max_cmd_len=16384
+ #
+ if test -x /sbin/sysconfig; then
+ case `/sbin/sysconfig -q proc exec_disable_arg_limit` in
+ *1*) lt_cv_sys_max_cmd_len=-1 ;;
+ esac
+ fi
+ ;;
+ sco3.2v5*)
+ lt_cv_sys_max_cmd_len=102400
+ ;;
+ sysv5* | sco5v6* | sysv4.2uw2*)
+ kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`
+ if test -n "$kargmax"; then
+ lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[ ]]//'`
+ else
+ lt_cv_sys_max_cmd_len=32768
+ fi
+ ;;
+ *)
+ lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`
+ if test -n "$lt_cv_sys_max_cmd_len"; then
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 4`
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \* 3`
+ else
+ SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}
+ while (test "X"`$SHELL [$]0 --fallback-echo "X$teststring" 2>/dev/null` \
+ = "XX$teststring") >/dev/null 2>&1 &&
+ new_result=`expr "X$teststring" : ".*" 2>&1` &&
+ lt_cv_sys_max_cmd_len=$new_result &&
+ test $i != 17 # 1/2 MB should be enough
+ do
+ i=`expr $i + 1`
+ teststring=$teststring$teststring
+ done
+ teststring=
+ # Add a significant safety factor because C++ compilers can tack on massive
+ # amounts of additional arguments before passing them to the linker.
+ # It appears as though 1/2 is a usable value.
+ lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \/ 2`
+ fi
+ ;;
+ esac
+])
+if test -n $lt_cv_sys_max_cmd_len ; then
+ AC_MSG_RESULT($lt_cv_sys_max_cmd_len)
+else
+ AC_MSG_RESULT(none)
+fi
+])# AC_LIBTOOL_SYS_MAX_CMD_LEN
+
+
+# _LT_AC_CHECK_DLFCN
+# ------------------
+AC_DEFUN([_LT_AC_CHECK_DLFCN],
+[AC_CHECK_HEADERS(dlfcn.h)dnl
+])# _LT_AC_CHECK_DLFCN
+
+
+# _LT_AC_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,
+# ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)
+# ---------------------------------------------------------------------
+AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "$cross_compiling" = yes; then :
+ [$4]
+else
+ lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
+ lt_status=$lt_dlunknown
+ cat > conftest.$ac_ext <<EOF
+[#line __oline__ "configure"
+#include "confdefs.h"
+
+#if HAVE_DLFCN_H
+#include <dlfcn.h>
+#endif
+
+#include <stdio.h>
+
+#ifdef RTLD_GLOBAL
+# define LT_DLGLOBAL RTLD_GLOBAL
+#else
+# ifdef DL_GLOBAL
+# define LT_DLGLOBAL DL_GLOBAL
+# else
+# define LT_DLGLOBAL 0
+# endif
+#endif
+
+/* We may have to define LT_DLLAZY_OR_NOW in the command line if we
+ find out it does not work in some platform. */
+#ifndef LT_DLLAZY_OR_NOW
+# ifdef RTLD_LAZY
+# define LT_DLLAZY_OR_NOW RTLD_LAZY
+# else
+# ifdef DL_LAZY
+# define LT_DLLAZY_OR_NOW DL_LAZY
+# else
+# ifdef RTLD_NOW
+# define LT_DLLAZY_OR_NOW RTLD_NOW
+# else
+# ifdef DL_NOW
+# define LT_DLLAZY_OR_NOW DL_NOW
+# else
+# define LT_DLLAZY_OR_NOW 0
+# endif
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __cplusplus
+extern "C" void exit (int);
+#endif
+
+void fnord() { int i=42;}
+int main ()
+{
+ void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);
+ int status = $lt_dlunknown;
+
+ if (self)
+ {
+ if (dlsym (self,"fnord")) status = $lt_dlno_uscore;
+ else if (dlsym( self,"_fnord")) status = $lt_dlneed_uscore;
+ /* dlclose (self); */
+ }
+ else
+ puts (dlerror ());
+
+ exit (status);
+}]
+EOF
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then
+ (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null
+ lt_status=$?
+ case x$lt_status in
+ x$lt_dlno_uscore) $1 ;;
+ x$lt_dlneed_uscore) $2 ;;
+ x$lt_dlunknown|x*) $3 ;;
+ esac
+ else :
+ # compilation failed
+ $3
+ fi
+fi
+rm -fr conftest*
+])# _LT_AC_TRY_DLOPEN_SELF
+
+
+# AC_LIBTOOL_DLOPEN_SELF
+# ----------------------
+AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF],
+[AC_REQUIRE([_LT_AC_CHECK_DLFCN])dnl
+if test "x$enable_dlopen" != xyes; then
+ enable_dlopen=unknown
+ enable_dlopen_self=unknown
+ enable_dlopen_self_static=unknown
+else
+ lt_cv_dlopen=no
+ lt_cv_dlopen_libs=
+
+ case $host_os in
+ beos*)
+ lt_cv_dlopen="load_add_on"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ;;
+
+ mingw* | pw32*)
+ lt_cv_dlopen="LoadLibrary"
+ lt_cv_dlopen_libs=
+ ;;
+
+ cygwin*)
+ lt_cv_dlopen="dlopen"
+ lt_cv_dlopen_libs=
+ ;;
+
+ darwin*)
+ # if libdl is installed we need to link against it
+ AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],[
+ lt_cv_dlopen="dyld"
+ lt_cv_dlopen_libs=
+ lt_cv_dlopen_self=yes
+ ])
+ ;;
+
+ *)
+ AC_CHECK_FUNC([shl_load],
+ [lt_cv_dlopen="shl_load"],
+ [AC_CHECK_LIB([dld], [shl_load],
+ [lt_cv_dlopen="shl_load" lt_cv_dlopen_libs="-dld"],
+ [AC_CHECK_FUNC([dlopen],
+ [lt_cv_dlopen="dlopen"],
+ [AC_CHECK_LIB([dl], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-ldl"],
+ [AC_CHECK_LIB([svld], [dlopen],
+ [lt_cv_dlopen="dlopen" lt_cv_dlopen_libs="-lsvld"],
+ [AC_CHECK_LIB([dld], [dld_link],
+ [lt_cv_dlopen="dld_link" lt_cv_dlopen_libs="-dld"])
+ ])
+ ])
+ ])
+ ])
+ ])
+ ;;
+ esac
+
+ if test "x$lt_cv_dlopen" != xno; then
+ enable_dlopen=yes
+ else
+ enable_dlopen=no
+ fi
+
+ case $lt_cv_dlopen in
+ dlopen)
+ save_CPPFLAGS="$CPPFLAGS"
+ test "x$ac_cv_header_dlfcn_h" = xyes && CPPFLAGS="$CPPFLAGS -DHAVE_DLFCN_H"
+
+ save_LDFLAGS="$LDFLAGS"
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $export_dynamic_flag_spec\"
+
+ save_LIBS="$LIBS"
+ LIBS="$lt_cv_dlopen_libs $LIBS"
+
+ AC_CACHE_CHECK([whether a program can dlopen itself],
+ lt_cv_dlopen_self, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,
+ lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)
+ ])
+
+ if test "x$lt_cv_dlopen_self" = xyes; then
+ wl=$lt_prog_compiler_wl eval LDFLAGS=\"\$LDFLAGS $lt_prog_compiler_static\"
+ AC_CACHE_CHECK([whether a statically linked program can dlopen itself],
+ lt_cv_dlopen_self_static, [dnl
+ _LT_AC_TRY_DLOPEN_SELF(
+ lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,
+ lt_cv_dlopen_self_static=no, lt_cv_dlopen_self_static=cross)
+ ])
+ fi
+
+ CPPFLAGS="$save_CPPFLAGS"
+ LDFLAGS="$save_LDFLAGS"
+ LIBS="$save_LIBS"
+ ;;
+ esac
+
+ case $lt_cv_dlopen_self in
+ yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;
+ *) enable_dlopen_self=unknown ;;
+ esac
+
+ case $lt_cv_dlopen_self_static in
+ yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;
+ *) enable_dlopen_self_static=unknown ;;
+ esac
+fi
+])# AC_LIBTOOL_DLOPEN_SELF
+
+
+# AC_LIBTOOL_PROG_CC_C_O([TAGNAME])
+# ---------------------------------
+# Check to see if options -c and -o are simultaneously supported by compiler
+AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+AC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)],
+ [_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no
+ $rm -r conftest 2>/dev/null
+ mkdir conftest
+ cd conftest
+ mkdir out
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ lt_compiler_flag="-o out/conftest2.$ac_objext"
+ # Insert the option either (1) after the last *FLAGS variable, or
+ # (2) before a word containing "conftest.", or (3) at the end.
+ # Note that $ac_compile itself does not contain backslashes and begins
+ # with a dollar sign (not a hyphen), so the echo should work correctly.
+ lt_compile=`echo "$ac_compile" | $SED \
+ -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \
+ -e 's: [[^ ]]*conftest\.: $lt_compiler_flag&:; t' \
+ -e 's:$: $lt_compiler_flag:'`
+ (eval echo "\"\$as_me:__oline__: $lt_compile\"" >&AS_MESSAGE_LOG_FD)
+ (eval "$lt_compile" 2>out/conftest.err)
+ ac_status=$?
+ cat out/conftest.err >&AS_MESSAGE_LOG_FD
+ echo "$as_me:__oline__: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ if (exit $ac_status) && test -s out/conftest2.$ac_objext
+ then
+ # The compiler can only warn and ignore the option if not recognized
+ # So say no if there are warnings
+ $echo "X$_lt_compiler_boilerplate" | $Xsed -e '/^$/d' > out/conftest.exp
+ $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2
+ if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+ fi
+ fi
+ chmod u+w . 2>&AS_MESSAGE_LOG_FD
+ $rm conftest*
+ # SGI C++ compiler will create directory out/ii_files/ for
+ # template instantiation
+ test -d out/ii_files && $rm out/ii_files/* && rmdir out/ii_files
+ $rm out/* && rmdir out
+ cd ..
+ rmdir conftest
+ $rm conftest*
+])
+])# AC_LIBTOOL_PROG_CC_C_O
+
+
+# AC_LIBTOOL_SYS_HARD_LINK_LOCKS([TAGNAME])
+# -----------------------------------------
+# Check to see if we can do hard links to lock some files if needed
+AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS],
+[AC_REQUIRE([_LT_AC_LOCK])dnl
+
+hard_links="nottested"
+if test "$_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)" = no && test "$need_locks" != no; then
+ # do not overwrite the value of need_locks provided by the user
+ AC_MSG_CHECKING([if we can lock with hard links])
+ hard_links=yes
+ $rm conftest*
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ touch conftest.a
+ ln conftest.a conftest.b 2>&5 || hard_links=no
+ ln conftest.a conftest.b 2>/dev/null && hard_links=no
+ AC_MSG_RESULT([$hard_links])
+ if test "$hard_links" = no; then
+ AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])
+ need_locks=warn
+ fi
+else
+ need_locks=no
+fi
+])# AC_LIBTOOL_SYS_HARD_LINK_LOCKS
+
+
+# AC_LIBTOOL_OBJDIR
+# -----------------
+AC_DEFUN([AC_LIBTOOL_OBJDIR],
+[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],
+[rm -f .libs 2>/dev/null
+mkdir .libs 2>/dev/null
+if test -d .libs; then
+ lt_cv_objdir=.libs
+else
+ # MS-DOS does not allow filenames that begin with a dot.
+ lt_cv_objdir=_libs
+fi
+rmdir .libs 2>/dev/null])
+objdir=$lt_cv_objdir
+])# AC_LIBTOOL_OBJDIR
+
+
+# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH([TAGNAME])
+# ----------------------------------------------
+# Check hardcoding attributes.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH],
+[AC_MSG_CHECKING([how to hardcode library paths into programs])
+_LT_AC_TAGVAR(hardcode_action, $1)=
+if test -n "$_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)" || \
+ test -n "$_LT_AC_TAGVAR(runpath_var, $1)" || \
+ test "X$_LT_AC_TAGVAR(hardcode_automatic, $1)" = "Xyes" ; then
+
+ # We can hardcode non-existant directories.
+ if test "$_LT_AC_TAGVAR(hardcode_direct, $1)" != no &&
+ # If the only mechanism to avoid hardcoding is shlibpath_var, we
+ # have to relink, otherwise we might link with an installed library
+ # when we should be linking with a yet-to-be-installed one
+ ## test "$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)" != no &&
+ test "$_LT_AC_TAGVAR(hardcode_minus_L, $1)" != no; then
+ # Linking always hardcodes the temporary library directory.
+ _LT_AC_TAGVAR(hardcode_action, $1)=relink
+ else
+ # We can link without hardcoding, and we can hardcode nonexisting dirs.
+ _LT_AC_TAGVAR(hardcode_action, $1)=immediate
+ fi
+else
+ # We cannot hardcode anything, or else we can only hardcode existing
+ # directories.
+ _LT_AC_TAGVAR(hardcode_action, $1)=unsupported
+fi
+AC_MSG_RESULT([$_LT_AC_TAGVAR(hardcode_action, $1)])
+
+if test "$_LT_AC_TAGVAR(hardcode_action, $1)" = relink; then
+ # Fast installation is not supported
+ enable_fast_install=no
+elif test "$shlibpath_overrides_runpath" = yes ||
+ test "$enable_shared" = no; then
+ # Fast installation is not necessary
+ enable_fast_install=needless
+fi
+])# AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH
+
+
+# AC_LIBTOOL_SYS_LIB_STRIP
+# ------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP],
+[striplib=
+old_striplib=
+AC_MSG_CHECKING([whether stripping libraries is possible])
+if test -n "$STRIP" && $STRIP -V 2>&1 | grep "GNU strip" >/dev/null; then
+ test -z "$old_striplib" && old_striplib="$STRIP --strip-debug"
+ test -z "$striplib" && striplib="$STRIP --strip-unneeded"
+ AC_MSG_RESULT([yes])
+else
+# FIXME - insert some real tests, host_os isn't really good enough
+ case $host_os in
+ darwin*)
+ if test -n "$STRIP" ; then
+ striplib="$STRIP -x"
+ old_striplib="$STRIP -S"
+ AC_MSG_RESULT([yes])
+ else
+ AC_MSG_RESULT([no])
+fi
+ ;;
+ *)
+ AC_MSG_RESULT([no])
+ ;;
+ esac
+fi
+])# AC_LIBTOOL_SYS_LIB_STRIP
+
+
+# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+# -----------------------------
+# PORTME Fill in your ld.so characteristics
+AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_MSG_CHECKING([dynamic linker characteristics])
+library_names_spec=
+libname_spec='lib$name'
+soname_spec=
+shrext_cmds=".so"
+postinstall_cmds=
+postuninstall_cmds=
+finish_cmds=
+finish_eval=
+shlibpath_var=
+shlibpath_overrides_runpath=unknown
+version_type=none
+dynamic_linker="$host_os ld.so"
+sys_lib_dlsearch_path_spec="/lib /usr/lib"
+m4_if($1,[],[
+if test "$GCC" = yes; then
+ case $host_os in
+ darwin*) lt_awk_arg="/^libraries:/,/LR/" ;;
+ *) lt_awk_arg="/^libraries:/" ;;
+ esac
+ lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$lt_search_path_spec" | grep ';' >/dev/null ; then
+ # if the path contains ";" then we assume it to be the separator
+ # otherwise default to the standard path separator (i.e. ":") - it is
+ # assumed that no part of a normal pathname contains ";" but that should
+ # okay in the real world where ";" in dirpaths is itself problematic.
+ lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ lt_search_path_spec=`echo "$lt_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ # Ok, now we have the path, separated by spaces, we can step through it
+ # and add multilib dir if necessary.
+ lt_tmp_lt_search_path_spec=
+ lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`
+ for lt_sys_path in $lt_search_path_spec; do
+ if test -d "$lt_sys_path/$lt_multi_os_dir"; then
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir"
+ else
+ test -d "$lt_sys_path" && \
+ lt_tmp_lt_search_path_spec="$lt_tmp_lt_search_path_spec $lt_sys_path"
+ fi
+ done
+ lt_search_path_spec=`echo $lt_tmp_lt_search_path_spec | awk '
+BEGIN {RS=" "; FS="/|\n";} {
+ lt_foo="";
+ lt_count=0;
+ for (lt_i = NF; lt_i > 0; lt_i--) {
+ if ($lt_i != "" && $lt_i != ".") {
+ if ($lt_i == "..") {
+ lt_count++;
+ } else {
+ if (lt_count == 0) {
+ lt_foo="/" $lt_i lt_foo;
+ } else {
+ lt_count--;
+ }
+ }
+ }
+ }
+ if (lt_foo != "") { lt_freq[[lt_foo]]++; }
+ if (lt_freq[[lt_foo]] == 1) { print lt_foo; }
+}'`
+ sys_lib_search_path_spec=`echo $lt_search_path_spec`
+else
+ sys_lib_search_path_spec="/lib /usr/lib /usr/local/lib"
+fi])
+need_lib_prefix=unknown
+hardcode_into_libs=no
+
+# when you set need_version to no, make sure it does not cause -set_version
+# flags to be left without arguments
+need_version=unknown
+
+case $host_os in
+aix3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'
+ shlibpath_var=LIBPATH
+
+ # AIX 3 has no versioning support, so we append a major version to the name.
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+
+aix4* | aix5*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ hardcode_into_libs=yes
+ if test "$host_cpu" = ia64; then
+ # AIX 5 supports IA64
+ library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ else
+ # With GCC up to 2.95.x, collect2 would create an import file
+ # for dependence libraries. The import file would start with
+ # the line `#! .'. This would cause the generated library to
+ # depend on `.', always an invalid library. This was fixed in
+ # development snapshots of GCC prior to 3.0.
+ case $host_os in
+ aix4 | aix4.[[01]] | aix4.[[01]].*)
+ if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'
+ echo ' yes '
+ echo '#endif'; } | ${CC} -E - | grep yes > /dev/null; then
+ :
+ else
+ can_build_shared=no
+ fi
+ ;;
+ esac
+ # AIX (on Power*) has no versioning support, so currently we can not hardcode correct
+ # soname into executable. Probably we can add versioning support to
+ # collect2, so additional links can be useful in future.
+ if test "$aix_use_runtimelinking" = yes; then
+ # If using run time linking (on AIX 4.2 or later) use lib<name>.so
+ # instead of lib<name>.a to let people know that these are not
+ # typical AIX shared libraries.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ else
+ # We preserve .a as extension for shared libraries through AIX4.2
+ # and later when we are not doing run time linking.
+ library_names_spec='${libname}${release}.a $libname.a'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ fi
+ shlibpath_var=LIBPATH
+ fi
+ ;;
+
+amigaos*)
+ library_names_spec='$libname.ixlibrary $libname.a'
+ # Create ${libname}_ixlibrary.a entries in /sys/libs.
+ finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`$echo "X$lib" | $Xsed -e '\''s%^.*/\([[^/]]*\)\.ixlibrary$%\1%'\''`; test $rm /sys/libs/${libname}_ixlibrary.a; $show "cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'
+ ;;
+
+beos*)
+ library_names_spec='${libname}${shared_ext}'
+ dynamic_linker="$host_os ld.so"
+ shlibpath_var=LIBRARY_PATH
+ ;;
+
+bsdi[[45]]*)
+ version_type=linux
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib"
+ sys_lib_dlsearch_path_spec="/shlib /usr/lib /usr/local/lib"
+ # the default ld.so.conf also contains /usr/contrib/lib and
+ # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow
+ # libtool to hard-code these into programs
+ ;;
+
+cygwin* | mingw* | pw32*)
+ version_type=windows
+ shrext_cmds=".dll"
+ need_version=no
+ need_lib_prefix=no
+
+ case $GCC,$host_os in
+ yes,cygwin* | yes,mingw* | yes,pw32*)
+ library_names_spec='$libname.dll.a'
+ # DLL is installed to $(libdir)/../bin by postinstall_cmds
+ postinstall_cmds='base_file=`basename \${file}`~
+ dlpath=`$SHELL 2>&1 -c '\''. $dir/'\''\${base_file}'\''i;echo \$dlname'\''`~
+ dldir=$destdir/`dirname \$dlpath`~
+ test -d \$dldir || mkdir -p \$dldir~
+ $install_prog $dir/$dlname \$dldir/$dlname~
+ chmod a+x \$dldir/$dlname'
+ postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\''. $file; echo \$dlname'\''`~
+ dlpath=$dir/\$dldll~
+ $rm \$dlpath'
+ shlibpath_overrides_runpath=yes
+
+ case $host_os in
+ cygwin*)
+ # Cygwin DLLs use 'cyg' prefix rather than 'lib'
+ soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec="/usr/lib /lib/w32api /lib /usr/local/lib"
+ ;;
+ mingw*)
+ # MinGW DLLs use traditional 'lib' prefix
+ soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ sys_lib_search_path_spec=`$CC -print-search-dirs | grep "^libraries:" | $SED -e "s/^libraries://" -e "s,=/,/,g"`
+ if echo "$sys_lib_search_path_spec" | [grep ';[c-zC-Z]:/' >/dev/null]; then
+ # It is most probably a Windows format PATH printed by
+ # mingw gcc, but we are running on Cygwin. Gcc prints its search
+ # path with ; separators, and with drive letters. We can handle the
+ # drive letters (cygwin fileutils understands them), so leave them,
+ # especially as we might pass files found there to a mingw objdump,
+ # which wouldn't understand a cygwinified path. Ahh.
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e 's/;/ /g'`
+ else
+ sys_lib_search_path_spec=`echo "$sys_lib_search_path_spec" | $SED -e "s/$PATH_SEPARATOR/ /g"`
+ fi
+ ;;
+ pw32*)
+ # pw32 DLLs use 'pw' prefix rather than 'lib'
+ library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'
+ ;;
+ esac
+ ;;
+
+ *)
+ library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'
+ ;;
+ esac
+ dynamic_linker='Win32 ld.exe'
+ # FIXME: first we should search . and the directory the executable is in
+ shlibpath_var=PATH
+ ;;
+
+darwin* | rhapsody*)
+ dynamic_linker="$host_os dyld"
+ version_type=darwin
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${versuffix}$shared_ext ${libname}${release}${major}$shared_ext ${libname}$shared_ext'
+ soname_spec='${libname}${release}${major}$shared_ext'
+ shlibpath_overrides_runpath=yes
+ shlibpath_var=DYLD_LIBRARY_PATH
+ shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'
+ m4_if([$1], [],[
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /usr/local/lib"])
+ sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'
+ ;;
+
+dgux*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+freebsd1*)
+ dynamic_linker=no
+ ;;
+
+freebsd* | dragonfly*)
+ # DragonFly does not have aout. When/if they implement a new
+ # versioning mechanism, adjust this.
+ if test -x /usr/bin/objformat; then
+ objformat=`/usr/bin/objformat`
+ else
+ case $host_os in
+ freebsd[[123]]*) objformat=aout ;;
+ *) objformat=elf ;;
+ esac
+ fi
+ version_type=freebsd-$objformat
+ case $version_type in
+ freebsd-elf*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ need_version=no
+ need_lib_prefix=no
+ ;;
+ freebsd-*)
+ library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'
+ need_version=yes
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_os in
+ freebsd2*)
+ shlibpath_overrides_runpath=yes
+ ;;
+ freebsd3.[[01]]* | freebsdelf3.[[01]]*)
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \
+ freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+ *) # from 4.6 on, and DragonFly
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+ esac
+ ;;
+
+gnu*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ ;;
+
+hpux9* | hpux10* | hpux11*)
+ # Give a soname corresponding to the major version so that dld.sl refuses to
+ # link against other versions.
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ case $host_cpu in
+ ia64*)
+ shrext_cmds='.so'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.so"
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ if test "X$HPUX_IA64_MODE" = X32; then
+ sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
+ else
+ sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
+ fi
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ hppa*64*)
+ shrext_cmds='.sl'
+ hardcode_into_libs=yes
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH
+ shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ sys_lib_search_path_spec="/usr/lib/pa20_64 /usr/ccs/lib/pa20_64"
+ sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
+ ;;
+ *)
+ shrext_cmds='.sl'
+ dynamic_linker="$host_os dld.sl"
+ shlibpath_var=SHLIB_PATH
+ shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ ;;
+ esac
+ # HP-UX runs *really* slowly unless shared libraries are mode 555.
+ postinstall_cmds='chmod 555 $lib'
+ ;;
+
+interix[[3-9]]*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $host_os in
+ nonstopux*) version_type=nonstopux ;;
+ *)
+ if test "$lt_cv_prog_gnu_ld" = yes; then
+ version_type=linux
+ else
+ version_type=irix
+ fi ;;
+ esac
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'
+ case $host_os in
+ irix5* | nonstopux*)
+ libsuff= shlibsuff=
+ ;;
+ *)
+ case $LD in # libtool.m4 will add one of these switches to LD
+ *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ")
+ libsuff= shlibsuff= libmagic=32-bit;;
+ *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ")
+ libsuff=32 shlibsuff=N32 libmagic=N32;;
+ *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ")
+ libsuff=64 shlibsuff=64 libmagic=64-bit;;
+ *) libsuff= shlibsuff= libmagic=never-match;;
+ esac
+ ;;
+ esac
+ shlibpath_var=LD_LIBRARY${shlibsuff}_PATH
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec="/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}"
+ sys_lib_dlsearch_path_spec="/usr/lib${libsuff} /lib${libsuff}"
+ hardcode_into_libs=yes
+ ;;
+
+# No shared lib support for Linux oldld, aout, or coff.
+linux*oldld* | linux*aout* | linux*coff*)
+ dynamic_linker=no
+ ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -n $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ # This implies no fast_install, which is unacceptable.
+ # Some rework will be needed to allow for fast_install
+ # before this can be enabled.
+ hardcode_into_libs=yes
+
+ # Append ld.so.conf contents to the search path
+ if test -f /etc/ld.so.conf; then
+ lt_ld_extra=`awk '/^include / { system(sprintf("cd /etc; cat %s 2>/dev/null", \[$]2)); skip = 1; } { if (!skip) print \[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[ ]*hwcap[ ]/d;s/[:, ]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;/^$/d' | tr '\n' ' '`
+ sys_lib_dlsearch_path_spec="/lib /usr/lib $lt_ld_extra"
+ fi
+
+ # We used to test for /lib/ld.so.1 and disable shared libraries on
+ # powerpc, because MkLinux only supported shared libraries with the
+ # GNU dynamic linker. Since this was broken with cross compilers,
+ # most powerpc-linux boxes support dynamic linking these days and
+ # people can always --disable-shared, the test was removed, and we
+ # assume the GNU/Linux dynamic linker is in use.
+ dynamic_linker='GNU/Linux ld.so'
+ ;;
+
+netbsdelf*-gnu)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=no
+ hardcode_into_libs=yes
+ dynamic_linker='NetBSD ld.elf_so'
+ ;;
+
+netbsd*)
+ version_type=sunos
+ need_lib_prefix=no
+ need_version=no
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ dynamic_linker='NetBSD (a.out) ld.so'
+ else
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ dynamic_linker='NetBSD ld.elf_so'
+ fi
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ ;;
+
+newsos6)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+nto-qnx*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ ;;
+
+openbsd*)
+ version_type=sunos
+ sys_lib_dlsearch_path_spec="/usr/lib"
+ need_lib_prefix=no
+ # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.
+ case $host_os in
+ openbsd3.3 | openbsd3.3.*) need_version=yes ;;
+ *) need_version=no ;;
+ esac
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/sbin" ldconfig -m $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ case $host_os in
+ openbsd2.[[89]] | openbsd2.[[89]].*)
+ shlibpath_overrides_runpath=no
+ ;;
+ *)
+ shlibpath_overrides_runpath=yes
+ ;;
+ esac
+ else
+ shlibpath_overrides_runpath=yes
+ fi
+ ;;
+
+os2*)
+ libname_spec='$name'
+ shrext_cmds=".dll"
+ need_lib_prefix=no
+ library_names_spec='$libname${shared_ext} $libname.a'
+ dynamic_linker='OS/2 ld.exe'
+ shlibpath_var=LIBPATH
+ ;;
+
+osf3* | osf4* | osf5*)
+ version_type=osf
+ need_lib_prefix=no
+ need_version=no
+ soname_spec='${libname}${release}${shared_ext}$major'
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ shlibpath_var=LD_LIBRARY_PATH
+ sys_lib_search_path_spec="/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib"
+ sys_lib_dlsearch_path_spec="$sys_lib_search_path_spec"
+ ;;
+
+rdos*)
+ dynamic_linker=no
+ ;;
+
+solaris*)
+ version_type=linux
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ hardcode_into_libs=yes
+ # ldd complains unless libraries are executable
+ postinstall_cmds='chmod +x $lib'
+ ;;
+
+sunos4*)
+ version_type=sunos
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'
+ finish_cmds='PATH="\$PATH:/usr/etc" ldconfig $libdir'
+ shlibpath_var=LD_LIBRARY_PATH
+ shlibpath_overrides_runpath=yes
+ if test "$with_gnu_ld" = yes; then
+ need_lib_prefix=no
+ fi
+ need_version=yes
+ ;;
+
+sysv4 | sysv4.3*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ case $host_vendor in
+ sni)
+ shlibpath_overrides_runpath=no
+ need_lib_prefix=no
+ export_dynamic_flag_spec='${wl}-Blargedynsym'
+ runpath_var=LD_RUN_PATH
+ ;;
+ siemens)
+ need_lib_prefix=no
+ ;;
+ motorola)
+ need_lib_prefix=no
+ need_version=no
+ shlibpath_overrides_runpath=no
+ sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'
+ ;;
+ esac
+ ;;
+
+sysv4*MP*)
+ if test -d /usr/nec ;then
+ version_type=linux
+ library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'
+ soname_spec='$libname${shared_ext}.$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ fi
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ version_type=freebsd-elf
+ need_lib_prefix=no
+ need_version=no
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ hardcode_into_libs=yes
+ if test "$with_gnu_ld" = yes; then
+ sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'
+ shlibpath_overrides_runpath=no
+ else
+ sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'
+ shlibpath_overrides_runpath=yes
+ case $host_os in
+ sco3.2v5*)
+ sys_lib_search_path_spec="$sys_lib_search_path_spec /lib"
+ ;;
+ esac
+ fi
+ sys_lib_dlsearch_path_spec='/usr/lib'
+ ;;
+
+uts4*)
+ version_type=linux
+ library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
+ soname_spec='${libname}${release}${shared_ext}$major'
+ shlibpath_var=LD_LIBRARY_PATH
+ ;;
+
+*)
+ dynamic_linker=no
+ ;;
+esac
+AC_MSG_RESULT([$dynamic_linker])
+test "$dynamic_linker" = no && can_build_shared=no
+
+variables_saved_for_relink="PATH $shlibpath_var $runpath_var"
+if test "$GCC" = yes; then
+ variables_saved_for_relink="$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH"
+fi
+])# AC_LIBTOOL_SYS_DYNAMIC_LINKER
+
+
+# _LT_AC_TAGCONFIG
+# ----------------
+AC_DEFUN([_LT_AC_TAGCONFIG],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_ARG_WITH([tags],
+ [AC_HELP_STRING([--with-tags@<:@=TAGS@:>@],
+ [include additional configurations @<:@automatic@:>@])],
+ [tagnames="$withval"])
+
+if test -f "$ltmain" && test -n "$tagnames"; then
+ if test ! -f "${ofile}"; then
+ AC_MSG_WARN([output file `$ofile' does not exist])
+ fi
+
+ if test -z "$LTCC"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCC='`"
+ if test -z "$LTCC"; then
+ AC_MSG_WARN([output file `$ofile' does not look like a libtool script])
+ else
+ AC_MSG_WARN([using `LTCC=$LTCC', extracted from `$ofile'])
+ fi
+ fi
+ if test -z "$LTCFLAGS"; then
+ eval "`$SHELL ${ofile} --config | grep '^LTCFLAGS='`"
+ fi
+
+ # Extract list of available tagged configurations in $ofile.
+ # Note that this assumes the entire list is on one line.
+ available_tags=`grep "^available_tags=" "${ofile}" | $SED -e 's/available_tags=\(.*$\)/\1/' -e 's/\"//g'`
+
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for tagname in $tagnames; do
+ IFS="$lt_save_ifs"
+ # Check whether tagname contains only valid characters
+ case `$echo "X$tagname" | $Xsed -e 's:[[-_ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890,/]]::g'` in
+ "") ;;
+ *) AC_MSG_ERROR([invalid tag name: $tagname])
+ ;;
+ esac
+
+ if grep "^# ### BEGIN LIBTOOL TAG CONFIG: $tagname$" < "${ofile}" > /dev/null
+ then
+ AC_MSG_ERROR([tag name \"$tagname\" already exists])
+ fi
+
+ # Update the list of available tags.
+ if test -n "$tagname"; then
+ echo appending configuration tag \"$tagname\" to $ofile
+
+ case $tagname in
+ CXX)
+ if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ AC_LIBTOOL_LANG_CXX_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ F77)
+ if test -n "$F77" && test "X$F77" != "Xno"; then
+ AC_LIBTOOL_LANG_F77_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ GCJ)
+ if test -n "$GCJ" && test "X$GCJ" != "Xno"; then
+ AC_LIBTOOL_LANG_GCJ_CONFIG
+ else
+ tagname=""
+ fi
+ ;;
+
+ RC)
+ AC_LIBTOOL_LANG_RC_CONFIG
+ ;;
+
+ *)
+ AC_MSG_ERROR([Unsupported tag name: $tagname])
+ ;;
+ esac
+
+ # Append the new tag name to the list of available tags.
+ if test -n "$tagname" ; then
+ available_tags="$available_tags $tagname"
+ fi
+ fi
+ done
+ IFS="$lt_save_ifs"
+
+ # Now substitute the updated list of available tags.
+ if eval "sed -e 's/^available_tags=.*\$/available_tags=\"$available_tags\"/' \"$ofile\" > \"${ofile}T\""; then
+ mv "${ofile}T" "$ofile"
+ chmod +x "$ofile"
+ else
+ rm -f "${ofile}T"
+ AC_MSG_ERROR([unable to update list of available tagged configurations.])
+ fi
+fi
+])# _LT_AC_TAGCONFIG
+
+
+# AC_LIBTOOL_DLOPEN
+# -----------------
+# enable checks for dlopen support
+AC_DEFUN([AC_LIBTOOL_DLOPEN],
+ [AC_BEFORE([$0],[AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_DLOPEN
+
+
+# AC_LIBTOOL_WIN32_DLL
+# --------------------
+# declare package support for building win32 DLLs
+AC_DEFUN([AC_LIBTOOL_WIN32_DLL],
+[AC_BEFORE([$0], [AC_LIBTOOL_SETUP])
+])# AC_LIBTOOL_WIN32_DLL
+
+
+# AC_ENABLE_SHARED([DEFAULT])
+# ---------------------------
+# implement the --enable-shared flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_SHARED],
+[define([AC_ENABLE_SHARED_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([shared],
+ [AC_HELP_STRING([--enable-shared@<:@=PKGS@:>@],
+ [build shared libraries @<:@default=]AC_ENABLE_SHARED_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_shared=yes ;;
+ no) enable_shared=no ;;
+ *)
+ enable_shared=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_shared=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_shared=]AC_ENABLE_SHARED_DEFAULT)
+])# AC_ENABLE_SHARED
+
+
+# AC_DISABLE_SHARED
+# -----------------
+# set the default shared flag to --disable-shared
+AC_DEFUN([AC_DISABLE_SHARED],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_SHARED(no)
+])# AC_DISABLE_SHARED
+
+
+# AC_ENABLE_STATIC([DEFAULT])
+# ---------------------------
+# implement the --enable-static flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_STATIC],
+[define([AC_ENABLE_STATIC_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([static],
+ [AC_HELP_STRING([--enable-static@<:@=PKGS@:>@],
+ [build static libraries @<:@default=]AC_ENABLE_STATIC_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_static=yes ;;
+ no) enable_static=no ;;
+ *)
+ enable_static=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_static=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_static=]AC_ENABLE_STATIC_DEFAULT)
+])# AC_ENABLE_STATIC
+
+
+# AC_DISABLE_STATIC
+# -----------------
+# set the default static flag to --disable-static
+AC_DEFUN([AC_DISABLE_STATIC],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_STATIC(no)
+])# AC_DISABLE_STATIC
+
+
+# AC_ENABLE_FAST_INSTALL([DEFAULT])
+# ---------------------------------
+# implement the --enable-fast-install flag
+# DEFAULT is either `yes' or `no'. If omitted, it defaults to `yes'.
+AC_DEFUN([AC_ENABLE_FAST_INSTALL],
+[define([AC_ENABLE_FAST_INSTALL_DEFAULT], ifelse($1, no, no, yes))dnl
+AC_ARG_ENABLE([fast-install],
+ [AC_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],
+ [optimize for fast installation @<:@default=]AC_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],
+ [p=${PACKAGE-default}
+ case $enableval in
+ yes) enable_fast_install=yes ;;
+ no) enable_fast_install=no ;;
+ *)
+ enable_fast_install=no
+ # Look at the argument we got. We use all the common list separators.
+ lt_save_ifs="$IFS"; IFS="${IFS}$PATH_SEPARATOR,"
+ for pkg in $enableval; do
+ IFS="$lt_save_ifs"
+ if test "X$pkg" = "X$p"; then
+ enable_fast_install=yes
+ fi
+ done
+ IFS="$lt_save_ifs"
+ ;;
+ esac],
+ [enable_fast_install=]AC_ENABLE_FAST_INSTALL_DEFAULT)
+])# AC_ENABLE_FAST_INSTALL
+
+
+# AC_DISABLE_FAST_INSTALL
+# -----------------------
+# set the default to --disable-fast-install
+AC_DEFUN([AC_DISABLE_FAST_INSTALL],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+AC_ENABLE_FAST_INSTALL(no)
+])# AC_DISABLE_FAST_INSTALL
+
+
+# AC_LIBTOOL_PICMODE([MODE])
+# --------------------------
+# implement the --with-pic flag
+# MODE is either `yes' or `no'. If omitted, it defaults to `both'.
+AC_DEFUN([AC_LIBTOOL_PICMODE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+pic_mode=ifelse($#,1,$1,default)
+])# AC_LIBTOOL_PICMODE
+
+
+# AC_PROG_EGREP
+# -------------
+# This is predefined starting with Autoconf 2.54, so this conditional
+# definition can be removed once we require Autoconf 2.54 or later.
+m4_ifndef([AC_PROG_EGREP], [AC_DEFUN([AC_PROG_EGREP],
+[AC_CACHE_CHECK([for egrep], [ac_cv_prog_egrep],
+ [if echo a | (grep -E '(a|b)') >/dev/null 2>&1
+ then ac_cv_prog_egrep='grep -E'
+ else ac_cv_prog_egrep='egrep'
+ fi])
+ EGREP=$ac_cv_prog_egrep
+ AC_SUBST([EGREP])
+])])
+
+
+# AC_PATH_TOOL_PREFIX
+# -------------------
+# find a file program which can recognize shared library
+AC_DEFUN([AC_PATH_TOOL_PREFIX],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_MSG_CHECKING([for $1])
+AC_CACHE_VAL(lt_cv_path_MAGIC_CMD,
+[case $MAGIC_CMD in
+[[\\/*] | ?:[\\/]*])
+ lt_cv_path_MAGIC_CMD="$MAGIC_CMD" # Let the user override the test with a path.
+ ;;
+*)
+ lt_save_MAGIC_CMD="$MAGIC_CMD"
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+dnl $ac_dummy forces splitting on constant user-supplied paths.
+dnl POSIX.2 word splitting is done only on the output of word expansions,
+dnl not every word. This closes a longstanding sh security hole.
+ ac_dummy="ifelse([$2], , $PATH, [$2])"
+ for ac_dir in $ac_dummy; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f $ac_dir/$1; then
+ lt_cv_path_MAGIC_CMD="$ac_dir/$1"
+ if test -n "$file_magic_test_file"; then
+ case $deplibs_check_method in
+ "file_magic "*)
+ file_magic_regex=`expr "$deplibs_check_method" : "file_magic \(.*\)"`
+ MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+ if eval $file_magic_cmd \$file_magic_test_file 2> /dev/null |
+ $EGREP "$file_magic_regex" > /dev/null; then
+ :
+ else
+ cat <<EOF 1>&2
+
+*** Warning: the command libtool uses to detect shared libraries,
+*** $file_magic_cmd, produces output that libtool cannot recognize.
+*** The result is that libtool may fail to recognize shared libraries
+*** as such. This will affect the creation of libtool libraries that
+*** depend on shared libraries, but programs linked with such libtool
+*** libraries will work regardless of this problem. Nevertheless, you
+*** may want to report the problem to your system manager and/or to
+*** bug-libtool@gnu.org
+
+EOF
+ fi ;;
+ esac
+ fi
+ break
+ fi
+ done
+ IFS="$lt_save_ifs"
+ MAGIC_CMD="$lt_save_MAGIC_CMD"
+ ;;
+esac])
+MAGIC_CMD="$lt_cv_path_MAGIC_CMD"
+if test -n "$MAGIC_CMD"; then
+ AC_MSG_RESULT($MAGIC_CMD)
+else
+ AC_MSG_RESULT(no)
+fi
+])# AC_PATH_TOOL_PREFIX
+
+
+# AC_PATH_MAGIC
+# -------------
+# find a file program which can recognize a shared library
+AC_DEFUN([AC_PATH_MAGIC],
+[AC_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)
+if test -z "$lt_cv_path_MAGIC_CMD"; then
+ if test -n "$ac_tool_prefix"; then
+ AC_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)
+ else
+ MAGIC_CMD=:
+ fi
+fi
+])# AC_PATH_MAGIC
+
+
+# AC_PROG_LD
+# ----------
+# find the pathname to the GNU or non-GNU linker
+AC_DEFUN([AC_PROG_LD],
+[AC_ARG_WITH([gnu-ld],
+ [AC_HELP_STRING([--with-gnu-ld],
+ [assume the C compiler uses GNU ld @<:@default=no@:>@])],
+ [test "$withval" = no || with_gnu_ld=yes],
+ [with_gnu_ld=no])
+AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_REQUIRE([AC_PROG_CC])dnl
+AC_REQUIRE([AC_CANONICAL_HOST])dnl
+AC_REQUIRE([AC_CANONICAL_BUILD])dnl
+ac_prog=ld
+if test "$GCC" = yes; then
+ # Check if gcc -print-prog-name=ld gives a path.
+ AC_MSG_CHECKING([for ld used by $CC])
+ case $host in
+ *-*-mingw*)
+ # gcc leaves a trailing carriage return which upsets mingw
+ ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;;
+ *)
+ ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;
+ esac
+ case $ac_prog in
+ # Accept absolute paths.
+ [[\\/]]* | ?:[[\\/]]*)
+ re_direlt='/[[^/]][[^/]]*/\.\./'
+ # Canonicalize the pathname of ld
+ ac_prog=`echo $ac_prog| $SED 's%\\\\%/%g'`
+ while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do
+ ac_prog=`echo $ac_prog| $SED "s%$re_direlt%/%"`
+ done
+ test -z "$LD" && LD="$ac_prog"
+ ;;
+ "")
+ # If it fails, then pretend we aren't using GCC.
+ ac_prog=ld
+ ;;
+ *)
+ # If it is relative, then search for the first ld in PATH.
+ with_gnu_ld=unknown
+ ;;
+ esac
+elif test "$with_gnu_ld" = yes; then
+ AC_MSG_CHECKING([for GNU ld])
+else
+ AC_MSG_CHECKING([for non-GNU ld])
+fi
+AC_CACHE_VAL(lt_cv_path_LD,
+[if test -z "$LD"; then
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then
+ lt_cv_path_LD="$ac_dir/$ac_prog"
+ # Check to see if the program is GNU ld. I'd rather use --version,
+ # but apparently some variants of GNU ld only accept -v.
+ # Break only if it was the GNU/non-GNU ld that we prefer.
+ case `"$lt_cv_path_LD" -v 2>&1 </dev/null` in
+ *GNU* | *'with BFD'*)
+ test "$with_gnu_ld" != no && break
+ ;;
+ *)
+ test "$with_gnu_ld" != yes && break
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+else
+ lt_cv_path_LD="$LD" # Let the user override the test with a path.
+fi])
+LD="$lt_cv_path_LD"
+if test -n "$LD"; then
+ AC_MSG_RESULT($LD)
+else
+ AC_MSG_RESULT(no)
+fi
+test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH])
+AC_PROG_LD_GNU
+])# AC_PROG_LD
+
+
+# AC_PROG_LD_GNU
+# --------------
+AC_DEFUN([AC_PROG_LD_GNU],
+[AC_REQUIRE([AC_PROG_EGREP])dnl
+AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,
+[# I'd rather use --version here, but apparently some GNU lds only accept -v.
+case `$LD -v 2>&1 </dev/null` in
+*GNU* | *'with BFD'*)
+ lt_cv_prog_gnu_ld=yes
+ ;;
+*)
+ lt_cv_prog_gnu_ld=no
+ ;;
+esac])
+with_gnu_ld=$lt_cv_prog_gnu_ld
+])# AC_PROG_LD_GNU
+
+
+# AC_PROG_LD_RELOAD_FLAG
+# ----------------------
+# find reload flag for linker
+# -- PORTME Some linkers may need a different reload flag.
+AC_DEFUN([AC_PROG_LD_RELOAD_FLAG],
+[AC_CACHE_CHECK([for $LD option to reload object files],
+ lt_cv_ld_reload_flag,
+ [lt_cv_ld_reload_flag='-r'])
+reload_flag=$lt_cv_ld_reload_flag
+case $reload_flag in
+"" | " "*) ;;
+*) reload_flag=" $reload_flag" ;;
+esac
+reload_cmds='$LD$reload_flag -o $output$reload_objs'
+case $host_os in
+ darwin*)
+ if test "$GCC" = yes; then
+ reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'
+ else
+ reload_cmds='$LD$reload_flag -o $output$reload_objs'
+ fi
+ ;;
+esac
+])# AC_PROG_LD_RELOAD_FLAG
+
+
+# AC_DEPLIBS_CHECK_METHOD
+# -----------------------
+# how to check for library dependencies
+# -- PORTME fill in with the dynamic library characteristics
+AC_DEFUN([AC_DEPLIBS_CHECK_METHOD],
+[AC_CACHE_CHECK([how to recognize dependent libraries],
+lt_cv_deplibs_check_method,
+[lt_cv_file_magic_cmd='$MAGIC_CMD'
+lt_cv_file_magic_test_file=
+lt_cv_deplibs_check_method='unknown'
+# Need to set the preceding variable on all platforms that support
+# interlibrary dependencies.
+# 'none' -- dependencies not supported.
+# `unknown' -- same as none, but documents that we really don't know.
+# 'pass_all' -- all dependencies passed with no checks.
+# 'test_compile' -- check by making test program.
+# 'file_magic [[regex]]' -- check by looking for files in library path
+# which responds to the $file_magic_cmd with a given extended regex.
+# If you have `file' or equivalent on your system and you're not sure
+# whether `pass_all' will *always* work, you probably want this one.
+
+case $host_os in
+aix4* | aix5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+beos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+bsdi[[45]]*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'
+ lt_cv_file_magic_cmd='/usr/bin/file -L'
+ lt_cv_file_magic_test_file=/shlib/libc.so
+ ;;
+
+cygwin*)
+ # func_win32_libid is a shell function defined in ltmain.sh
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ ;;
+
+mingw* | pw32*)
+ # Base MSYS/MinGW do not provide the 'file' command needed by
+ # func_win32_libid shell function, so use a weaker test based on 'objdump',
+ # unless we find 'file', for example because we are cross-compiling.
+ if ( file / ) >/dev/null 2>&1; then
+ lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'
+ lt_cv_file_magic_cmd='func_win32_libid'
+ else
+ lt_cv_deplibs_check_method='file_magic file format pei*-i386(.*architecture: i386)?'
+ lt_cv_file_magic_cmd='$OBJDUMP -f'
+ fi
+ ;;
+
+darwin* | rhapsody*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+freebsd* | dragonfly*)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ case $host_cpu in
+ i*86 )
+ # Not sure whether the presence of OpenBSD here was a mistake.
+ # Let's accept both of them until this is cleared up.
+ lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`
+ ;;
+ esac
+ else
+ lt_cv_deplibs_check_method=pass_all
+ fi
+ ;;
+
+gnu*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+hpux10.20* | hpux11*)
+ lt_cv_file_magic_cmd=/usr/bin/file
+ case $host_cpu in
+ ia64*)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'
+ lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
+ ;;
+ hppa*64*)
+ [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - PA-RISC [0-9].[0-9]']
+ lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
+ ;;
+ *)
+ lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]].[[0-9]]) shared library'
+ lt_cv_file_magic_test_file=/usr/lib/libc.sl
+ ;;
+ esac
+ ;;
+
+interix[[3-9]]*)
+ # PIC code is broken on Interix 3.x, that's why |\.a not |_pic\.a here
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|\.a)$'
+ ;;
+
+irix5* | irix6* | nonstopux*)
+ case $LD in
+ *-32|*"-32 ") libmagic=32-bit;;
+ *-n32|*"-n32 ") libmagic=N32;;
+ *-64|*"-64 ") libmagic=64-bit;;
+ *) libmagic=never-match;;
+ esac
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+# This must be Linux ELF.
+linux* | k*bsd*-gnu)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+netbsd* | netbsdelf*-gnu)
+ if echo __ELF__ | $CC -E - | grep __ELF__ > /dev/null; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so|_pic\.a)$'
+ fi
+ ;;
+
+newos6*)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'
+ lt_cv_file_magic_cmd=/usr/bin/file
+ lt_cv_file_magic_test_file=/usr/lib/libnls.so
+ ;;
+
+nto-qnx*)
+ lt_cv_deplibs_check_method=unknown
+ ;;
+
+openbsd*)
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|\.so|_pic\.a)$'
+ else
+ lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\.so\.[[0-9]]+\.[[0-9]]+|_pic\.a)$'
+ fi
+ ;;
+
+osf3* | osf4* | osf5*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+rdos*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+solaris*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+
+sysv4 | sysv4.3*)
+ case $host_vendor in
+ motorola)
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'
+ lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`
+ ;;
+ ncr)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ sequent)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'
+ ;;
+ sni)
+ lt_cv_file_magic_cmd='/bin/file'
+ lt_cv_deplibs_check_method="file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib"
+ lt_cv_file_magic_test_file=/lib/libc.so
+ ;;
+ siemens)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ pc)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+ esac
+ ;;
+
+sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)
+ lt_cv_deplibs_check_method=pass_all
+ ;;
+esac
+])
+file_magic_cmd=$lt_cv_file_magic_cmd
+deplibs_check_method=$lt_cv_deplibs_check_method
+test -z "$deplibs_check_method" && deplibs_check_method=unknown
+])# AC_DEPLIBS_CHECK_METHOD
+
+
+# AC_PROG_NM
+# ----------
+# find the pathname to a BSD-compatible name lister
+AC_DEFUN([AC_PROG_NM],
+[AC_CACHE_CHECK([for BSD-compatible nm], lt_cv_path_NM,
+[if test -n "$NM"; then
+ # Let the user override the test.
+ lt_cv_path_NM="$NM"
+else
+ lt_nm_to_check="${ac_tool_prefix}nm"
+ if test -n "$ac_tool_prefix" && test "$build" = "$host"; then
+ lt_nm_to_check="$lt_nm_to_check nm"
+ fi
+ for lt_tmp_nm in $lt_nm_to_check; do
+ lt_save_ifs="$IFS"; IFS=$PATH_SEPARATOR
+ for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do
+ IFS="$lt_save_ifs"
+ test -z "$ac_dir" && ac_dir=.
+ tmp_nm="$ac_dir/$lt_tmp_nm"
+ if test -f "$tmp_nm" || test -f "$tmp_nm$ac_exeext" ; then
+ # Check to see if the nm accepts a BSD-compat flag.
+ # Adding the `sed 1q' prevents false positives on HP-UX, which says:
+ # nm: unknown option "B" ignored
+ # Tru64's nm complains that /dev/null is an invalid object file
+ case `"$tmp_nm" -B /dev/null 2>&1 | sed '1q'` in
+ */dev/null* | *'Invalid file or object type'*)
+ lt_cv_path_NM="$tmp_nm -B"
+ break
+ ;;
+ *)
+ case `"$tmp_nm" -p /dev/null 2>&1 | sed '1q'` in
+ */dev/null*)
+ lt_cv_path_NM="$tmp_nm -p"
+ break
+ ;;
+ *)
+ lt_cv_path_NM=${lt_cv_path_NM="$tmp_nm"} # keep the first match, but
+ continue # so that we can try to find one that supports BSD flags
+ ;;
+ esac
+ ;;
+ esac
+ fi
+ done
+ IFS="$lt_save_ifs"
+ done
+ test -z "$lt_cv_path_NM" && lt_cv_path_NM=nm
+fi])
+NM="$lt_cv_path_NM"
+])# AC_PROG_NM
+
+
+# AC_CHECK_LIBM
+# -------------
+# check for math library
+AC_DEFUN([AC_CHECK_LIBM],
+[AC_REQUIRE([AC_CANONICAL_HOST])dnl
+LIBM=
+case $host in
+*-*-beos* | *-*-cygwin* | *-*-pw32* | *-*-darwin*)
+ # These system don't have libm, or don't need it
+ ;;
+*-ncr-sysv4.3*)
+ AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM="-lmw")
+ AC_CHECK_LIB(m, cos, LIBM="$LIBM -lm")
+ ;;
+*)
+ AC_CHECK_LIB(m, cos, LIBM="-lm")
+ ;;
+esac
+])# AC_CHECK_LIBM
+
+
+# AC_LIBLTDL_CONVENIENCE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl convenience library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-convenience to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
+# it is assumed to be `libltdl'. LIBLTDL will be prefixed with
+# '${top_builddir}/' and LTDLINCL will be prefixed with '${top_srcdir}/'
+# (note the single quotes!). If your package is not flat and you're not
+# using automake, define top_builddir and top_srcdir appropriately in
+# the Makefiles.
+AC_DEFUN([AC_LIBLTDL_CONVENIENCE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ case $enable_ltdl_convenience in
+ no) AC_MSG_ERROR([this package needs a convenience libltdl]) ;;
+ "") enable_ltdl_convenience=yes
+ ac_configure_args="$ac_configure_args --enable-ltdl-convenience" ;;
+ esac
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdlc.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_CONVENIENCE
+
+
+# AC_LIBLTDL_INSTALLABLE([DIRECTORY])
+# -----------------------------------
+# sets LIBLTDL to the link flags for the libltdl installable library and
+# LTDLINCL to the include flags for the libltdl header and adds
+# --enable-ltdl-install to the configure arguments. Note that
+# AC_CONFIG_SUBDIRS is not called here. If DIRECTORY is not provided,
+# and an installed libltdl is not found, it is assumed to be `libltdl'.
+# LIBLTDL will be prefixed with '${top_builddir}/'# and LTDLINCL with
+# '${top_srcdir}/' (note the single quotes!). If your package is not
+# flat and you're not using automake, define top_builddir and top_srcdir
+# appropriately in the Makefiles.
+# In the future, this macro may have to be called after AC_PROG_LIBTOOL.
+AC_DEFUN([AC_LIBLTDL_INSTALLABLE],
+[AC_BEFORE([$0],[AC_LIBTOOL_SETUP])dnl
+ AC_CHECK_LIB(ltdl, lt_dlinit,
+ [test x"$enable_ltdl_install" != xyes && enable_ltdl_install=no],
+ [if test x"$enable_ltdl_install" = xno; then
+ AC_MSG_WARN([libltdl not installed, but installation disabled])
+ else
+ enable_ltdl_install=yes
+ fi
+ ])
+ if test x"$enable_ltdl_install" = x"yes"; then
+ ac_configure_args="$ac_configure_args --enable-ltdl-install"
+ LIBLTDL='${top_builddir}/'ifelse($#,1,[$1],['libltdl'])/libltdl.la
+ LTDLINCL='-I${top_srcdir}/'ifelse($#,1,[$1],['libltdl'])
+ else
+ ac_configure_args="$ac_configure_args --enable-ltdl-install=no"
+ LIBLTDL="-lltdl"
+ LTDLINCL=
+ fi
+ # For backwards non-gettext consistent compatibility...
+ INCLTDL="$LTDLINCL"
+])# AC_LIBLTDL_INSTALLABLE
+
+
+# AC_LIBTOOL_CXX
+# --------------
+# enable support for C++ libraries
+AC_DEFUN([AC_LIBTOOL_CXX],
+[AC_REQUIRE([_LT_AC_LANG_CXX])
+])# AC_LIBTOOL_CXX
+
+
+# _LT_AC_LANG_CXX
+# ---------------
+AC_DEFUN([_LT_AC_LANG_CXX],
+[AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}CXX])
+])# _LT_AC_LANG_CXX
+
+# _LT_AC_PROG_CXXCPP
+# ------------------
+AC_DEFUN([_LT_AC_PROG_CXXCPP],
+[
+AC_REQUIRE([AC_PROG_CXX])
+if test -n "$CXX" && ( test "X$CXX" != "Xno" &&
+ ( (test "X$CXX" = "Xg++" && `g++ -v >/dev/null 2>&1` ) ||
+ (test "X$CXX" != "Xg++"))) ; then
+ AC_PROG_CXXCPP
+fi
+])# _LT_AC_PROG_CXXCPP
+
+# AC_LIBTOOL_F77
+# --------------
+# enable support for Fortran 77 libraries
+AC_DEFUN([AC_LIBTOOL_F77],
+[AC_REQUIRE([_LT_AC_LANG_F77])
+])# AC_LIBTOOL_F77
+
+
+# _LT_AC_LANG_F77
+# ---------------
+AC_DEFUN([_LT_AC_LANG_F77],
+[AC_REQUIRE([AC_PROG_F77])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}F77])
+])# _LT_AC_LANG_F77
+
+
+# AC_LIBTOOL_GCJ
+# --------------
+# enable support for GCJ libraries
+AC_DEFUN([AC_LIBTOOL_GCJ],
+[AC_REQUIRE([_LT_AC_LANG_GCJ])
+])# AC_LIBTOOL_GCJ
+
+
+# _LT_AC_LANG_GCJ
+# ---------------
+AC_DEFUN([_LT_AC_LANG_GCJ],
+[AC_PROVIDE_IFELSE([AC_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],[],
+ [AC_PROVIDE_IFELSE([LT_AC_PROG_GCJ],[],
+ [ifdef([AC_PROG_GCJ],[AC_REQUIRE([AC_PROG_GCJ])],
+ [ifdef([A][M_PROG_GCJ],[AC_REQUIRE([A][M_PROG_GCJ])],
+ [AC_REQUIRE([A][C_PROG_GCJ_OR_A][M_PROG_GCJ])])])])])])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}GCJ])
+])# _LT_AC_LANG_GCJ
+
+
+# AC_LIBTOOL_RC
+# -------------
+# enable support for Windows resource files
+AC_DEFUN([AC_LIBTOOL_RC],
+[AC_REQUIRE([LT_AC_PROG_RC])
+_LT_AC_SHELL_INIT([tagnames=${tagnames+${tagnames},}RC])
+])# AC_LIBTOOL_RC
+
+
+# AC_LIBTOOL_LANG_C_CONFIG
+# ------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG], [_LT_AC_LANG_C_CONFIG])
+AC_DEFUN([_LT_AC_LANG_C_CONFIG],
+[lt_save_CC="$CC"
+AC_LANG_PUSH(C)
+
+# Source file extension for C test sources.
+ac_ext=c
+
+# Object file extension for compiled C test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(){return(0);}'
+
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+AC_LIBTOOL_SYS_LIB_STRIP
+AC_LIBTOOL_DLOPEN_SELF
+
+# Report which library types will actually be built
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_C_CONFIG
+
+
+# AC_LIBTOOL_LANG_CXX_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG], [_LT_AC_LANG_CXX_CONFIG(CXX)])
+AC_DEFUN([_LT_AC_LANG_CXX_CONFIG],
+[AC_LANG_PUSH(C++)
+AC_REQUIRE([AC_PROG_CXX])
+AC_REQUIRE([_LT_AC_PROG_CXXCPP])
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Dependencies to place before and after the object being linked:
+_LT_AC_TAGVAR(predep_objects, $1)=
+_LT_AC_TAGVAR(postdep_objects, $1)=
+_LT_AC_TAGVAR(predeps, $1)=
+_LT_AC_TAGVAR(postdeps, $1)=
+_LT_AC_TAGVAR(compiler_lib_search_path, $1)=
+
+# Source file extension for C++ test sources.
+ac_ext=cpp
+
+# Object file extension for compiled C++ test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="int some_variable = 0;"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC=$CC
+lt_save_LD=$LD
+lt_save_GCC=$GCC
+GCC=$GXX
+lt_save_with_gnu_ld=$with_gnu_ld
+lt_save_path_LD=$lt_cv_path_LD
+if test -n "${lt_cv_prog_gnu_ldcxx+set}"; then
+ lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx
+else
+ $as_unset lt_cv_prog_gnu_ld
+fi
+if test -n "${lt_cv_path_LDCXX+set}"; then
+ lt_cv_path_LD=$lt_cv_path_LDCXX
+else
+ $as_unset lt_cv_path_LD
+fi
+test -z "${LDCXX+set}" || LD=$LDCXX
+CC=${CXX-"c++"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# We don't want -fno-exception wen compiling C++ code, so set the
+# no_builtin_flag separately
+if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+else
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+fi
+
+if test "$GXX" = yes; then
+ # Set up default GNU C++ configuration
+
+ AC_PROG_LD
+
+ # Check if GNU C++ uses GNU ld as the underlying linker, since the
+ # archiving commands below assume that GNU ld is being used.
+ if test "$with_gnu_ld" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to
+ # investigate it a little bit more. (MM)
+ wlarc='${wl}'
+
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if eval "`$CC -print-prog-name=ld` --help 2>&1" | \
+ grep 'no-whole-archive' > /dev/null; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ with_gnu_ld=no
+ wlarc=
+
+ # A generic and very simple default shared library creation
+ # command for GNU C++ for the case where it uses the native
+ # linker, instead of GNU ld. If possible, this setting should
+ # overridden to take advantage of the native linker features on
+ # the platform it is being used on.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ fi
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+else
+ GXX=no
+ with_gnu_ld=no
+ wlarc=
+fi
+
+# PORTME: fill in a description of your system's C++ link characteristics
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+_LT_AC_TAGVAR(ld_shlibs, $1)=yes
+case $host_os in
+ aix3*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ case $ld_flag in
+ *-brtl*)
+ aix_use_runtimelinking=yes
+ break
+ ;;
+ esac
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GXX" = yes; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ chorus*)
+ case $cc_basename in
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GXX" = yes ; then
+ lt_int_apple_cc_single_mod=no
+ output_verbose_link_cmd='echo'
+ if $CC -dumpspecs 2>&1 | $EGREP 'single_module' >/dev/null ; then
+ lt_int_apple_cc_single_mod=yes
+ fi
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ fi
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ if test "X$lt_int_apple_cc_single_mod" = Xyes ; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib -single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -r -keep_private_externs -nostdlib -o ${lib}-master.o $libobjs~$CC -dynamiclib $allow_undefined_flag -o $lib ${lib}-master.o $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ fi
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj ${wl}-single_module $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ freebsd[[12]]*)
+ # C++ shared libraries reported to be fairly broken before switch to ELF
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ freebsd-elf*)
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ ;;
+ freebsd* | dragonfly*)
+ # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF
+ # conventions
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ ;;
+ gnu*)
+ ;;
+ hpux9*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "[[-]]L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -nostdlib -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ hpux10*|hpux11*)
+ if test $with_gnu_ld = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*) ;;
+ *)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+ esac
+ fi
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,
+ # but as the default
+ # location of the library.
+ ;;
+ esac
+
+ case $cc_basename in
+ CC*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ aCC*)
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | grep "\-L"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test $with_gnu_ld = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ ;;
+ esac
+ fi
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ interix[[3-9]]*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+ irix5* | irix6*)
+ case $cc_basename in
+ CC*)
+ # SGI C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ # Archives containing C++ object files must be created using
+ # "CC -ar", where "CC" is the IRIX C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'
+ ;;
+ *)
+ if test "$GXX" = yes; then
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` -o $lib'
+ fi
+ fi
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+ esac
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib ${wl}-retain-symbols-file,$export_symbols; mv \$templib $lib'
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | grep "ld"`; rm -f libconftest$shared_ext; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+ ;;
+ icpc*)
+ # Intel C++
+ with_gnu_ld=yes
+ # version 8.0 and above of icpc choke on multiply defined symbols
+ # if we add $predep_objects and $postdep_objects, however 7.1 and
+ # earlier do not add the objects themselves.
+ case `$CC -V 2>&1` in
+ *"Version 7."*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ *) # Version 8.0 or newer
+ tmp_idyn=
+ case $host_cpu in
+ ia64*) tmp_idyn=' -i_dynamic';;
+ esac
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'"$tmp_idyn"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'
+ ;;
+ pgCC*)
+ # Portland Group C++ compiler
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ ;;
+ cxx*)
+ # Compaq C++
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib ${wl}-retain-symbols-file $wl$export_symbols'
+
+ runpath_var=LD_RUN_PATH
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld .*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+
+ # Not sure whether something based on
+ # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1
+ # would be better.
+ output_verbose_link_cmd='echo'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ m88k*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ netbsd* | netbsdelf*-gnu)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ fi
+ # Workaround some broken pre-1.5 toolchains
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep conftest.$objext | $SED -e "s:-lgcc -lc -lgcc::"'
+ ;;
+ openbsd2*)
+ # C++ shared libraries are fairly broken
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ fi
+ output_verbose_link_cmd='echo'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ osf3*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # "CC -Bstatic", where "CC" is the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'
+
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n "$verstring" && echo ${wl}-set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ # Kuck and Associates, Inc. (KAI) C++ Compiler
+
+ # KCC will only create a shared library if the output file
+ # ends with ".so" (or ".sl" for HP-UX), so rename the library
+ # to its proper name (with version) after linking.
+ _LT_AC_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\''s/\([[^()0-9A-Za-z{}]]\)/\\\\\1/g'\''`; templib=`echo $lib | $SED -e "s/\${tempext}\..*/.so/"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \$templib; mv \$templib $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Archives containing C++ object files must be created using
+ # the KAI C++ compiler.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ cxx*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done~
+ echo "-hidden">> $lib.exp~
+ $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname -Wl,-input -Wl,$lib.exp `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~
+ $rm $lib.exp'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ #
+ # There doesn't appear to be a way to prevent this compiler from
+ # explicitly linking system object files so we need to strip them
+ # from the output so that they don't get included in the library
+ # dependencies.
+ output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "ld" | grep -v "ld:"`; templist=`echo $templist | $SED "s/\(^.*ld.*\)\( .*ld.*$\)/\1/"`; list=""; for z in $templist; do case $z in conftest.$objext) list="$list $z";; *.$objext);; *) list="$list $z";;esac; done; echo $list'
+ ;;
+ *)
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep "\-L"'
+
+ else
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+ psos*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ lcc*)
+ # Lucid
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(archive_cmds_need_lc,$1)=yes
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -zdefs'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+ ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ output_verbose_link_cmd='echo'
+
+ # Archives containing C++ object files must be created using
+ # "CC -xar", where "CC" is the Sun C++ compiler. This is
+ # necessary to make sure instantiated templates are included
+ # in the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+
+ # The C++ compiler must be used to create the archive.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'
+ ;;
+ *)
+ # GNU C++ compiler with Solaris linker
+ if test "$GXX" = yes && test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'
+ if $CC --version | grep -v '^2\.7' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -shared $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ else
+ # g++ 2.7 appears to require `-G' NOT `-shared' on this
+ # platform.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$rm $lib.exp'
+
+ # Commands to make compiler produce verbose output that lists
+ # what "hidden" libraries, object files and flags are used when
+ # linking a shared library.
+ output_verbose_link_cmd="$CC -G $CFLAGS -v conftest.$objext 2>&1 | grep \"\-L\""
+ fi
+
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ ;;
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ # For security reasons, it is highly recommended that you always
+ # use absolute paths for naming shared libraries, and exclude the
+ # DT_RUNPATH tag from executables and libraries. But doing so
+ # requires that you compile everything twice, which is a pain.
+ # So that behaviour is only enabled if SCOABSPATH is set to a
+ # non-empty value in the environment. Most likely only useful for
+ # creating official distributions of packages.
+ # This is a hack until libtool officially supports absolute path
+ # names for shared libraries.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ ;;
+ vxworks*)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ *)
+ # FIXME: insert proper C++ library support
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+esac
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+_LT_AC_TAGVAR(GCC, $1)="$GXX"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+AC_LIBTOOL_POSTDEP_PREDEP($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC=$lt_save_CC
+LDCXX=$LD
+LD=$lt_save_LD
+GCC=$lt_save_GCC
+with_gnu_ldcxx=$with_gnu_ld
+with_gnu_ld=$lt_save_with_gnu_ld
+lt_cv_path_LDCXX=$lt_cv_path_LD
+lt_cv_path_LD=$lt_save_path_LD
+lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld
+lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld
+])# AC_LIBTOOL_LANG_CXX_CONFIG
+
+# AC_LIBTOOL_POSTDEP_PREDEP([TAGNAME])
+# ------------------------------------
+# Figure out "hidden" library dependencies from verbose
+# compiler output when linking a shared library.
+# Parse the compiler output and extract the necessary
+# objects, libraries and library flags.
+AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP],[
+dnl we can't use the lt_simple_compile_test_code here,
+dnl because it contains code intended for an executable,
+dnl not a library. It's possible we should let each
+dnl tag define a new lt_????_link_test_code variable,
+dnl but it's only used here...
+ifelse([$1],[],[cat > conftest.$ac_ext <<EOF
+int a;
+void foo (void) { a = 0; }
+EOF
+],[$1],[CXX],[cat > conftest.$ac_ext <<EOF
+class Foo
+{
+public:
+ Foo (void) { a = 0; }
+private:
+ int a;
+};
+EOF
+],[$1],[F77],[cat > conftest.$ac_ext <<EOF
+ subroutine foo
+ implicit none
+ integer*4 a
+ a=0
+ return
+ end
+EOF
+],[$1],[GCJ],[cat > conftest.$ac_ext <<EOF
+public class foo {
+ private int a;
+ public void bar (void) {
+ a = 0;
+ }
+};
+EOF
+])
+dnl Parse the compiler output and extract the necessary
+dnl objects, libraries and library flags.
+if AC_TRY_EVAL(ac_compile); then
+ # Parse the compiler output and extract the necessary
+ # objects, libraries and library flags.
+
+ # Sentinel used to keep track of whether or not we are before
+ # the conftest object file.
+ pre_test_object_deps_done=no
+
+ # The `*' in the case matches for architectures that use `case' in
+ # $output_verbose_cmd can trigger glob expansion during the loop
+ # eval without this substitution.
+ output_verbose_link_cmd=`$echo "X$output_verbose_link_cmd" | $Xsed -e "$no_glob_subst"`
+
+ for p in `eval $output_verbose_link_cmd`; do
+ case $p in
+
+ -L* | -R* | -l*)
+ # Some compilers place space between "-{L,R}" and the path.
+ # Remove the space.
+ if test $p = "-L" \
+ || test $p = "-R"; then
+ prev=$p
+ continue
+ else
+ prev=
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ case $p in
+ -L* | -R*)
+ # Internal compiler library paths should come after those
+ # provided the user. The postdeps already come after the
+ # user supplied libs so there is no need to process them.
+ if test -z "$_LT_AC_TAGVAR(compiler_lib_search_path, $1)"; then
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1)="${_LT_AC_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}"
+ fi
+ ;;
+ # The "-l" case would never come before the object being
+ # linked, so don't bother handling this case.
+ esac
+ else
+ if test -z "$_LT_AC_TAGVAR(postdeps, $1)"; then
+ _LT_AC_TAGVAR(postdeps, $1)="${prev}${p}"
+ else
+ _LT_AC_TAGVAR(postdeps, $1)="${_LT_AC_TAGVAR(postdeps, $1)} ${prev}${p}"
+ fi
+ fi
+ ;;
+
+ *.$objext)
+ # This assumes that the test object file only shows up
+ # once in the compiler output.
+ if test "$p" = "conftest.$objext"; then
+ pre_test_object_deps_done=yes
+ continue
+ fi
+
+ if test "$pre_test_object_deps_done" = no; then
+ if test -z "$_LT_AC_TAGVAR(predep_objects, $1)"; then
+ _LT_AC_TAGVAR(predep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(predep_objects, $1)="$_LT_AC_TAGVAR(predep_objects, $1) $p"
+ fi
+ else
+ if test -z "$_LT_AC_TAGVAR(postdep_objects, $1)"; then
+ _LT_AC_TAGVAR(postdep_objects, $1)="$p"
+ else
+ _LT_AC_TAGVAR(postdep_objects, $1)="$_LT_AC_TAGVAR(postdep_objects, $1) $p"
+ fi
+ fi
+ ;;
+
+ *) ;; # Ignore the rest.
+
+ esac
+ done
+
+ # Clean up.
+ rm -f a.out a.exe
+else
+ echo "libtool.m4: error: problem compiling $1 test program"
+fi
+
+$rm -f confest.$objext
+
+# PORTME: override above test on systems where it is broken
+ifelse([$1],[CXX],
+[case $host_os in
+interix[[3-9]]*)
+ # Interix 3.5 installs completely hosed .la files for C++, so rather than
+ # hack all around it, let's just trust "g++" to DTRT.
+ _LT_AC_TAGVAR(predep_objects,$1)=
+ _LT_AC_TAGVAR(postdep_objects,$1)=
+ _LT_AC_TAGVAR(postdeps,$1)=
+ ;;
+
+linux*)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ #
+ # The more standards-conforming stlport4 library is
+ # incompatible with the Cstd library. Avoid specifying
+ # it if it's in CXXFLAGS. Ignore libCrun as
+ # -library=stlport4 depends on it.
+ case " $CXX $CXXFLAGS " in
+ *" -library=stlport4 "*)
+ solaris_use_stlport4=yes
+ ;;
+ esac
+ if test "$solaris_use_stlport4" != yes; then
+ _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+
+solaris*)
+ case $cc_basename in
+ CC*)
+ # The more standards-conforming stlport4 library is
+ # incompatible with the Cstd library. Avoid specifying
+ # it if it's in CXXFLAGS. Ignore libCrun as
+ # -library=stlport4 depends on it.
+ case " $CXX $CXXFLAGS " in
+ *" -library=stlport4 "*)
+ solaris_use_stlport4=yes
+ ;;
+ esac
+
+ # Adding this requires a known-good setup of shared libraries for
+ # Sun compiler versions before 5.6, else PIC objects from an old
+ # archive will be linked into the output, leading to subtle bugs.
+ if test "$solaris_use_stlport4" != yes; then
+ _LT_AC_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'
+ fi
+ ;;
+ esac
+ ;;
+esac
+])
+
+case " $_LT_AC_TAGVAR(postdeps, $1) " in
+*" -lc "*) _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no ;;
+esac
+])# AC_LIBTOOL_POSTDEP_PREDEP
+
+# AC_LIBTOOL_LANG_F77_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG], [_LT_AC_LANG_F77_CONFIG(F77)])
+AC_DEFUN([_LT_AC_LANG_F77_CONFIG],
+[AC_REQUIRE([AC_PROG_F77])
+AC_LANG_PUSH(Fortran 77)
+
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+_LT_AC_TAGVAR(allow_undefined_flag, $1)=
+_LT_AC_TAGVAR(always_export_symbols, $1)=no
+_LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_direct, $1)=no
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+_LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+_LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+_LT_AC_TAGVAR(hardcode_automatic, $1)=no
+_LT_AC_TAGVAR(module_cmds, $1)=
+_LT_AC_TAGVAR(module_expsym_cmds, $1)=
+_LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+_LT_AC_TAGVAR(no_undefined_flag, $1)=
+_LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+
+# Source file extension for f77 test sources.
+ac_ext=f
+
+# Object file extension for compiled f77 test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="\
+ subroutine t
+ return
+ end
+"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="\
+ program t
+ end
+"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${F77-"f77"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+AC_MSG_CHECKING([if libtool supports shared libraries])
+AC_MSG_RESULT([$can_build_shared])
+
+AC_MSG_CHECKING([whether to build shared libraries])
+test "$can_build_shared" = "no" && enable_shared=no
+
+# On AIX, shared libraries and static libraries use the same namespace, and
+# are all built from PIC.
+case $host_os in
+aix3*)
+ test "$enable_shared" = yes && enable_static=no
+ if test -n "$RANLIB"; then
+ archive_cmds="$archive_cmds~\$RANLIB \$lib"
+ postinstall_cmds='$RANLIB $lib'
+ fi
+ ;;
+aix4* | aix5*)
+ if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+ test "$enable_shared" = yes && enable_static=no
+ fi
+ ;;
+esac
+AC_MSG_RESULT([$enable_shared])
+
+AC_MSG_CHECKING([whether to build static libraries])
+# Make sure either enable_shared or enable_static is yes.
+test "$enable_shared" = yes || enable_static=yes
+AC_MSG_RESULT([$enable_static])
+
+_LT_AC_TAGVAR(GCC, $1)="$G77"
+_LT_AC_TAGVAR(LD, $1)="$LD"
+
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_POP
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_F77_CONFIG
+
+
+# AC_LIBTOOL_LANG_GCJ_CONFIG
+# --------------------------
+# Ensure that the configuration vars for the C compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG], [_LT_AC_LANG_GCJ_CONFIG(GCJ)])
+AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for Java test sources.
+ac_ext=java
+
+# Object file extension for compiled Java test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code="class foo {}"
+
+# Code to be used in simple link tests
+lt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${GCJ-"gcj"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+
+# GCJ did not exist at the time GCC didn't implicitly link libc in.
+_LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+
+_LT_AC_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds
+
+## CAVEAT EMPTOR:
+## There is no encapsulation within the following macros, do not change
+## the running order or otherwise move them around unless you know exactly
+## what you are doing...
+AC_LIBTOOL_PROG_COMPILER_NO_RTTI($1)
+AC_LIBTOOL_PROG_COMPILER_PIC($1)
+AC_LIBTOOL_PROG_CC_C_O($1)
+AC_LIBTOOL_SYS_HARD_LINK_LOCKS($1)
+AC_LIBTOOL_PROG_LD_SHLIBS($1)
+AC_LIBTOOL_SYS_DYNAMIC_LINKER($1)
+AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH($1)
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_GCJ_CONFIG
+
+
+# AC_LIBTOOL_LANG_RC_CONFIG
+# -------------------------
+# Ensure that the configuration vars for the Windows resource compiler are
+# suitably defined. Those variables are subsequently used by
+# AC_LIBTOOL_CONFIG to write the compiler configuration to `libtool'.
+AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG], [_LT_AC_LANG_RC_CONFIG(RC)])
+AC_DEFUN([_LT_AC_LANG_RC_CONFIG],
+[AC_LANG_SAVE
+
+# Source file extension for RC test sources.
+ac_ext=rc
+
+# Object file extension for compiled RC test sources.
+objext=o
+_LT_AC_TAGVAR(objext, $1)=$objext
+
+# Code to be used in simple compile tests
+lt_simple_compile_test_code='sample MENU { MENUITEM "&Soup", 100, CHECKED }'
+
+# Code to be used in simple link tests
+lt_simple_link_test_code="$lt_simple_compile_test_code"
+
+# ltmain only uses $CC for tagged configurations so make sure $CC is set.
+_LT_AC_SYS_COMPILER
+
+# save warnings/boilerplate of simple test code
+_LT_COMPILER_BOILERPLATE
+_LT_LINKER_BOILERPLATE
+
+# Allow CC to be a program name with arguments.
+lt_save_CC="$CC"
+CC=${RC-"windres"}
+compiler=$CC
+_LT_AC_TAGVAR(compiler, $1)=$CC
+_LT_CC_BASENAME([$compiler])
+_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes
+
+AC_LIBTOOL_CONFIG($1)
+
+AC_LANG_RESTORE
+CC="$lt_save_CC"
+])# AC_LIBTOOL_LANG_RC_CONFIG
+
+
+# AC_LIBTOOL_CONFIG([TAGNAME])
+# ----------------------------
+# If TAGNAME is not passed, then create an initial libtool script
+# with a default configuration from the untagged config vars. Otherwise
+# add code to config.status for appending the configuration named by
+# TAGNAME from the matching tagged config vars.
+AC_DEFUN([AC_LIBTOOL_CONFIG],
+[# The else clause should only fire when bootstrapping the
+# libtool distribution, otherwise you forgot to ship ltmain.sh
+# with your package, and you will get complaints that there are
+# no rules to generate ltmain.sh.
+if test -f "$ltmain"; then
+ # See if we are running on zsh, and set the options which allow our commands through
+ # without removal of \ escapes.
+ if test -n "${ZSH_VERSION+set}" ; then
+ setopt NO_GLOB_SUBST
+ fi
+ # Now quote all the things that may contain metacharacters while being
+ # careful not to overquote the AC_SUBSTed values. We take copies of the
+ # variables and quote the copies for generation of the libtool script.
+ for var in echo old_CC old_CFLAGS AR AR_FLAGS EGREP RANLIB LN_S LTCC LTCFLAGS NM \
+ SED SHELL STRIP \
+ libname_spec library_names_spec soname_spec extract_expsyms_cmds \
+ old_striplib striplib file_magic_cmd finish_cmds finish_eval \
+ deplibs_check_method reload_flag reload_cmds need_locks \
+ lt_cv_sys_global_symbol_pipe lt_cv_sys_global_symbol_to_cdecl \
+ lt_cv_sys_global_symbol_to_c_name_address \
+ sys_lib_search_path_spec sys_lib_dlsearch_path_spec \
+ old_postinstall_cmds old_postuninstall_cmds \
+ _LT_AC_TAGVAR(compiler, $1) \
+ _LT_AC_TAGVAR(CC, $1) \
+ _LT_AC_TAGVAR(LD, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1) \
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) \
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1) \
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1) \
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1) \
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1) \
+ _LT_AC_TAGVAR(old_archive_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) \
+ _LT_AC_TAGVAR(predep_objects, $1) \
+ _LT_AC_TAGVAR(postdep_objects, $1) \
+ _LT_AC_TAGVAR(predeps, $1) \
+ _LT_AC_TAGVAR(postdeps, $1) \
+ _LT_AC_TAGVAR(compiler_lib_search_path, $1) \
+ _LT_AC_TAGVAR(archive_cmds, $1) \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(postinstall_cmds, $1) \
+ _LT_AC_TAGVAR(postuninstall_cmds, $1) \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) \
+ _LT_AC_TAGVAR(allow_undefined_flag, $1) \
+ _LT_AC_TAGVAR(no_undefined_flag, $1) \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1) \
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1) \
+ _LT_AC_TAGVAR(hardcode_automatic, $1) \
+ _LT_AC_TAGVAR(module_cmds, $1) \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) \
+ _LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1) \
+ _LT_AC_TAGVAR(fix_srcfile_path, $1) \
+ _LT_AC_TAGVAR(exclude_expsyms, $1) \
+ _LT_AC_TAGVAR(include_expsyms, $1); do
+
+ case $var in
+ _LT_AC_TAGVAR(old_archive_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_new_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_cmds, $1) | \
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(module_cmds, $1) | \
+ _LT_AC_TAGVAR(module_expsym_cmds, $1) | \
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1) | \
+ _LT_AC_TAGVAR(export_symbols_cmds, $1) | \
+ extract_expsyms_cmds | reload_cmds | finish_cmds | \
+ postinstall_cmds | postuninstall_cmds | \
+ old_postinstall_cmds | old_postuninstall_cmds | \
+ sys_lib_search_path_spec | sys_lib_dlsearch_path_spec)
+ # Double-quote double-evaled strings.
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\""
+ ;;
+ *)
+ eval "lt_$var=\\\"\`\$echo \"X\$$var\" | \$Xsed -e \"\$sed_quote_subst\"\`\\\""
+ ;;
+ esac
+ done
+
+ case $lt_echo in
+ *'\[$]0 --fallback-echo"')
+ lt_echo=`$echo "X$lt_echo" | $Xsed -e 's/\\\\\\\[$]0 --fallback-echo"[$]/[$]0 --fallback-echo"/'`
+ ;;
+ esac
+
+ifelse([$1], [],
+ [cfgfile="${ofile}T"
+ trap "$rm \"$cfgfile\"; exit 1" 1 2 15
+ $rm -f "$cfgfile"
+ AC_MSG_NOTICE([creating $ofile])],
+ [cfgfile="$ofile"])
+
+ cat <<__EOF__ >> "$cfgfile"
+ifelse([$1], [],
+[#! $SHELL
+
+# `$echo "$cfgfile" | sed 's%^.*/%%'` - Provide generalized library-building support services.
+# Generated automatically by $PROGRAM (GNU $PACKAGE $VERSION$TIMESTAMP)
+# NOTE: Changes made to this file will be lost: look at ltmain.sh.
+#
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+# Free Software Foundation, Inc.
+#
+# This file is part of GNU Libtool:
+# Originally by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996
+#
+# 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# A sed program that does not truncate output.
+SED=$lt_SED
+
+# Sed that helps us avoid accidentally triggering echo(1) options like -n.
+Xsed="$SED -e 1s/^X//"
+
+# The HP-UX ksh and POSIX shell print the target directory to stdout
+# if CDPATH is set.
+(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
+
+# The names of the tagged configurations supported by this script.
+available_tags=
+
+# ### BEGIN LIBTOOL CONFIG],
+[# ### BEGIN LIBTOOL TAG CONFIG: $tagname])
+
+# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+
+# Shell to use when invoking shell scripts.
+SHELL=$lt_SHELL
+
+# Whether or not to build shared libraries.
+build_libtool_libs=$enable_shared
+
+# Whether or not to build static libraries.
+build_old_libs=$enable_static
+
+# Whether or not to add -lc for building shared libraries.
+build_libtool_need_lc=$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)
+
+# Whether or not to disallow shared libs when runtime libs are static
+allow_libtool_libs_with_static_runtimes=$_LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)
+
+# Whether or not to optimize for fast installation.
+fast_install=$enable_fast_install
+
+# The host system.
+host_alias=$host_alias
+host=$host
+host_os=$host_os
+
+# The build system.
+build_alias=$build_alias
+build=$build
+build_os=$build_os
+
+# An echo program that does not interpret backslashes.
+echo=$lt_echo
+
+# The archiver.
+AR=$lt_AR
+AR_FLAGS=$lt_AR_FLAGS
+
+# A C compiler.
+LTCC=$lt_LTCC
+
+# LTCC compiler flags.
+LTCFLAGS=$lt_LTCFLAGS
+
+# A language-specific compiler.
+CC=$lt_[]_LT_AC_TAGVAR(compiler, $1)
+
+# Is the compiler the GNU C compiler?
+with_gcc=$_LT_AC_TAGVAR(GCC, $1)
+
+# An ERE matcher.
+EGREP=$lt_EGREP
+
+# The linker used to build libraries.
+LD=$lt_[]_LT_AC_TAGVAR(LD, $1)
+
+# Whether we need hard or soft links.
+LN_S=$lt_LN_S
+
+# A BSD-compatible nm program.
+NM=$lt_NM
+
+# A symbol stripping program
+STRIP=$lt_STRIP
+
+# Used to examine libraries when file_magic_cmd begins "file"
+MAGIC_CMD=$MAGIC_CMD
+
+# Used on cygwin: DLL creation program.
+DLLTOOL="$DLLTOOL"
+
+# Used on cygwin: object dumper.
+OBJDUMP="$OBJDUMP"
+
+# Used on cygwin: assembler.
+AS="$AS"
+
+# The name of the directory that contains temporary libtool files.
+objdir=$objdir
+
+# How to create reloadable object files.
+reload_flag=$lt_reload_flag
+reload_cmds=$lt_reload_cmds
+
+# How to pass a linker flag through the compiler.
+wl=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+
+# Object file suffix (normally "o").
+objext="$ac_objext"
+
+# Old archive suffix (normally "a").
+libext="$libext"
+
+# Shared library suffix (normally ".so").
+shrext_cmds='$shrext_cmds'
+
+# Executable file suffix (normally "").
+exeext="$exeext"
+
+# Additional compiler flags for building library objects.
+pic_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+pic_mode=$pic_mode
+
+# What is the maximum length of a command?
+max_cmd_len=$lt_cv_sys_max_cmd_len
+
+# Does compiler simultaneously support -c and -o options?
+compiler_c_o=$lt_[]_LT_AC_TAGVAR(lt_cv_prog_compiler_c_o, $1)
+
+# Must we lock files when doing compilation?
+need_locks=$lt_need_locks
+
+# Do we need the lib prefix for modules?
+need_lib_prefix=$need_lib_prefix
+
+# Do we need a version for libraries?
+need_version=$need_version
+
+# Whether dlopen is supported.
+dlopen_support=$enable_dlopen
+
+# Whether dlopen of programs is supported.
+dlopen_self=$enable_dlopen_self
+
+# Whether dlopen of statically linked programs is supported.
+dlopen_self_static=$enable_dlopen_self_static
+
+# Compiler flag to prevent dynamic linking.
+link_static_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_static, $1)
+
+# Compiler flag to turn off builtin functions.
+no_builtin_flag=$lt_[]_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)
+
+# Compiler flag to allow reflexive dlopens.
+export_dynamic_flag_spec=$lt_[]_LT_AC_TAGVAR(export_dynamic_flag_spec, $1)
+
+# Compiler flag to generate shared objects directly from archives.
+whole_archive_flag_spec=$lt_[]_LT_AC_TAGVAR(whole_archive_flag_spec, $1)
+
+# Compiler flag to generate thread-safe objects.
+thread_safe_flag_spec=$lt_[]_LT_AC_TAGVAR(thread_safe_flag_spec, $1)
+
+# Library versioning type.
+version_type=$version_type
+
+# Format of library name prefix.
+libname_spec=$lt_libname_spec
+
+# List of archive names. First name is the real one, the rest are links.
+# The last name is the one that the linker finds with -lNAME.
+library_names_spec=$lt_library_names_spec
+
+# The coded name of the library, if different from the real name.
+soname_spec=$lt_soname_spec
+
+# Commands used to build and install an old-style archive.
+RANLIB=$lt_RANLIB
+old_archive_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_cmds, $1)
+old_postinstall_cmds=$lt_old_postinstall_cmds
+old_postuninstall_cmds=$lt_old_postuninstall_cmds
+
+# Create an old-style archive from a shared archive.
+old_archive_from_new_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_new_cmds, $1)
+
+# Create a temporary old-style archive to link instead of a shared archive.
+old_archive_from_expsyms_cmds=$lt_[]_LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)
+
+# Commands used to build and install a shared archive.
+archive_cmds=$lt_[]_LT_AC_TAGVAR(archive_cmds, $1)
+archive_expsym_cmds=$lt_[]_LT_AC_TAGVAR(archive_expsym_cmds, $1)
+postinstall_cmds=$lt_postinstall_cmds
+postuninstall_cmds=$lt_postuninstall_cmds
+
+# Commands used to build a loadable module (assumed same as above if empty)
+module_cmds=$lt_[]_LT_AC_TAGVAR(module_cmds, $1)
+module_expsym_cmds=$lt_[]_LT_AC_TAGVAR(module_expsym_cmds, $1)
+
+# Commands to strip libraries.
+old_striplib=$lt_old_striplib
+striplib=$lt_striplib
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predep_objects=$lt_[]_LT_AC_TAGVAR(predep_objects, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdep_objects=$lt_[]_LT_AC_TAGVAR(postdep_objects, $1)
+
+# Dependencies to place before the objects being linked to create a
+# shared library.
+predeps=$lt_[]_LT_AC_TAGVAR(predeps, $1)
+
+# Dependencies to place after the objects being linked to create a
+# shared library.
+postdeps=$lt_[]_LT_AC_TAGVAR(postdeps, $1)
+
+# The library search path used internally by the compiler when linking
+# a shared library.
+compiler_lib_search_path=$lt_[]_LT_AC_TAGVAR(compiler_lib_search_path, $1)
+
+# Method to check whether dependent libraries are shared objects.
+deplibs_check_method=$lt_deplibs_check_method
+
+# Command to use when deplibs_check_method == file_magic.
+file_magic_cmd=$lt_file_magic_cmd
+
+# Flag that allows shared libraries with undefined symbols to be built.
+allow_undefined_flag=$lt_[]_LT_AC_TAGVAR(allow_undefined_flag, $1)
+
+# Flag that forces no undefined symbols.
+no_undefined_flag=$lt_[]_LT_AC_TAGVAR(no_undefined_flag, $1)
+
+# Commands used to finish a libtool library installation in a directory.
+finish_cmds=$lt_finish_cmds
+
+# Same as above, but a single script fragment to be evaled but not shown.
+finish_eval=$lt_finish_eval
+
+# Take the output of nm and produce a listing of raw symbols and C names.
+global_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe
+
+# Transform the output of nm in a proper C declaration
+global_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl
+
+# Transform the output of nm in a C name address pair
+global_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address
+
+# This is the shared library runtime path variable.
+runpath_var=$runpath_var
+
+# This is the shared library path variable.
+shlibpath_var=$shlibpath_var
+
+# Is shlibpath searched before the hard-coded library search path?
+shlibpath_overrides_runpath=$shlibpath_overrides_runpath
+
+# How to hardcode a shared library path into an executable.
+hardcode_action=$_LT_AC_TAGVAR(hardcode_action, $1)
+
+# Whether we should hardcode library paths into libraries.
+hardcode_into_libs=$hardcode_into_libs
+
+# Flag to hardcode \$libdir into a binary during linking.
+# This must work even if \$libdir does not exist.
+hardcode_libdir_flag_spec=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)
+
+# If ld is used when linking, flag to hardcode \$libdir into
+# a binary during linking. This must work even if \$libdir does
+# not exist.
+hardcode_libdir_flag_spec_ld=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)
+
+# Whether we need a single -rpath flag with a separated argument.
+hardcode_libdir_separator=$lt_[]_LT_AC_TAGVAR(hardcode_libdir_separator, $1)
+
+# Set to yes if using DIR/libNAME${shared_ext} during linking hardcodes DIR into the
+# resulting binary.
+hardcode_direct=$_LT_AC_TAGVAR(hardcode_direct, $1)
+
+# Set to yes if using the -LDIR flag during linking hardcodes DIR into the
+# resulting binary.
+hardcode_minus_L=$_LT_AC_TAGVAR(hardcode_minus_L, $1)
+
+# Set to yes if using SHLIBPATH_VAR=DIR during linking hardcodes DIR into
+# the resulting binary.
+hardcode_shlibpath_var=$_LT_AC_TAGVAR(hardcode_shlibpath_var, $1)
+
+# Set to yes if building a shared library automatically hardcodes DIR into the library
+# and all subsequent libraries and executables linked against it.
+hardcode_automatic=$_LT_AC_TAGVAR(hardcode_automatic, $1)
+
+# Variables whose values should be saved in libtool wrapper scripts and
+# restored at relink time.
+variables_saved_for_relink="$variables_saved_for_relink"
+
+# Whether libtool must link a program against all its dependency libraries.
+link_all_deplibs=$_LT_AC_TAGVAR(link_all_deplibs, $1)
+
+# Compile-time system search path for libraries
+sys_lib_search_path_spec=$lt_sys_lib_search_path_spec
+
+# Run-time system search path for libraries
+sys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec
+
+# Fix the shell variable \$srcfile for the compiler.
+fix_srcfile_path=$lt_fix_srcfile_path
+
+# Set to yes if exported symbols are required.
+always_export_symbols=$_LT_AC_TAGVAR(always_export_symbols, $1)
+
+# The commands to list exported symbols.
+export_symbols_cmds=$lt_[]_LT_AC_TAGVAR(export_symbols_cmds, $1)
+
+# The commands to extract the exported symbol list from a shared archive.
+extract_expsyms_cmds=$lt_extract_expsyms_cmds
+
+# Symbols that should not be listed in the preloaded symbols.
+exclude_expsyms=$lt_[]_LT_AC_TAGVAR(exclude_expsyms, $1)
+
+# Symbols that must always be exported.
+include_expsyms=$lt_[]_LT_AC_TAGVAR(include_expsyms, $1)
+
+ifelse([$1],[],
+[# ### END LIBTOOL CONFIG],
+[# ### END LIBTOOL TAG CONFIG: $tagname])
+
+__EOF__
+
+ifelse([$1],[], [
+ case $host_os in
+ aix3*)
+ cat <<\EOF >> "$cfgfile"
+
+# AIX sometimes has problems with the GCC collect2 program. For some
+# reason, if we set the COLLECT_NAMES environment variable, the problems
+# vanish in a puff of smoke.
+if test "X${COLLECT_NAMES+set}" != Xset; then
+ COLLECT_NAMES=
+ export COLLECT_NAMES
+fi
+EOF
+ ;;
+ esac
+
+ # We use sed instead of cat because bash on DJGPP gets confused if
+ # if finds mixed CR/LF and LF-only lines. Since sed operates in
+ # text mode, it properly converts lines to CR/LF. This bash problem
+ # is reportedly fixed, but why not run on old versions too?
+ sed '$q' "$ltmain" >> "$cfgfile" || (rm -f "$cfgfile"; exit 1)
+
+ mv -f "$cfgfile" "$ofile" || \
+ (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile")
+ chmod +x "$ofile"
+])
+else
+ # If there is no Makefile yet, we rely on a make rule to execute
+ # `config.status --recheck' to rerun these tests and create the
+ # libtool script then.
+ ltmain_in=`echo $ltmain | sed -e 's/\.sh$/.in/'`
+ if test -f "$ltmain_in"; then
+ test -f Makefile && make "$ltmain"
+ fi
+fi
+])# AC_LIBTOOL_CONFIG
+
+
+# AC_LIBTOOL_PROG_COMPILER_NO_RTTI([TAGNAME])
+# -------------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI],
+[AC_REQUIRE([_LT_AC_SYS_COMPILER])dnl
+
+_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=
+
+if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'
+
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],
+ lt_cv_prog_compiler_rtti_exceptions,
+ [-fno-rtti -fno-exceptions], [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions"])
+fi
+])# AC_LIBTOOL_PROG_COMPILER_NO_RTTI
+
+
+# AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+# ---------------------------------
+AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE],
+[AC_REQUIRE([AC_CANONICAL_HOST])
+AC_REQUIRE([LT_AC_PROG_SED])
+AC_REQUIRE([AC_PROG_NM])
+AC_REQUIRE([AC_OBJEXT])
+# Check for command to grab the raw symbol name followed by C symbol from nm.
+AC_MSG_CHECKING([command to parse $NM output from $compiler object])
+AC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],
+[
+# These are sane defaults that work on at least a few old systems.
+# [They come from Ultrix. What could be older than Ultrix?!! ;)]
+
+# Character class describing NM global symbol codes.
+symcode='[[BCDEGRST]]'
+
+# Regexp to match symbols that can be accessed directly from C.
+sympat='\([[_A-Za-z]][[_A-Za-z0-9]]*\)'
+
+# Transform an extracted symbol line into a proper C declaration
+lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^. .* \(.*\)$/extern int \1;/p'"
+
+# Transform an extracted symbol line into symbol name and symbol address
+lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+
+# Define system-specific variables.
+case $host_os in
+aix*)
+ symcode='[[BCDT]]'
+ ;;
+cygwin* | mingw* | pw32*)
+ symcode='[[ABCDGISTW]]'
+ ;;
+hpux*) # Its linker distinguishes data from code symbols
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDEGRST]]'
+ fi
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ ;;
+linux* | k*bsd*-gnu)
+ if test "$host_cpu" = ia64; then
+ symcode='[[ABCDGIRSTW]]'
+ lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
+ lt_cv_sys_global_symbol_to_c_name_address="sed -n -e 's/^: \([[^ ]]*\) $/ {\\\"\1\\\", (lt_ptr) 0},/p' -e 's/^$symcode* \([[^ ]]*\) \([[^ ]]*\)$/ {\"\2\", (lt_ptr) \&\2},/p'"
+ fi
+ ;;
+irix* | nonstopux*)
+ symcode='[[BCDEGRST]]'
+ ;;
+osf*)
+ symcode='[[BCDEGQRST]]'
+ ;;
+solaris*)
+ symcode='[[BDRT]]'
+ ;;
+sco3.2v5*)
+ symcode='[[DT]]'
+ ;;
+sysv4.2uw2*)
+ symcode='[[DT]]'
+ ;;
+sysv5* | sco5v6* | unixware* | OpenUNIX*)
+ symcode='[[ABDT]]'
+ ;;
+sysv4)
+ symcode='[[DFNSTU]]'
+ ;;
+esac
+
+# Handle CRLF in mingw tool chain
+opt_cr=
+case $build_os in
+mingw*)
+ opt_cr=`echo 'x\{0,1\}' | tr x '\015'` # option cr in regexp
+ ;;
+esac
+
+# If we're using GNU nm, then use its standard symbol codes.
+case `$NM -V 2>&1` in
+*GNU* | *'with BFD'*)
+ symcode='[[ABCDGIRSTW]]' ;;
+esac
+
+# Try without a prefix undercore, then with it.
+for ac_symprfx in "" "_"; do
+
+ # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.
+ symxfrm="\\1 $ac_symprfx\\2 \\2"
+
+ # Write the raw and C identifiers.
+ lt_cv_sys_global_symbol_pipe="sed -n -e 's/^.*[[ ]]\($symcode$symcode*\)[[ ]][[ ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'"
+
+ # Check to see that the pipe works correctly.
+ pipe_works=no
+
+ rm -f conftest*
+ cat > conftest.$ac_ext <<EOF
+#ifdef __cplusplus
+extern "C" {
+#endif
+char nm_test_var;
+void nm_test_func(){}
+#ifdef __cplusplus
+}
+#endif
+int main(){nm_test_var='a';nm_test_func();return(0);}
+EOF
+
+ if AC_TRY_EVAL(ac_compile); then
+ # Now try to grab the symbols.
+ nlist=conftest.nm
+ if AC_TRY_EVAL(NM conftest.$ac_objext \| $lt_cv_sys_global_symbol_pipe \> $nlist) && test -s "$nlist"; then
+ # Try sorting and uniquifying the output.
+ if sort "$nlist" | uniq > "$nlist"T; then
+ mv -f "$nlist"T "$nlist"
+ else
+ rm -f "$nlist"T
+ fi
+
+ # Make sure that we snagged all the symbols we need.
+ if grep ' nm_test_var$' "$nlist" >/dev/null; then
+ if grep ' nm_test_func$' "$nlist" >/dev/null; then
+ cat <<EOF > conftest.$ac_ext
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+EOF
+ # Now generate the symbol file.
+ eval "$lt_cv_sys_global_symbol_to_cdecl"' < "$nlist" | grep -v main >> conftest.$ac_ext'
+
+ cat <<EOF >> conftest.$ac_ext
+#if defined (__STDC__) && __STDC__
+# define lt_ptr_t void *
+#else
+# define lt_ptr_t char *
+# define const
+#endif
+
+/* The mapping between symbol names and symbols. */
+const struct {
+ const char *name;
+ lt_ptr_t address;
+}
+lt_preloaded_symbols[[]] =
+{
+EOF
+ $SED "s/^$symcode$symcode* \(.*\) \(.*\)$/ {\"\2\", (lt_ptr_t) \&\2},/" < "$nlist" | grep -v main >> conftest.$ac_ext
+ cat <<\EOF >> conftest.$ac_ext
+ {0, (lt_ptr_t) 0}
+};
+
+#ifdef __cplusplus
+}
+#endif
+EOF
+ # Now try linking the two files.
+ mv conftest.$ac_objext conftstm.$ac_objext
+ lt_save_LIBS="$LIBS"
+ lt_save_CFLAGS="$CFLAGS"
+ LIBS="conftstm.$ac_objext"
+ CFLAGS="$CFLAGS$_LT_AC_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)"
+ if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then
+ pipe_works=yes
+ fi
+ LIBS="$lt_save_LIBS"
+ CFLAGS="$lt_save_CFLAGS"
+ else
+ echo "cannot find nm_test_func in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot find nm_test_var in $nlist" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "cannot run $lt_cv_sys_global_symbol_pipe" >&AS_MESSAGE_LOG_FD
+ fi
+ else
+ echo "$progname: failed program was:" >&AS_MESSAGE_LOG_FD
+ cat conftest.$ac_ext >&5
+ fi
+ rm -f conftest* conftst*
+
+ # Do not use the global_symbol_pipe unless it works.
+ if test "$pipe_works" = yes; then
+ break
+ else
+ lt_cv_sys_global_symbol_pipe=
+ fi
+done
+])
+if test -z "$lt_cv_sys_global_symbol_pipe"; then
+ lt_cv_sys_global_symbol_to_cdecl=
+fi
+if test -z "$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl"; then
+ AC_MSG_RESULT(failed)
+else
+ AC_MSG_RESULT(ok)
+fi
+]) # AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE
+
+
+# AC_LIBTOOL_PROG_COMPILER_PIC([TAGNAME])
+# ---------------------------------------
+AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC],
+[_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=
+
+AC_MSG_CHECKING([for $compiler option to produce PIC])
+ ifelse([$1],[CXX],[
+ # C++ specific cases for pic, static, wl, etc.
+ if test "$GXX" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+ mingw* | cygwin* | os2* | pw32*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+ *djgpp*)
+ # DJGPP does not support shared libraries at all
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ interix[[3-9]]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ case $host_os in
+ aix4* | aix5*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ chorus*)
+ case $cc_basename in
+ cxch68*)
+ # Green Hills C++ Compiler
+ # _LT_AC_TAGVAR(lt_prog_compiler_static, $1)="--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a"
+ ;;
+ esac
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ esac
+ ;;
+ dgux*)
+ case $cc_basename in
+ ec++*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ ghcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ freebsd* | dragonfly*)
+ # FreeBSD uses GNU C++
+ ;;
+ hpux9* | hpux10* | hpux11*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ fi
+ ;;
+ aCC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ interix*)
+ # This is c89, which is MS Visual C++ (no shared libs)
+ # Anyone wants to do a port?
+ ;;
+ irix5* | irix6* | nonstopux*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ # CC pic flag -KPIC is the default.
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ KCC*)
+ # KAI C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ icpc* | ecpc*)
+ # Intel C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgCC*)
+ # Portland Group C++ compiler.
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ cxx*)
+ # Compaq C++
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C++ 5.9
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+ lynxos*)
+ ;;
+ m88k*)
+ ;;
+ mvs*)
+ case $cc_basename in
+ cxx*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ netbsd* | netbsdelf*-gnu)
+ ;;
+ osf3* | osf4* | osf5*)
+ case $cc_basename in
+ KCC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'
+ ;;
+ RCC*)
+ # Rational C++ 2.4.1
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ cxx*)
+ # Digital/Compaq C++
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # Make sure the PIC flag is empty. It appears that all Alpha
+ # Linux and Compaq Tru64 Unix objects are PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ psos*)
+ ;;
+ solaris*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.2, 5.x and Centerline C++
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ ;;
+ gcx*)
+ # Green Hills C++ Compiler
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sunos4*)
+ case $cc_basename in
+ CC*)
+ # Sun C++ 4.x
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ lcc*)
+ # Lucid
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ tandem*)
+ case $cc_basename in
+ NCC*)
+ # NonStop-UX NCC 3.20
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ ;;
+ *)
+ ;;
+ esac
+ ;;
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ case $cc_basename in
+ CC*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ esac
+ ;;
+ vxworks*)
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+],
+[
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+
+ case $host_os in
+ aix*)
+ # All AIX code is PIC.
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ amigaos*)
+ # FIXME: we need at least 68020 code to build shared libraries, but
+ # adding the `-m68020' flag to GCC prevents building anything better,
+ # like `-m68040'.
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'
+ ;;
+
+ beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)
+ # PIC is the default for these OSes.
+ ;;
+
+ mingw* | cygwin* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ # Although the cygwin gcc ignores -fPIC, still need this for old-style
+ # (--disable-auto-import) libraries
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+
+ darwin* | rhapsody*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'
+ ;;
+
+ interix[[3-9]]*)
+ # Interix 3.x gcc -fpic/-fPIC options generate broken code.
+ # Instead, we relocate shared libraries at runtime.
+ ;;
+
+ msdosdjgpp*)
+ # Just because we use GCC doesn't mean we suddenly get shared libraries
+ # on systems that don't support them.
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ enable_shared=no
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic
+ fi
+ ;;
+
+ hpux*)
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'
+ ;;
+ esac
+ else
+ # PORTME Check for flag to pass linker flags through the system compiler.
+ case $host_os in
+ aix*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ if test "$host_cpu" = ia64; then
+ # AIX 5 now supports IA64 processor
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ else
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'
+ fi
+ ;;
+ darwin*)
+ # PIC is the default on this platform
+ # Common symbols not allowed in MH_DYLIB files
+ case $cc_basename in
+ xlc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-qnocommon'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ esac
+ ;;
+
+ mingw* | cygwin* | pw32* | os2*)
+ # This hack is so that the source file can tell whether it is being
+ # built for inclusion in a dll (and should export symbols for example).
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'
+ ;;
+
+ hpux9* | hpux10* | hpux11*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
+ # not for PA HP-UX.
+ case $host_cpu in
+ hppa*64*|ia64*)
+ # +Z the default
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='+Z'
+ ;;
+ esac
+ # Is there a better lt_prog_compiler_static that works with the bundled CC?
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # PIC (with -KPIC) is the default.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ linux* | k*bsd*-gnu)
+ case $cc_basename in
+ icc* | ecc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-static'
+ ;;
+ pgcc* | pgf77* | pgf90* | pgf95*)
+ # Portland Group compilers (*not* the Pentium gcc compiler,
+ # which looks to be a dead project)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+ ccc*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All Alpha code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+ *)
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*)
+ # Sun C 5.9
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ ;;
+ *Sun\ F*)
+ # Sun Fortran 8.3 passes all unrecognized flags to the linker
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)=''
+ ;;
+ esac
+ ;;
+ esac
+ ;;
+
+ osf3* | osf4* | osf5*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ # All OSF/1 code is PIC.
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ rdos*)
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ case $cc_basename in
+ f77* | f90* | f95*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4 | sysv4.2uw2* | sysv4.3*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec ;then
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ fi
+ ;;
+
+ sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ unicos*)
+ _LT_AC_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)='-pic'
+ _LT_AC_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)])
+
+#
+# Check to make sure the PIC flag actually works.
+#
+if test -n "$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)"; then
+ AC_LIBTOOL_COMPILER_OPTION([if $compiler PIC flag $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) works],
+ _LT_AC_TAGVAR(lt_prog_compiler_pic_works, $1),
+ [$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])], [],
+ [case $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1) in
+ "" | " "*) ;;
+ *) _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=" $_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)" ;;
+ esac],
+ [_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ _LT_AC_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])
+fi
+case $host_os in
+ # For platforms which do not support PIC, -DPIC is meaningless:
+ *djgpp*)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)=
+ ;;
+ *)
+ _LT_AC_TAGVAR(lt_prog_compiler_pic, $1)="$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)ifelse([$1],[],[ -DPIC],[ifelse([$1],[CXX],[ -DPIC],[])])"
+ ;;
+esac
+
+#
+# Check to make sure the static flag actually works.
+#
+wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\"$_LT_AC_TAGVAR(lt_prog_compiler_static, $1)\"
+AC_LIBTOOL_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],
+ _LT_AC_TAGVAR(lt_prog_compiler_static_works, $1),
+ $lt_tmp_static_flag,
+ [],
+ [_LT_AC_TAGVAR(lt_prog_compiler_static, $1)=])
+])
+
+
+# AC_LIBTOOL_PROG_LD_SHLIBS([TAGNAME])
+# ------------------------------------
+# See if the linker supports building shared libraries.
+AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS],
+[AC_REQUIRE([LT_AC_PROG_SED])dnl
+AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])
+ifelse([$1],[CXX],[
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ case $host_os in
+ aix4* | aix5*)
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ fi
+ ;;
+ pw32*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)="$ltdll_cmds"
+ ;;
+ cygwin* | mingw*)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/;/^.*[[ ]]__nm__/s/^.*[[ ]]__nm__\([[^ ]]*\)[[ ]][[^ ]]*/\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+ ;;
+ linux* | k*bsd*-gnu)
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ ;;
+ esac
+],[
+ runpath_var=
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=no
+ _LT_AC_TAGVAR(archive_cmds, $1)=
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)=
+ _LT_AC_TAGVAR(old_archive_from_expsyms_cmds, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ _LT_AC_TAGVAR(thread_safe_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)=
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=unknown
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=no
+ _LT_AC_TAGVAR(module_cmds, $1)=
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)=
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols'
+ # include_expsyms should be a list of space-separated symbols to be *always*
+ # included in the symbol list
+ _LT_AC_TAGVAR(include_expsyms, $1)=
+ # exclude_expsyms can be an extended regexp of symbols to exclude
+ # it will be wrapped by ` (' and `)$', so one must not match beginning or
+ # end of line. Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',
+ # as well as any symbol that contains `d'.
+ _LT_AC_TAGVAR(exclude_expsyms, $1)="_GLOBAL_OFFSET_TABLE_"
+ # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out
+ # platforms (ab)use it in PIC code, but their linkers get confused if
+ # the symbol is explicitly referenced. Since portable code cannot
+ # rely on this symbol name, it's probably fine to never include it in
+ # preloaded symbol tables.
+ extract_expsyms_cmds=
+ # Just being paranoid about ensuring that cc_basename is set.
+ _LT_CC_BASENAME([$compiler])
+ case $host_os in
+ cygwin* | mingw* | pw32*)
+ # FIXME: the MSVC++ port hasn't been tested in a loooong time
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ if test "$GCC" != yes; then
+ with_gnu_ld=no
+ fi
+ ;;
+ interix*)
+ # we just hope/assume this is gcc and not c89 (= MSVC++)
+ with_gnu_ld=yes
+ ;;
+ openbsd*)
+ with_gnu_ld=no
+ ;;
+ esac
+
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ if test "$with_gnu_ld" = yes; then
+ # If archive_cmds runs LD, not CC, wlarc should be empty
+ wlarc='${wl}'
+
+ # Set some defaults for GNU ld with shared library support. These
+ # are reset later if shared libraries are not supported. Putting them
+ # here allows them to be overridden if necessary.
+ runpath_var=LD_RUN_PATH
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'
+ # ancient GNU ld didn't support --whole-archive et. al.
+ if $LD --help 2>&1 | grep 'no-whole-archive' > /dev/null; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)="$wlarc"'--whole-archive$convenience '"$wlarc"'--no-whole-archive'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ supports_anon_versioning=no
+ case `$LD -v 2>/dev/null` in
+ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.10.*) ;; # catch versions < 2.11
+ *\ 2.11.93.0.2\ *) supports_anon_versioning=yes ;; # RH7.3 ...
+ *\ 2.11.92.0.12\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...
+ *\ 2.11.*) ;; # other 2.11 versions
+ *) supports_anon_versioning=yes ;;
+ esac
+
+ # See if GNU ld supports shared libraries.
+ case $host_os in
+ aix3* | aix4* | aix5*)
+ # On AIX/PPC, the GNU linker is very broken
+ if test "$host_cpu" != ia64; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: the GNU linker, at least up to release 2.9.1, is reported
+*** to be unable to reliably create shared libraries on AIX.
+*** Therefore, libtool is disabling shared libraries support. If you
+*** really care for shared libraries, you may want to modify your PATH
+*** so that a non-GNU linker is found, and then restart.
+
+EOF
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+
+ # Samuel A. Falvo II <kc5tja@dolphin.openprojects.net> reports
+ # that the semantics of dynamic libraries on AmigaOS, at least up
+ # to version 4, is to share data among multiple programs linked
+ # with the same dynamic library. Since this doesn't match the
+ # behavior of shared libraries on other platforms, we can't use
+ # them.
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ beos*)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Joseph Beckenbach <jrb3@best.com> says some releases of gcc
+ # support --undefined. This deserves some investigation. FIXME
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,
+ # as there is no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=no
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\([[^ ]]*\)/\1 DATA/'\'' -e '\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\'' | sort | uniq > $export_symbols'
+
+ if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ # If the export-symbols file already is a .def file (1st line
+ # is EXPORTS), use it as is; otherwise, prepend...
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then
+ cp $export_symbols $output_objdir/$soname.def;
+ else
+ echo EXPORTS > $output_objdir/$soname.def;
+ cat $export_symbols >> $output_objdir/$soname.def;
+ fi~
+ $CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ interix[[3-9]]*)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.
+ # Instead, shared libraries are loaded at an image base (0x10000000 by
+ # default) and relocated if they conflict, which is a slow very memory
+ # consuming and fragmenting process. To avoid this, we pick a random,
+ # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link
+ # time. Moving up from 0x10000000 also allows more sbrk(2) space.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed "s,^,_," $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \* 262144 + 1342177280` -o $lib'
+ ;;
+
+ gnu* | linux* | k*bsd*-gnu)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ tmp_addflag=
+ case $cc_basename,$host_cpu in
+ pgcc*) # Portland Group C compiler
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag'
+ ;;
+ pgf77* | pgf90* | pgf95*) # Portland Group f77 and f90 compilers
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\"\"; do test -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_addflag=' $pic_flag -Mnomain' ;;
+ ecc*,ia64* | icc*,ia64*) # Intel C compiler on ia64
+ tmp_addflag=' -i_dynamic' ;;
+ efc*,ia64* | ifort*,ia64*) # Intel Fortran compiler on ia64
+ tmp_addflag=' -i_dynamic -nofor_main' ;;
+ ifc* | ifort*) # Intel Fortran compiler
+ tmp_addflag=' -nofor_main' ;;
+ esac
+ case `$CC -V 2>&1 | sed 5q` in
+ *Sun\ C*) # Sun C 5.9
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\"\"; do test -z \"$conv\" || new_convenience=\"$new_convenience,$conv\"; done; $echo \"$new_convenience\"` ${wl}--no-whole-archive'
+ tmp_sharedflag='-G' ;;
+ *Sun\ F*) # Sun Fortran 8.3
+ tmp_sharedflag='-G' ;;
+ *)
+ tmp_sharedflag='-shared' ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+
+ if test $supports_anon_versioning = yes; then
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $output_objdir/$libname.ver~
+ cat $export_symbols | sed -e "s/\(.*\)/\1;/" >> $output_objdir/$libname.ver~
+ $echo "local: *; };" >> $output_objdir/$libname.ver~
+ $CC '"$tmp_sharedflag""$tmp_addflag"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'
+ fi
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=no
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ netbsd* | netbsdelf*-gnu)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'
+ wlarc=
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ fi
+ ;;
+
+ solaris*)
+ if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<EOF 1>&2
+
+*** Warning: The releases 2.8.* of the GNU linker cannot reliably
+*** create shared libraries on Solaris systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.9.1 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+EOF
+ elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)
+ case `$LD -v 2>&1` in
+ *\ [[01]].* | *\ 2.[[0-9]].* | *\ 2.1[[0-5]].*)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ cat <<_LT_EOF 1>&2
+
+*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not
+*** reliably create shared libraries on SCO systems. Therefore, libtool
+*** is disabling shared libraries support. We urge you to upgrade GNU
+*** binutils to release 2.16.91.0.3 or newer. Another option is to modify
+*** your PATH or compiler configuration so that the native linker is
+*** used, and then restart.
+
+_LT_EOF
+ ;;
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-rpath,$libdir`'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname,\${SCOABSPATH:+${install_libdir}/}$soname,-retain-symbols-file,$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+ ;;
+
+ sunos4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ wlarc=
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+ esac
+
+ if test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no; then
+ runpath_var=
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=
+ fi
+ else
+ # PORTME fill in a description of your system's linker (not GNU ld)
+ case $host_os in
+ aix3*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'
+ # Note: this linker hardcodes the directories in LIBPATH if there
+ # are no directories specified by -L.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ if test "$GCC" = yes && test -z "$lt_prog_compiler_static"; then
+ # Neither direct hardcoding nor static linking is supported with a
+ # broken collect2.
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ fi
+ ;;
+
+ aix4* | aix5*)
+ if test "$host_cpu" = ia64; then
+ # On IA64, the linker does run time linking by default, so we don't
+ # have to do anything special.
+ aix_use_runtimelinking=no
+ exp_sym_flag='-Bexport'
+ no_entry_flag=""
+ else
+ # If we're using GNU nm, then we don't want the "-C" option.
+ # -C means demangle to AIX nm, but means don't demangle with GNU nm
+ if $NM -V 2>&1 | grep 'GNU' > /dev/null; then
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ else
+ _LT_AC_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\''{ if (((\[$]2 == "T") || (\[$]2 == "D") || (\[$]2 == "B")) && ([substr](\[$]3,1,1) != ".")) { print \[$]3 } }'\'' | sort -u > $export_symbols'
+ fi
+ aix_use_runtimelinking=no
+
+ # Test if we are trying to use run time linking or normal
+ # AIX style linking. If -brtl is somewhere in LDFLAGS, we
+ # need to do runtime linking.
+ case $host_os in aix4.[[23]]|aix4.[[23]].*|aix5*)
+ for ld_flag in $LDFLAGS; do
+ if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then
+ aix_use_runtimelinking=yes
+ break
+ fi
+ done
+ ;;
+ esac
+
+ exp_sym_flag='-bexport'
+ no_entry_flag='-bnoentry'
+ fi
+
+ # When large executables or shared objects are built, AIX ld can
+ # have problems creating the table of contents. If linking a library
+ # or program results in "error TOC overflow" add -mminimal-toc to
+ # CXXFLAGS/CFLAGS for g++/gcc. In the cases where that is not
+ # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.
+
+ _LT_AC_TAGVAR(archive_cmds, $1)=''
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+
+ if test "$GCC" = yes; then
+ case $host_os in aix4.[[012]]|aix4.[[012]].*)
+ # We only want to do this on AIX 4.2 and lower, the check
+ # below for broken collect2 doesn't work under 4.3+
+ collect2name=`${CC} -print-prog-name=collect2`
+ if test -f "$collect2name" && \
+ strings "$collect2name" | grep resolve_lib_name >/dev/null
+ then
+ # We have reworked collect2
+ :
+ else
+ # We have old collect2
+ _LT_AC_TAGVAR(hardcode_direct, $1)=unsupported
+ # It fails to find uninstalled libraries when the uninstalled
+ # path is not listed in the libpath. Setting hardcode_minus_L
+ # to unsupported forces relinking
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=
+ fi
+ ;;
+ esac
+ shared_flag='-shared'
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag="$shared_flag "'${wl}-G'
+ fi
+ else
+ # not using gcc
+ if test "$host_cpu" = ia64; then
+ # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
+ # chokes on -Wl,-G. The following line is correct:
+ shared_flag='-G'
+ else
+ if test "$aix_use_runtimelinking" = yes; then
+ shared_flag='${wl}-G'
+ else
+ shared_flag='${wl}-bM:SRE'
+ fi
+ fi
+ fi
+
+ # It seems that -bexpall does not export symbols beginning with
+ # underscore (_), so it is better to generate a list of symbols to export.
+ _LT_AC_TAGVAR(always_export_symbols, $1)=yes
+ if test "$aix_use_runtimelinking" = yes; then
+ # Warning - without using the other runtime loading flags (-brtl),
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='-berok'
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then echo "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
+ else
+ if test "$host_cpu" = ia64; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)="-z nodefs"
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
+ else
+ # Determine the default libpath from the value encoded in an empty executable.
+ _LT_AC_SYS_LIBPATH_AIX
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'"$aix_libpath"
+ # Warning - without using the other run time loading flags,
+ # -berok will link without error, but may produce a broken library.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'
+ # Exported symbols can be pulled into shared objects from archives
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='$convenience'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ # This is similar to how AIX traditionally builds its shared libraries.
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
+ fi
+ fi
+ ;;
+
+ amigaos*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/a2ixlibrary.data~$echo "#define NAME $libname" > $output_objdir/a2ixlibrary.data~$echo "#define LIBRARY_ID 1" >> $output_objdir/a2ixlibrary.data~$echo "#define VERSION $major" >> $output_objdir/a2ixlibrary.data~$echo "#define REVISION $revision" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ # see comment about different semantics on the GNU ld section
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ bsdi[[45]]*)
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic
+ ;;
+
+ cygwin* | mingw* | pw32*)
+ # When not using gcc, we currently assume that we are using
+ # Microsoft Visual C++.
+ # hardcode_libdir_flag_spec is actually meaningless, as there is
+ # no search path for DLLs.
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)=' '
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ # Tell ltmain to make .lib files, not .a files.
+ libext=lib
+ # Tell ltmain to make .dll files, not .so files.
+ shrext_cmds=".dll"
+ # FIXME: Setting linknames here is a bad hack.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `echo "$deplibs" | $SED -e '\''s/ -lc$//'\''` -link -dll~linknames='
+ # The linker will automatically build a .lib file if we build a DLL.
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='true'
+ # FIXME: Should let the user specify the lib program.
+ _LT_AC_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'
+ _LT_AC_TAGVAR(fix_srcfile_path, $1)='`cygpath -w "$srcfile"`'
+ _LT_AC_TAGVAR(enable_shared_with_static_runtimes, $1)=yes
+ ;;
+
+ darwin* | rhapsody*)
+ case $host_os in
+ rhapsody* | darwin1.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}suppress'
+ ;;
+ *) # Darwin 1.3 on
+ if test -z ${MACOSX_DEPLOYMENT_TARGET} ; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ else
+ case ${MACOSX_DEPLOYMENT_TARGET} in
+ 10.[[012]])
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-flat_namespace ${wl}-undefined ${wl}suppress'
+ ;;
+ 10.*)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-undefined ${wl}dynamic_lookup'
+ ;;
+ esac
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_automatic, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=unsupported
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)=''
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ if test "$GCC" = yes ; then
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ else
+ case $cc_basename in
+ xlc*)
+ output_verbose_link_cmd='echo'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}`echo $rpath/$soname` $xlcverstring'
+ _LT_AC_TAGVAR(module_cmds, $1)='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags'
+ # Don't fix this by using the ld -exported_symbols_list flag, it doesn't exist in older darwin lds
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC -qmkshrobj $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-install_name ${wl}$rpath/$soname $xlcverstring~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ _LT_AC_TAGVAR(module_expsym_cmds, $1)='sed -e "s,#.*,," -e "s,^[ ]*,," -e "s,^\(..*\),_&," < $export_symbols > $output_objdir/${libname}-symbols.expsym~$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs$compiler_flags~nmedit -s $output_objdir/${libname}-symbols.expsym ${lib}'
+ ;;
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+ ;;
+
+ dgux*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ freebsd1*)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+
+ # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor
+ # support. Future versions do this automatically, but an explicit c++rt0.o
+ # does not break anything, and helps significantly (at the cost of a little
+ # extra space).
+ freebsd2.2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # Unfortunately, older versions of FreeBSD 2 do not have this feature.
+ freebsd2*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ # FreeBSD 3 and greater uses gcc -shared to do shared libraries.
+ freebsd* | dragonfly*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ hpux9*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$CC -shared -fPIC ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$rm $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ ;;
+
+ hpux10*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ fi
+ ;;
+
+ hpux11*)
+ if test "$GCC" = yes -a "$with_gnu_ld" = no; then
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ else
+ case $host_cpu in
+ hppa*64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ ia64*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
+ ;;
+ esac
+ fi
+ if test "$with_gnu_ld" = no; then
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+
+ case $host_cpu in
+ hppa*64*|ia64*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='+b $libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+ *)
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+
+ # hardcode_minus_L: Not really in the search PATH,
+ # but as the default location of the library.
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ ;;
+ esac
+ fi
+ ;;
+
+ irix5* | irix6* | nonstopux*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec_ld, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ netbsd* | netbsdelf*-gnu)
+ if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags' # a.out
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags' # ELF
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ newsos6)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ openbsd*)
+ if test -f /usr/libexec/ld.so; then
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'
+ else
+ case $host_os in
+ openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ ;;
+ *)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'
+ ;;
+ esac
+ fi
+ else
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ fi
+ ;;
+
+ os2*)
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=unsupported
+ _LT_AC_TAGVAR(archive_cmds, $1)='$echo "LIBRARY $libname INITINSTANCE" > $output_objdir/$libname.def~$echo "DESCRIPTION \"$libname\"" >> $output_objdir/$libname.def~$echo DATA >> $output_objdir/$libname.def~$echo " SINGLE NONSHARED" >> $output_objdir/$libname.def~$echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'
+ _LT_AC_TAGVAR(old_archive_From_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'
+ ;;
+
+ osf3*)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ osf4* | osf5*) # as osf3* with the addition of -msym flag
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n "$verstring" && echo ${wl}-set_version ${wl}$verstring` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'
+ else
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \*'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -shared${allow_undefined_flag} $libobjs $deplibs $linker_flags -msym -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf "%s %s\\n" -exported_symbol "\$i" >> $lib.exp; done; echo "-hidden">> $lib.exp~
+ $LD -shared${allow_undefined_flag} -input $lib.exp $linker_flags $libobjs $deplibs -soname $soname `test -n "$verstring" && echo -set_version $verstring` -update_registry ${output_objdir}/so_locations -o $lib~$rm $lib.exp'
+
+ # Both c and cxx compiler support -rpath directly
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=:
+ ;;
+
+ solaris*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)=' -z text'
+ if test "$GCC" = yes; then
+ wlarc='${wl}'
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $CC -shared ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$rm $lib.exp'
+ else
+ wlarc=''
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$echo "{ global:" > $lib.exp~cat $export_symbols | $SED -e "s/\(.*\)/\1;/" >> $lib.exp~$echo "local: *; };" >> $lib.exp~
+ $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$rm $lib.exp'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ case $host_os in
+ solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;
+ *)
+ # The compiler driver will combine and reorder linker options,
+ # but understands `-z linker_flag'. GCC discards it without `$wl',
+ # but is careful enough not to reorder.
+ # Supported since Solaris 2.6 (maybe 2.5.1?)
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'
+ else
+ _LT_AC_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'
+ fi
+ ;;
+ esac
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ ;;
+
+ sunos4*)
+ if test "x$host_vendor" = xsequent; then
+ # Use $CC to link under sequent, because it throws in some extra .o
+ # files that make .init and .fini sections work.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'
+ fi
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes
+ _LT_AC_TAGVAR(hardcode_minus_L, $1)=yes
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4)
+ case $host_vendor in
+ sni)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=yes # is this really true???
+ ;;
+ siemens)
+ ## LD is ld it makes a PLAMLIB
+ ## CC just makes a GrossModule.
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no
+ ;;
+ motorola)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie
+ ;;
+ esac
+ runpath_var='LD_RUN_PATH'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ sysv4.3*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'
+ ;;
+
+ sysv4*MP*)
+ if test -d /usr/nec; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var=LD_RUN_PATH
+ hardcode_runpath_var=yes
+ _LT_AC_TAGVAR(ld_shlibs, $1)=yes
+ fi
+ ;;
+
+ sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ sysv5* | sco3.2v5* | sco5v6*)
+ # Note: We can NOT use -z defs as we might desire, because we do not
+ # link with -lc, and that would cause any symbols used from libc to
+ # always be unresolved, which means just about no library would
+ # ever link correctly. If we're not using GNU ld we use -z text
+ # though, which does catch some bad symbols but isn't as heavy-handed
+ # as -z defs.
+ _LT_AC_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='`test -z "$SCOABSPATH" && echo ${wl}-R,$libdir`'
+ _LT_AC_TAGVAR(hardcode_libdir_separator, $1)=':'
+ _LT_AC_TAGVAR(link_all_deplibs, $1)=yes
+ _LT_AC_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'
+ runpath_var='LD_RUN_PATH'
+
+ if test "$GCC" = yes; then
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ else
+ _LT_AC_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ _LT_AC_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,\${SCOABSPATH:+${install_libdir}/}$soname -o $lib $libobjs $deplibs $compiler_flags'
+ fi
+ ;;
+
+ uts4*)
+ _LT_AC_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'
+ _LT_AC_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'
+ _LT_AC_TAGVAR(hardcode_shlibpath_var, $1)=no
+ ;;
+
+ *)
+ _LT_AC_TAGVAR(ld_shlibs, $1)=no
+ ;;
+ esac
+ fi
+])
+AC_MSG_RESULT([$_LT_AC_TAGVAR(ld_shlibs, $1)])
+test "$_LT_AC_TAGVAR(ld_shlibs, $1)" = no && can_build_shared=no
+
+#
+# Do we need to explicitly link libc?
+#
+case "x$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)" in
+x|xyes)
+ # Assume -lc should be added
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+
+ if test "$enable_shared" = yes && test "$GCC" = yes; then
+ case $_LT_AC_TAGVAR(archive_cmds, $1) in
+ *'~'*)
+ # FIXME: we may have to deal with multi-command sequences.
+ ;;
+ '$CC '*)
+ # Test whether the compiler implicitly links with -lc since on some
+ # systems, -lgcc has to come before -lc. If gcc already passes -lc
+ # to ld, don't add -lc before -lgcc.
+ AC_MSG_CHECKING([whether -lc should be explicitly linked in])
+ $rm conftest*
+ echo "$lt_simple_compile_test_code" > conftest.$ac_ext
+
+ if AC_TRY_EVAL(ac_compile) 2>conftest.err; then
+ soname=conftest
+ lib=conftest
+ libobjs=conftest.$ac_objext
+ deplibs=
+ wl=$_LT_AC_TAGVAR(lt_prog_compiler_wl, $1)
+ pic_flag=$_LT_AC_TAGVAR(lt_prog_compiler_pic, $1)
+ compiler_flags=-v
+ linker_flags=-v
+ verstring=
+ output_objdir=.
+ libname=conftest
+ lt_save_allow_undefined_flag=$_LT_AC_TAGVAR(allow_undefined_flag, $1)
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=
+ if AC_TRY_EVAL(_LT_AC_TAGVAR(archive_cmds, $1) 2\>\&1 \| grep \" -lc \" \>/dev/null 2\>\&1)
+ then
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=no
+ else
+ _LT_AC_TAGVAR(archive_cmds_need_lc, $1)=yes
+ fi
+ _LT_AC_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag
+ else
+ cat conftest.err 1>&5
+ fi
+ $rm conftest*
+ AC_MSG_RESULT([$_LT_AC_TAGVAR(archive_cmds_need_lc, $1)])
+ ;;
+ esac
+ fi
+ ;;
+esac
+])# AC_LIBTOOL_PROG_LD_SHLIBS
+
+
+# _LT_AC_FILE_LTDLL_C
+# -------------------
+# Be careful that the start marker always follows a newline.
+AC_DEFUN([_LT_AC_FILE_LTDLL_C], [
+# /* ltdll.c starts here */
+# #define WIN32_LEAN_AND_MEAN
+# #include <windows.h>
+# #undef WIN32_LEAN_AND_MEAN
+# #include <stdio.h>
+#
+# #ifndef __CYGWIN__
+# # ifdef __CYGWIN32__
+# # define __CYGWIN__ __CYGWIN32__
+# # endif
+# #endif
+#
+# #ifdef __cplusplus
+# extern "C" {
+# #endif
+# BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved);
+# #ifdef __cplusplus
+# }
+# #endif
+#
+# #ifdef __CYGWIN__
+# #include <cygwin/cygwin_dll.h>
+# DECLARE_CYGWIN_DLL( DllMain );
+# #endif
+# HINSTANCE __hDllInstance_base;
+#
+# BOOL APIENTRY
+# DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
+# {
+# __hDllInstance_base = hInst;
+# return TRUE;
+# }
+# /* ltdll.c ends here */
+])# _LT_AC_FILE_LTDLL_C
+
+
+# _LT_AC_TAGVAR(VARNAME, [TAGNAME])
+# ---------------------------------
+AC_DEFUN([_LT_AC_TAGVAR], [ifelse([$2], [], [$1], [$1_$2])])
+
+
+# old names
+AC_DEFUN([AM_PROG_LIBTOOL], [AC_PROG_LIBTOOL])
+AC_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])
+AC_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])
+AC_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])
+AC_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])
+AC_DEFUN([AM_PROG_LD], [AC_PROG_LD])
+AC_DEFUN([AM_PROG_NM], [AC_PROG_NM])
+
+# This is just to silence aclocal about the macro not being used
+ifelse([AC_DISABLE_FAST_INSTALL])
+
+AC_DEFUN([LT_AC_PROG_GCJ],
+[AC_CHECK_TOOL(GCJ, gcj, no)
+ test "x${GCJFLAGS+set}" = xset || GCJFLAGS="-g -O2"
+ AC_SUBST(GCJFLAGS)
+])
+
+AC_DEFUN([LT_AC_PROG_RC],
+[AC_CHECK_TOOL(RC, windres, no)
+])
+
+
+# Cheap backport of AS_EXECUTABLE_P and required macros
+# from Autoconf 2.59; we should not use $as_executable_p directly.
+
+# _AS_TEST_PREPARE
+# ----------------
+m4_ifndef([_AS_TEST_PREPARE],
+[m4_defun([_AS_TEST_PREPARE],
+[if test -x / >/dev/null 2>&1; then
+ as_executable_p='test -x'
+else
+ as_executable_p='test -f'
+fi
+])])# _AS_TEST_PREPARE
+
+# AS_EXECUTABLE_P
+# ---------------
+# Check whether a file is executable.
+m4_ifndef([AS_EXECUTABLE_P],
+[m4_defun([AS_EXECUTABLE_P],
+[AS_REQUIRE([_AS_TEST_PREPARE])dnl
+$as_executable_p $1[]dnl
+])])# AS_EXECUTABLE_P
+
+############################################################
+# NOTE: This macro has been submitted for inclusion into #
+# GNU Autoconf as AC_PROG_SED. When it is available in #
+# a released version of Autoconf we should remove this #
+# macro and use it instead. #
+############################################################
+# LT_AC_PROG_SED
+# --------------
+# Check for a fully-functional sed program, that truncates
+# as few characters as possible. Prefer GNU sed if found.
+AC_DEFUN([LT_AC_PROG_SED],
+[AC_MSG_CHECKING([for a sed that does not truncate output])
+AC_CACHE_VAL(lt_cv_path_SED,
+[# Loop through the user's path and test for sed and gsed.
+# Then use that list of sed's as ones to test for truncation.
+as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+ IFS=$as_save_IFS
+ test -z "$as_dir" && as_dir=.
+ for lt_ac_prog in sed gsed; do
+ for ac_exec_ext in '' $ac_executable_extensions; do
+ if AS_EXECUTABLE_P(["$as_dir/$lt_ac_prog$ac_exec_ext"]); then
+ lt_ac_sed_list="$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext"
+ fi
+ done
+ done
+done
+IFS=$as_save_IFS
+lt_ac_max=0
+lt_ac_count=0
+# Add /usr/xpg4/bin/sed as it is typically found on Solaris
+# along with /bin/sed that truncates output.
+for lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do
+ test ! -f $lt_ac_sed && continue
+ cat /dev/null > conftest.in
+ lt_ac_count=0
+ echo $ECHO_N "0123456789$ECHO_C" >conftest.in
+ # Check for GNU sed and select it if it is found.
+ if "$lt_ac_sed" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then
+ lt_cv_path_SED=$lt_ac_sed
+ break
+ fi
+ while true; do
+ cat conftest.in conftest.in >conftest.tmp
+ mv conftest.tmp conftest.in
+ cp conftest.in conftest.nl
+ echo >>conftest.nl
+ $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break
+ cmp -s conftest.out conftest.nl || break
+ # 10000 chars as input seems more than enough
+ test $lt_ac_count -gt 10 && break
+ lt_ac_count=`expr $lt_ac_count + 1`
+ if test $lt_ac_count -gt $lt_ac_max; then
+ lt_ac_max=$lt_ac_count
+ lt_cv_path_SED=$lt_ac_sed
+ fi
+ done
+done
+])
+SED=$lt_cv_path_SED
+AC_SUBST([SED])
+AC_MSG_RESULT([$SED])
+])
+
+dnl PKG_CHECK_MODULES(GSTUFF, gtk+-2.0 >= 1.3 glib = 1.3.4, action-if, action-not)
+dnl defines GSTUFF_LIBS, GSTUFF_CFLAGS, see pkg-config man page
+dnl also defines GSTUFF_PKG_ERRORS on error
+AC_DEFUN([PKG_CHECK_MODULES], [
+ succeeded=no
+
+ if test -z "$PKG_CONFIG"; then
+ AC_PATH_PROG(PKG_CONFIG, pkg-config, no)
+ fi
+
+ if test "$PKG_CONFIG" = "no" ; then
+ echo "*** The pkg-config script could not be found. Make sure it is"
+ echo "*** in your path, or set the PKG_CONFIG environment variable"
+ echo "*** to the full path to pkg-config."
+ echo "*** Or see http://www.freedesktop.org/software/pkgconfig to get pkg-config."
+ else
+ PKG_CONFIG_MIN_VERSION=0.9.0
+ if $PKG_CONFIG --atleast-pkgconfig-version $PKG_CONFIG_MIN_VERSION; then
+ AC_MSG_CHECKING(for $2)
+
+ if $PKG_CONFIG --exists "$2" ; then
+ AC_MSG_RESULT(yes)
+ succeeded=yes
+
+ AC_MSG_CHECKING($1_CFLAGS)
+ $1_CFLAGS=`$PKG_CONFIG --cflags "$2"`
+ AC_MSG_RESULT($$1_CFLAGS)
+
+ AC_MSG_CHECKING($1_LIBS)
+ $1_LIBS=`$PKG_CONFIG --libs "$2"`
+ AC_MSG_RESULT($$1_LIBS)
+ else
+ $1_CFLAGS=""
+ $1_LIBS=""
+ ## If we have a custom action on failure, don't print errors, but
+ ## do set a variable so people can do so.
+ $1_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$2"`
+ ifelse([$4], ,echo $$1_PKG_ERRORS,)
+ fi
+
+ AC_SUBST($1_CFLAGS)
+ AC_SUBST($1_LIBS)
+ else
+ echo "*** Your version of pkg-config is too old. You need version $PKG_CONFIG_MIN_VERSION or newer."
+ echo "*** See http://www.freedesktop.org/software/pkgconfig"
+ fi
+ fi
+
+ if test $succeeded = yes; then
+ ifelse([$3], , :, [$3])
+ else
+ ifelse([$4], , AC_MSG_ERROR([Library requirements ($2) not met; consider adjusting the PKG_CONFIG_PATH environment variable if your libraries are in a nonstandard prefix so pkg-config can find them.]), [$4])
+ fi
+])
+
+
diff --git a/aclocal.m4 b/aclocal.m4
new file mode 100644
index 0000000..0e90944
--- /dev/null
+++ b/aclocal.m4
@@ -0,0 +1,892 @@
+# generated automatically by aclocal 1.9.6 -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
+# 2005 Free Software Foundation, Inc.
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+# Copyright (C) 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_AUTOMAKE_VERSION(VERSION)
+# ----------------------------
+# Automake X.Y traces this macro to ensure aclocal.m4 has been
+# generated from the m4 files accompanying Automake X.Y.
+AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.9"])
+
+# AM_SET_CURRENT_AUTOMAKE_VERSION
+# -------------------------------
+# Call AM_AUTOMAKE_VERSION so it can be traced.
+# This function is AC_REQUIREd by AC_INIT_AUTOMAKE.
+AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
+ [AM_AUTOMAKE_VERSION([1.9.6])])
+
+# AM_AUX_DIR_EXPAND -*- Autoconf -*-
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets
+# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to
+# `$srcdir', `$srcdir/..', or `$srcdir/../..'.
+#
+# Of course, Automake must honor this variable whenever it calls a
+# tool from the auxiliary directory. The problem is that $srcdir (and
+# therefore $ac_aux_dir as well) can be either absolute or relative,
+# depending on how configure is run. This is pretty annoying, since
+# it makes $ac_aux_dir quite unusable in subdirectories: in the top
+# source directory, any form will work fine, but in subdirectories a
+# relative path needs to be adjusted first.
+#
+# $ac_aux_dir/missing
+# fails when called from a subdirectory if $ac_aux_dir is relative
+# $top_srcdir/$ac_aux_dir/missing
+# fails if $ac_aux_dir is absolute,
+# fails when called from a subdirectory in a VPATH build with
+# a relative $ac_aux_dir
+#
+# The reason of the latter failure is that $top_srcdir and $ac_aux_dir
+# are both prefixed by $srcdir. In an in-source build this is usually
+# harmless because $srcdir is `.', but things will broke when you
+# start a VPATH build or use an absolute $srcdir.
+#
+# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,
+# iff we strip the leading $srcdir from $ac_aux_dir. That would be:
+# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"`
+# and then we would define $MISSING as
+# MISSING="\${SHELL} $am_aux_dir/missing"
+# This will work as long as MISSING is not called from configure, because
+# unfortunately $(top_srcdir) has no meaning in configure.
+# However there are other variables, like CC, which are often used in
+# configure, and could therefore not use this "fixed" $ac_aux_dir.
+#
+# Another solution, used here, is to always expand $ac_aux_dir to an
+# absolute PATH. The drawback is that using absolute paths prevent a
+# configured tree to be moved without reconfiguration.
+
+AC_DEFUN([AM_AUX_DIR_EXPAND],
+[dnl Rely on autoconf to set up CDPATH properly.
+AC_PREREQ([2.50])dnl
+# expand $ac_aux_dir to an absolute path
+am_aux_dir=`cd $ac_aux_dir && pwd`
+])
+
+# AM_CONDITIONAL -*- Autoconf -*-
+
+# Copyright (C) 1997, 2000, 2001, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 7
+
+# AM_CONDITIONAL(NAME, SHELL-CONDITION)
+# -------------------------------------
+# Define a conditional.
+AC_DEFUN([AM_CONDITIONAL],
+[AC_PREREQ(2.52)dnl
+ ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])],
+ [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl
+AC_SUBST([$1_TRUE])
+AC_SUBST([$1_FALSE])
+if $2; then
+ $1_TRUE=
+ $1_FALSE='#'
+else
+ $1_TRUE='#'
+ $1_FALSE=
+fi
+AC_CONFIG_COMMANDS_PRE(
+[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then
+ AC_MSG_ERROR([[conditional "$1" was never defined.
+Usually this means the macro was only invoked conditionally.]])
+fi])])
+
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be
+# written in clear, in which case automake, when reading aclocal.m4,
+# will think it sees a *use*, and therefore will trigger all it's
+# C support machinery. Also note that it means that autoscan, seeing
+# CC etc. in the Makefile, will ask for an AC_PROG_CC use...
+
+
+# _AM_DEPENDENCIES(NAME)
+# ----------------------
+# See how the compiler implements dependency checking.
+# NAME is "CC", "CXX", "GCJ", or "OBJC".
+# We try a few techniques and use that to set a single cache variable.
+#
+# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was
+# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular
+# dependency, and given that the user is not expected to run this macro,
+# just rely on AC_PROG_CC.
+AC_DEFUN([_AM_DEPENDENCIES],
+[AC_REQUIRE([AM_SET_DEPDIR])dnl
+AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl
+AC_REQUIRE([AM_MAKE_INCLUDE])dnl
+AC_REQUIRE([AM_DEP_TRACK])dnl
+
+ifelse([$1], CC, [depcc="$CC" am_compiler_list=],
+ [$1], CXX, [depcc="$CXX" am_compiler_list=],
+ [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'],
+ [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'],
+ [depcc="$$1" am_compiler_list=])
+
+AC_CACHE_CHECK([dependency style of $depcc],
+ [am_cv_$1_dependencies_compiler_type],
+[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then
+ # We make a subdir and do the tests there. Otherwise we can end up
+ # making bogus files that we don't know about and never remove. For
+ # instance it was reported that on HP-UX the gcc test will end up
+ # making a dummy file named `D' -- because `-MD' means `put the output
+ # in D'.
+ mkdir conftest.dir
+ # Copy depcomp to subdir because otherwise we won't find it if we're
+ # using a relative directory.
+ cp "$am_depcomp" conftest.dir
+ cd conftest.dir
+ # We will build objects and dependencies in a subdirectory because
+ # it helps to detect inapplicable dependency modes. For instance
+ # both Tru64's cc and ICC support -MD to output dependencies as a
+ # side effect of compilation, but ICC will put the dependencies in
+ # the current directory while Tru64 will put them in the object
+ # directory.
+ mkdir sub
+
+ am_cv_$1_dependencies_compiler_type=none
+ if test "$am_compiler_list" = ""; then
+ am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp`
+ fi
+ for depmode in $am_compiler_list; do
+ # Setup a source with many dependencies, because some compilers
+ # like to wrap large dependency lists on column 80 (with \), and
+ # we should not choose a depcomp mode which is confused by this.
+ #
+ # We need to recreate these files for each test, as the compiler may
+ # overwrite some of them when testing with obscure command lines.
+ # This happens at least with the AIX C compiler.
+ : > sub/conftest.c
+ for i in 1 2 3 4 5 6; do
+ echo '#include "conftst'$i'.h"' >> sub/conftest.c
+ # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with
+ # Solaris 8's {/usr,}/bin/sh.
+ touch sub/conftst$i.h
+ done
+ echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf
+
+ case $depmode in
+ nosideeffect)
+ # after this tag, mechanisms are not by side-effect, so they'll
+ # only be used when explicitly requested
+ if test "x$enable_dependency_tracking" = xyes; then
+ continue
+ else
+ break
+ fi
+ ;;
+ none) break ;;
+ esac
+ # We check with `-c' and `-o' for the sake of the "dashmstdout"
+ # mode. It turns out that the SunPro C++ compiler does not properly
+ # handle `-M -o', and we need to detect this.
+ if depmode=$depmode \
+ source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \
+ depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \
+ $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \
+ >/dev/null 2>conftest.err &&
+ grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&
+ grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 &&
+ ${MAKE-make} -s -f confmf > /dev/null 2>&1; then
+ # icc doesn't choke on unknown options, it will just issue warnings
+ # or remarks (even with -Werror). So we grep stderr for any message
+ # that says an option was ignored or not supported.
+ # When given -MP, icc 7.0 and 7.1 complain thusly:
+ # icc: Command line warning: ignoring option '-M'; no argument required
+ # The diagnosis changed in icc 8.0:
+ # icc: Command line remark: option '-MP' not supported
+ if (grep 'ignoring option' conftest.err ||
+ grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else
+ am_cv_$1_dependencies_compiler_type=$depmode
+ break
+ fi
+ fi
+ done
+
+ cd ..
+ rm -rf conftest.dir
+else
+ am_cv_$1_dependencies_compiler_type=none
+fi
+])
+AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])
+AM_CONDITIONAL([am__fastdep$1], [
+ test "x$enable_dependency_tracking" != xno \
+ && test "$am_cv_$1_dependencies_compiler_type" = gcc3])
+])
+
+
+# AM_SET_DEPDIR
+# -------------
+# Choose a directory name for dependency files.
+# This macro is AC_REQUIREd in _AM_DEPENDENCIES
+AC_DEFUN([AM_SET_DEPDIR],
+[AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl
+])
+
+
+# AM_DEP_TRACK
+# ------------
+AC_DEFUN([AM_DEP_TRACK],
+[AC_ARG_ENABLE(dependency-tracking,
+[ --disable-dependency-tracking speeds up one-time build
+ --enable-dependency-tracking do not reject slow dependency extractors])
+if test "x$enable_dependency_tracking" != xno; then
+ am_depcomp="$ac_aux_dir/depcomp"
+ AMDEPBACKSLASH='\'
+fi
+AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno])
+AC_SUBST([AMDEPBACKSLASH])
+])
+
+# Generate code to set up dependency tracking. -*- Autoconf -*-
+
+# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+#serial 3
+
+# _AM_OUTPUT_DEPENDENCY_COMMANDS
+# ------------------------------
+AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],
+[for mf in $CONFIG_FILES; do
+ # Strip MF so we end up with the name of the file.
+ mf=`echo "$mf" | sed -e 's/:.*$//'`
+ # Check whether this is an Automake generated Makefile or not.
+ # We used to match only the files named `Makefile.in', but
+ # some people rename them; so instead we look at the file content.
+ # Grep'ing the first line is not enough: some people post-process
+ # each Makefile.in and add a new line on top of each file to say so.
+ # So let's grep whole file.
+ if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then
+ dirpart=`AS_DIRNAME("$mf")`
+ else
+ continue
+ fi
+ # Extract the definition of DEPDIR, am__include, and am__quote
+ # from the Makefile without running `make'.
+ DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"`
+ test -z "$DEPDIR" && continue
+ am__include=`sed -n 's/^am__include = //p' < "$mf"`
+ test -z "am__include" && continue
+ am__quote=`sed -n 's/^am__quote = //p' < "$mf"`
+ # When using ansi2knr, U may be empty or an underscore; expand it
+ U=`sed -n 's/^U = //p' < "$mf"`
+ # Find all dependency output files, they are included files with
+ # $(DEPDIR) in their names. We invoke sed twice because it is the
+ # simplest approach to changing $(DEPDIR) to its actual value in the
+ # expansion.
+ for file in `sed -n "
+ s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \
+ sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do
+ # Make sure the directory exists.
+ test -f "$dirpart/$file" && continue
+ fdir=`AS_DIRNAME(["$file"])`
+ AS_MKDIR_P([$dirpart/$fdir])
+ # echo "creating $dirpart/$file"
+ echo '# dummy' > "$dirpart/$file"
+ done
+done
+])# _AM_OUTPUT_DEPENDENCY_COMMANDS
+
+
+# AM_OUTPUT_DEPENDENCY_COMMANDS
+# -----------------------------
+# This macro should only be invoked once -- use via AC_REQUIRE.
+#
+# This code is only required when automatic dependency tracking
+# is enabled. FIXME. This creates each `.P' file that we will
+# need in order to bootstrap the dependency handling code.
+AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
+[AC_CONFIG_COMMANDS([depfiles],
+ [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS],
+ [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"])
+])
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 8
+
+# AM_CONFIG_HEADER is obsolete. It has been replaced by AC_CONFIG_HEADERS.
+AU_DEFUN([AM_CONFIG_HEADER], [AC_CONFIG_HEADERS($@)])
+
+# Do all the work for Automake. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 12
+
+# This macro actually does too much. Some checks are only needed if
+# your package does certain things. But this isn't really a big deal.
+
+# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
+# AM_INIT_AUTOMAKE([OPTIONS])
+# -----------------------------------------------
+# The call with PACKAGE and VERSION arguments is the old style
+# call (pre autoconf-2.50), which is being phased out. PACKAGE
+# and VERSION should now be passed to AC_INIT and removed from
+# the call to AM_INIT_AUTOMAKE.
+# We support both call styles for the transition. After
+# the next Automake release, Autoconf can make the AC_INIT
+# arguments mandatory, and then we can depend on a new Autoconf
+# release and drop the old call support.
+AC_DEFUN([AM_INIT_AUTOMAKE],
+[AC_PREREQ([2.58])dnl
+dnl Autoconf wants to disallow AM_ names. We explicitly allow
+dnl the ones we care about.
+m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl
+AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl
+AC_REQUIRE([AC_PROG_INSTALL])dnl
+# test to see if srcdir already configured
+if test "`cd $srcdir && pwd`" != "`pwd`" &&
+ test -f $srcdir/config.status; then
+ AC_MSG_ERROR([source directory already configured; run "make distclean" there first])
+fi
+
+# test whether we have cygpath
+if test -z "$CYGPATH_W"; then
+ if (cygpath --version) >/dev/null 2>/dev/null; then
+ CYGPATH_W='cygpath -w'
+ else
+ CYGPATH_W=echo
+ fi
+fi
+AC_SUBST([CYGPATH_W])
+
+# Define the identity of the package.
+dnl Distinguish between old-style and new-style calls.
+m4_ifval([$2],
+[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl
+ AC_SUBST([PACKAGE], [$1])dnl
+ AC_SUBST([VERSION], [$2])],
+[_AM_SET_OPTIONS([$1])dnl
+ AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl
+ AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl
+
+_AM_IF_OPTION([no-define],,
+[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package])
+ AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl
+
+# Some tools Automake needs.
+AC_REQUIRE([AM_SANITY_CHECK])dnl
+AC_REQUIRE([AC_ARG_PROGRAM])dnl
+AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version})
+AM_MISSING_PROG(AUTOCONF, autoconf)
+AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version})
+AM_MISSING_PROG(AUTOHEADER, autoheader)
+AM_MISSING_PROG(MAKEINFO, makeinfo)
+AM_PROG_INSTALL_SH
+AM_PROG_INSTALL_STRIP
+AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+# We need awk for the "check" target. The system "awk" is bad on
+# some platforms.
+AC_REQUIRE([AC_PROG_AWK])dnl
+AC_REQUIRE([AC_PROG_MAKE_SET])dnl
+AC_REQUIRE([AM_SET_LEADING_DOT])dnl
+_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],
+ [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],
+ [_AM_PROG_TAR([v7])])])
+_AM_IF_OPTION([no-dependencies],,
+[AC_PROVIDE_IFELSE([AC_PROG_CC],
+ [_AM_DEPENDENCIES(CC)],
+ [define([AC_PROG_CC],
+ defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl
+AC_PROVIDE_IFELSE([AC_PROG_CXX],
+ [_AM_DEPENDENCIES(CXX)],
+ [define([AC_PROG_CXX],
+ defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl
+])
+])
+
+
+# When config.status generates a header, we must update the stamp-h file.
+# This file resides in the same directory as the config header
+# that is generated. The stamp files are numbered to have different names.
+
+# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the
+# loop where config.status creates the headers, so we can generate
+# our stamp files there.
+AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],
+[# Compute $1's index in $config_headers.
+_am_stamp_count=1
+for _am_header in $config_headers :; do
+ case $_am_header in
+ $1 | $1:* )
+ break ;;
+ * )
+ _am_stamp_count=`expr $_am_stamp_count + 1` ;;
+ esac
+done
+echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_SH
+# ------------------
+# Define $install_sh.
+AC_DEFUN([AM_PROG_INSTALL_SH],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+install_sh=${install_sh-"$am_aux_dir/install-sh"}
+AC_SUBST(install_sh)])
+
+# Copyright (C) 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# Check whether the underlying file-system supports filenames
+# with a leading dot. For instance MS-DOS doesn't.
+AC_DEFUN([AM_SET_LEADING_DOT],
+[rm -rf .tst 2>/dev/null
+mkdir .tst 2>/dev/null
+if test -d .tst; then
+ am__leading_dot=.
+else
+ am__leading_dot=_
+fi
+rmdir .tst 2>/dev/null
+AC_SUBST([am__leading_dot])])
+
+# Add --enable-maintainer-mode option to configure. -*- Autoconf -*-
+# From Jim Meyering
+
+# Copyright (C) 1996, 1998, 2000, 2001, 2002, 2003, 2004, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+AC_DEFUN([AM_MAINTAINER_MODE],
+[AC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])
+ dnl maintainer-mode is disabled by default
+ AC_ARG_ENABLE(maintainer-mode,
+[ --enable-maintainer-mode enable make rules and dependencies not useful
+ (and sometimes confusing) to the casual installer],
+ USE_MAINTAINER_MODE=$enableval,
+ USE_MAINTAINER_MODE=no)
+ AC_MSG_RESULT([$USE_MAINTAINER_MODE])
+ AM_CONDITIONAL(MAINTAINER_MODE, [test $USE_MAINTAINER_MODE = yes])
+ MAINT=$MAINTAINER_MODE_TRUE
+ AC_SUBST(MAINT)dnl
+]
+)
+
+AU_DEFUN([jm_MAINTAINER_MODE], [AM_MAINTAINER_MODE])
+
+# Check to see how 'make' treats includes. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# AM_MAKE_INCLUDE()
+# -----------------
+# Check to see how make treats includes.
+AC_DEFUN([AM_MAKE_INCLUDE],
+[am_make=${MAKE-make}
+cat > confinc << 'END'
+am__doit:
+ @echo done
+.PHONY: am__doit
+END
+# If we don't find an include directive, just comment out the code.
+AC_MSG_CHECKING([for style of include used by $am_make])
+am__include="#"
+am__quote=
+_am_result=none
+# First try GNU make style include.
+echo "include confinc" > confmf
+# We grep out `Entering directory' and `Leaving directory'
+# messages which can occur if `w' ends up in MAKEFLAGS.
+# In particular we don't look at `^make:' because GNU make might
+# be invoked under some other name (usually "gmake"), in which
+# case it prints its new name instead of `make'.
+if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then
+ am__include=include
+ am__quote=
+ _am_result=GNU
+fi
+# Now try BSD make style include.
+if test "$am__include" = "#"; then
+ echo '.include "confinc"' > confmf
+ if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then
+ am__include=.include
+ am__quote="\""
+ _am_result=BSD
+ fi
+fi
+AC_SUBST([am__include])
+AC_SUBST([am__quote])
+AC_MSG_RESULT([$_am_result])
+rm -f confinc confmf
+])
+
+# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
+
+# Copyright (C) 1997, 1999, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_MISSING_PROG(NAME, PROGRAM)
+# ------------------------------
+AC_DEFUN([AM_MISSING_PROG],
+[AC_REQUIRE([AM_MISSING_HAS_RUN])
+$1=${$1-"${am_missing_run}$2"}
+AC_SUBST($1)])
+
+
+# AM_MISSING_HAS_RUN
+# ------------------
+# Define MISSING if not defined so far and test if it supports --run.
+# If it does, set am_missing_run to use it, otherwise, to nothing.
+AC_DEFUN([AM_MISSING_HAS_RUN],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing"
+# Use eval to expand $SHELL
+if eval "$MISSING --run true"; then
+ am_missing_run="$MISSING --run "
+else
+ am_missing_run=
+ AC_MSG_WARN([`missing' script is too old or missing])
+fi
+])
+
+# Copyright (C) 2003, 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_MKDIR_P
+# ---------------
+# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise.
+#
+# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories
+# created by `make install' are always world readable, even if the
+# installer happens to have an overly restrictive umask (e.g. 077).
+# This was a mistake. There are at least two reasons why we must not
+# use `-m 0755':
+# - it causes special bits like SGID to be ignored,
+# - it may be too restrictive (some setups expect 775 directories).
+#
+# Do not use -m 0755 and let people choose whatever they expect by
+# setting umask.
+#
+# We cannot accept any implementation of `mkdir' that recognizes `-p'.
+# Some implementations (such as Solaris 8's) are not thread-safe: if a
+# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c'
+# concurrently, both version can detect that a/ is missing, but only
+# one can create it and the other will error out. Consequently we
+# restrict ourselves to GNU make (using the --version option ensures
+# this.)
+AC_DEFUN([AM_PROG_MKDIR_P],
+[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then
+ # We used to keeping the `.' as first argument, in order to
+ # allow $(mkdir_p) to be used without argument. As in
+ # $(mkdir_p) $(somedir)
+ # where $(somedir) is conditionally defined. However this is wrong
+ # for two reasons:
+ # 1. if the package is installed by a user who cannot write `.'
+ # make install will fail,
+ # 2. the above comment should most certainly read
+ # $(mkdir_p) $(DESTDIR)$(somedir)
+ # so it does not work when $(somedir) is undefined and
+ # $(DESTDIR) is not.
+ # To support the latter case, we have to write
+ # test -z "$(somedir)" || $(mkdir_p) $(DESTDIR)$(somedir),
+ # so the `.' trick is pointless.
+ mkdir_p='mkdir -p --'
+else
+ # On NextStep and OpenStep, the `mkdir' command does not
+ # recognize any option. It will interpret all options as
+ # directories to create, and then abort because `.' already
+ # exists.
+ for d in ./-p ./--version;
+ do
+ test -d $d && rmdir $d
+ done
+ # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists.
+ if test -f "$ac_aux_dir/mkinstalldirs"; then
+ mkdir_p='$(mkinstalldirs)'
+ else
+ mkdir_p='$(install_sh) -d'
+ fi
+fi
+AC_SUBST([mkdir_p])])
+
+# Helper functions for option handling. -*- Autoconf -*-
+
+# Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 3
+
+# _AM_MANGLE_OPTION(NAME)
+# -----------------------
+AC_DEFUN([_AM_MANGLE_OPTION],
+[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])
+
+# _AM_SET_OPTION(NAME)
+# ------------------------------
+# Set option NAME. Presently that only means defining a flag for this option.
+AC_DEFUN([_AM_SET_OPTION],
+[m4_define(_AM_MANGLE_OPTION([$1]), 1)])
+
+# _AM_SET_OPTIONS(OPTIONS)
+# ----------------------------------
+# OPTIONS is a space-separated list of Automake options.
+AC_DEFUN([_AM_SET_OPTIONS],
+[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])
+
+# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])
+# -------------------------------------------
+# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.
+AC_DEFUN([_AM_IF_OPTION],
+[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+
+# Check to make sure that the build environment is sane. -*- Autoconf -*-
+
+# Copyright (C) 1996, 1997, 2000, 2001, 2003, 2005
+# Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 4
+
+# AM_SANITY_CHECK
+# ---------------
+AC_DEFUN([AM_SANITY_CHECK],
+[AC_MSG_CHECKING([whether build environment is sane])
+# Just in case
+sleep 1
+echo timestamp > conftest.file
+# Do `set' in a subshell so we don't clobber the current shell's
+# arguments. Must try -L first in case configure is actually a
+# symlink; some systems play weird games with the mod time of symlinks
+# (eg FreeBSD returns the mod time of the symlink's containing
+# directory).
+if (
+ set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null`
+ if test "$[*]" = "X"; then
+ # -L didn't work.
+ set X `ls -t $srcdir/configure conftest.file`
+ fi
+ rm -f conftest.file
+ if test "$[*]" != "X $srcdir/configure conftest.file" \
+ && test "$[*]" != "X conftest.file $srcdir/configure"; then
+
+ # If neither matched, then we have a broken ls. This can happen
+ # if, for instance, CONFIG_SHELL is bash and it inherits a
+ # broken ls alias from the environment. This has actually
+ # happened. Such a system could not be considered "sane".
+ AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken
+alias in your environment])
+ fi
+
+ test "$[2]" = conftest.file
+ )
+then
+ # Ok.
+ :
+else
+ AC_MSG_ERROR([newly created file is older than distributed files!
+Check your system clock])
+fi
+AC_MSG_RESULT(yes)])
+
+# Copyright (C) 2001, 2003, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_PROG_INSTALL_STRIP
+# ---------------------
+# One issue with vendor `install' (even GNU) is that you can't
+# specify the program used to strip binaries. This is especially
+# annoying in cross-compiling environments, where the build's strip
+# is unlikely to handle the host's binaries.
+# Fortunately install-sh will honor a STRIPPROG variable, so we
+# always use install-sh in `make install-strip', and initialize
+# STRIPPROG with the value of the STRIP variable (set by the user).
+AC_DEFUN([AM_PROG_INSTALL_STRIP],
+[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl
+# Installed binaries are usually stripped using `strip' when the user
+# run `make install-strip'. However `strip' might not be the right
+# tool to use in cross-compilation environments, therefore Automake
+# will honor the `STRIP' environment variable to overrule this program.
+dnl Don't test for $cross_compiling = yes, because it might be `maybe'.
+if test "$cross_compiling" != no; then
+ AC_CHECK_TOOL([STRIP], [strip], :)
+fi
+INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s"
+AC_SUBST([INSTALL_STRIP_PROGRAM])])
+
+# Check how to create a tarball. -*- Autoconf -*-
+
+# Copyright (C) 2004, 2005 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# serial 2
+
+# _AM_PROG_TAR(FORMAT)
+# --------------------
+# Check how to create a tarball in format FORMAT.
+# FORMAT should be one of `v7', `ustar', or `pax'.
+#
+# Substitute a variable $(am__tar) that is a command
+# writing to stdout a FORMAT-tarball containing the directory
+# $tardir.
+# tardir=directory && $(am__tar) > result.tar
+#
+# Substitute a variable $(am__untar) that extract such
+# a tarball read from stdin.
+# $(am__untar) < result.tar
+AC_DEFUN([_AM_PROG_TAR],
+[# Always define AMTAR for backward compatibility.
+AM_MISSING_PROG([AMTAR], [tar])
+m4_if([$1], [v7],
+ [am__tar='${AMTAR} chof - "$$tardir"'; am__untar='${AMTAR} xf -'],
+ [m4_case([$1], [ustar],, [pax],,
+ [m4_fatal([Unknown tar format])])
+AC_MSG_CHECKING([how to create a $1 tar archive])
+# Loop over all known methods to create a tar archive until one works.
+_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'
+_am_tools=${am_cv_prog_tar_$1-$_am_tools}
+# Do not fold the above two line into one, because Tru64 sh and
+# Solaris sh will not grok spaces in the rhs of `-'.
+for _am_tool in $_am_tools
+do
+ case $_am_tool in
+ gnutar)
+ for _am_tar in tar gnutar gtar;
+ do
+ AM_RUN_LOG([$_am_tar --version]) && break
+ done
+ am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"'
+ am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"'
+ am__untar="$_am_tar -xf -"
+ ;;
+ plaintar)
+ # Must skip GNU tar: if it does not support --format= it doesn't create
+ # ustar tarball either.
+ (tar --version) >/dev/null 2>&1 && continue
+ am__tar='tar chf - "$$tardir"'
+ am__tar_='tar chf - "$tardir"'
+ am__untar='tar xf -'
+ ;;
+ pax)
+ am__tar='pax -L -x $1 -w "$$tardir"'
+ am__tar_='pax -L -x $1 -w "$tardir"'
+ am__untar='pax -r'
+ ;;
+ cpio)
+ am__tar='find "$$tardir" -print | cpio -o -H $1 -L'
+ am__tar_='find "$tardir" -print | cpio -o -H $1 -L'
+ am__untar='cpio -i -H $1 -d'
+ ;;
+ none)
+ am__tar=false
+ am__tar_=false
+ am__untar=false
+ ;;
+ esac
+
+ # If the value was cached, stop now. We just wanted to have am__tar
+ # and am__untar set.
+ test -n "${am_cv_prog_tar_$1}" && break
+
+ # tar/untar a dummy directory, and stop if the command works
+ rm -rf conftest.dir
+ mkdir conftest.dir
+ echo GrepMe > conftest.dir/file
+ AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])
+ rm -rf conftest.dir
+ if test -s conftest.tar; then
+ AM_RUN_LOG([$am__untar <conftest.tar])
+ grep GrepMe conftest.dir/file >/dev/null 2>&1 && break
+ fi
+done
+rm -rf conftest.dir
+
+AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])
+AC_MSG_RESULT([$am_cv_prog_tar_$1])])
+AC_SUBST([am__tar])
+AC_SUBST([am__untar])
+]) # _AM_PROG_TAR
+
+m4_include([acinclude.m4])
diff --git a/config.h.in b/config.h.in
new file mode 100644
index 0000000..7021c5a
--- /dev/null
+++ b/config.h.in
@@ -0,0 +1,261 @@
+/* config.h.in. Generated from configure.in by autoheader. */
+
+/* Define to 1 if you have the <Carbon/Carbon.h> header file. */
+#undef HAVE_CARBON_CARBON_H
+
+/* Define if you have the CoreAudio API */
+#undef HAVE_COREAUDIO
+
+/* Define to 1 if you have the <crt_externs.h> header file. */
+#undef HAVE_CRT_EXTERNS_H
+
+/* Defines if your system has the crypt function */
+#undef HAVE_CRYPT
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#undef HAVE_DLFCN_H
+
+/* DPMS extension available */
+#undef HAVE_DPMS
+
+/* DVB headers installed */
+#undef HAVE_DVB
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#undef HAVE_INTTYPES_H
+
+/* Define if you have libjpeg */
+#undef HAVE_LIBJPEG
+
+/* Define if you have libpng */
+#undef HAVE_LIBPNG
+
+/* Define if you have a working libpthread (will enable threaded code) */
+#undef HAVE_LIBPTHREAD
+
+/* Define if you have libz */
+#undef HAVE_LIBZ
+
+/* Define to 1 if you have the <memory.h> header file. */
+#undef HAVE_MEMORY_H
+
+/* Define if your system needs _NSGetEnviron to set up the environment */
+#undef HAVE_NSGETENVIRON
+
+/* Define if you have res_init */
+#undef HAVE_RES_INIT
+
+/* Define if you have the res_init prototype */
+#undef HAVE_RES_INIT_PROTO
+
+/* Define if you have a STL implementation by SGI */
+#undef HAVE_SGI_STL
+
+/* Define to 1 if you have the `snprintf' function. */
+#undef HAVE_SNPRINTF
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#undef HAVE_STDINT_H
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#undef HAVE_STDLIB_H
+
+/* Define to 1 if you have the <strings.h> header file. */
+#undef HAVE_STRINGS_H
+
+/* Define to 1 if you have the <string.h> header file. */
+#undef HAVE_STRING_H
+
+/* Define if you have strlcat */
+#undef HAVE_STRLCAT
+
+/* Define if you have the strlcat prototype */
+#undef HAVE_STRLCAT_PROTO
+
+/* Define if you have strlcpy */
+#undef HAVE_STRLCPY
+
+/* Define if you have the strlcpy prototype */
+#undef HAVE_STRLCPY_PROTO
+
+/* Define to 1 if you have the <sys/bitypes.h> header file. */
+#undef HAVE_SYS_BITYPES_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#undef HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#undef HAVE_SYS_TYPES_H
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#undef HAVE_UNISTD_H
+
+/* Define to 1 if you have the `vsnprintf' function. */
+#undef HAVE_VSNPRINTF
+
+/* xcb available */
+#undef HAVE_XCB
+
+/* Xinerama extension available */
+#undef HAVE_XINERAMA
+
+/* XTest extension available */
+#undef HAVE_XTEST
+
+/* Suffix for lib directories */
+#undef KDELIBSUFF
+
+/* Name of package */
+#undef PACKAGE
+
+/* Define to the address where bug reports for this package should be sent. */
+#undef PACKAGE_BUGREPORT
+
+/* Define to the full name of this package. */
+#undef PACKAGE_NAME
+
+/* Define to the full name and version of this package. */
+#undef PACKAGE_STRING
+
+/* Define to the one symbol short name of this package. */
+#undef PACKAGE_TARNAME
+
+/* Define to the version of this package. */
+#undef PACKAGE_VERSION
+
+/* The size of `char *', as computed by sizeof. */
+#undef SIZEOF_CHAR_P
+
+/* The size of `int', as computed by sizeof. */
+#undef SIZEOF_INT
+
+/* The size of `long', as computed by sizeof. */
+#undef SIZEOF_LONG
+
+/* The size of `short', as computed by sizeof. */
+#undef SIZEOF_SHORT
+
+/* The size of `size_t', as computed by sizeof. */
+#undef SIZEOF_SIZE_T
+
+/* The size of `unsigned long', as computed by sizeof. */
+#undef SIZEOF_UNSIGNED_LONG
+
+/* Define to 1 if you have the ANSI C header files. */
+#undef STDC_HEADERS
+
+/* If we use arts volume */
+#undef USE_ARTS
+
+/* Version number of package */
+#undef VERSION
+
+/* Defined if compiling without arts */
+#undef WITHOUT_ARTS
+
+/* workaround buggy X server */
+#undef XINIT_WKRND
+
+/*
+ * jpeg.h needs HAVE_BOOLEAN, when the system uses boolean in system
+ * headers and I'm too lazy to write a configure test as long as only
+ * unixware is related
+ */
+#ifdef _UNIXWARE
+#define HAVE_BOOLEAN
+#endif
+
+
+
+/*
+ * AIX defines FD_SET in terms of bzero, but fails to include <strings.h>
+ * that defines bzero.
+ */
+
+#if defined(_AIX)
+#include <strings.h>
+#endif
+
+
+
+#if defined(HAVE_NSGETENVIRON) && defined(HAVE_CRT_EXTERNS_H)
+# include <sys/time.h>
+# include <crt_externs.h>
+# define environ (*_NSGetEnviron())
+#endif
+
+
+
+#if !defined(HAVE_RES_INIT_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+int res_init(void);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+#if !defined(HAVE_STRLCAT_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+unsigned long strlcat(char*, const char*, unsigned long);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+#if !defined(HAVE_STRLCPY_PROTO)
+#ifdef __cplusplus
+extern "C" {
+#endif
+unsigned long strlcpy(char*, const char*, unsigned long);
+#ifdef __cplusplus
+}
+#endif
+#endif
+
+
+
+/*
+ * On HP-UX, the declaration of vsnprintf() is needed every time !
+ */
+
+#if !defined(HAVE_VSNPRINTF) || defined(hpux)
+#if __STDC__
+#include <stdarg.h>
+#include <stdlib.h>
+#else
+#include <varargs.h>
+#endif
+#ifdef __cplusplus
+extern "C"
+#endif
+int vsnprintf(char *str, size_t n, char const *fmt, va_list ap);
+#ifdef __cplusplus
+extern "C"
+#endif
+int snprintf(char *str, size_t n, char const *fmt, ...);
+#endif
+
+
+/* define to 1 if -fvisibility is supported */
+#undef __KDE_HAVE_GCC_VISIBILITY
+
+
+#if defined(__SVR4) && !defined(__svr4__)
+#define __svr4__ 1
+#endif
+
+
+/* type to use in place of socklen_t if not defined */
+#undef kde_socklen_t
+
+/* type to use in place of socklen_t if not defined (deprecated, use
+ kde_socklen_t) */
+#undef ksize_t
diff --git a/configure.files b/configure.files
new file mode 100644
index 0000000..cb9328a
--- /dev/null
+++ b/configure.files
@@ -0,0 +1,4 @@
+./admin/configure.in.min
+configure.in.in
+./kaffeine/configure.in.bot
+./kaffeine/configure.in.in
diff --git a/configure.in b/configure.in
new file mode 100644
index 0000000..d3bff45
--- /dev/null
+++ b/configure.in
@@ -0,0 +1,509 @@
+dnl =======================================================
+dnl FILE: ./admin/configure.in.min
+dnl =======================================================
+
+dnl This file is part of the KDE libraries/packages
+dnl Copyright (C) 2001 Stephan Kulow (coolo@kde.org)
+
+dnl This file is free software; you can redistribute it and/or
+dnl modify it under the terms of the GNU Library General Public
+dnl License as published by the Free Software Foundation; either
+dnl version 2 of the License, or (at your option) any later version.
+
+dnl This library is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+dnl Library General Public License for more details.
+
+dnl You should have received a copy of the GNU Library General Public License
+dnl along with this library; see the file COPYING.LIB. If not, write to
+dnl the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+dnl Boston, MA 02110-1301, USA.
+
+# Original Author was Kalle@kde.org
+# I lifted it in some mater. (Stephan Kulow)
+# I used much code from Janos Farkas
+
+dnl Process this file with autoconf to produce a configure script.
+
+AC_INIT(acinclude.m4) dnl a source file from your sub dir
+
+dnl This is so we can use kde-common
+AC_CONFIG_AUX_DIR(admin)
+
+dnl This ksh/zsh feature conflicts with `cd blah ; pwd`
+unset CDPATH
+
+dnl Checking host/target/build systems, for make, install etc.
+AC_CANONICAL_SYSTEM
+dnl Perform program name transformation
+AC_ARG_PROGRAM
+
+dnl Automake doc recommends to do this only here. (Janos)
+AM_INIT_AUTOMAKE(kaffeine, 0.8.5) dnl searches for some needed programs
+
+AM_MAINTAINER_MODE
+
+KDE_SET_PREFIX
+
+dnl generate the config header
+AM_CONFIG_HEADER(config.h) dnl at the distribution this done
+
+dnl Checks for programs.
+AC_CHECK_COMPILERS
+AC_ENABLE_SHARED(yes)
+AC_ENABLE_STATIC(no)
+KDE_PROG_LIBTOOL
+
+dnl for NLS support. Call them in this order!
+dnl WITH_NLS is for the po files
+AM_KDE_WITH_NLS
+
+KDE_USE_QT(3.3)
+AC_PATH_KDE
+dnl =======================================================
+dnl FILE: configure.in.in
+dnl =======================================================
+
+#MIN_CONFIG(3.3)
+
+KDE_ENABLE_HIDDEN_VISIBILITY
+
+dnl PACKAGE set before
+
+AM_MAINTAINER_MODE
+
+CXXFLAGS="$CXXFLAGS $KDE_DEFAULT_CXXFLAGS"
+
+if test "$build_arts" = "yes"; then
+ AC_DEFINE(USE_ARTS, 1, [If we use arts volume])
+ LIB_ARTS="-lartskde"
+ AC_SUBST(LIB_ARTS)
+fi
+
+KDE_INIT_DOXYGEN([The API Reference], [Version $VERSION])
+
+dnl =======================================================
+dnl FILE: ./kaffeine/configure.in.in
+dnl =======================================================
+
+dnl -----------
+dnl basic stuff
+dnl -----------
+
+KDE_ENABLE_HIDDEN_VISIBILITY
+
+AC_ARG_VAR([PKG_CONFIG], [Path to pkg-config])
+
+if test -z "$PKG_CONFIG" ; then
+ PKG_CONFIG="pkg-config"
+fi
+
+AC_MSG_CHECKING([for pkg-config])
+
+if ! "$PKG_CONFIG" --version ; then
+ echo ""
+ echo "---------------------------------------------------------------------"
+ echo "ERROR: Could not find pkg-config. Make sure it is in your path or set"
+ echo "the PKG_CONFIG environment variable to the full path to pkg-config."
+ echo "---------------------------------------------------------------------"
+ echo ""
+ AC_MSG_ERROR([could not find pkg-config])
+fi
+
+AC_ARG_WITH([xinit-workaround],
+ [AS_HELP_STRING([--with-xinit-workaround],
+ [use this flag if Kaffeine hangs at startup and you are using XFree86 4.4 or X.Org 6.7.0])],,
+ [with_xinit_workaround=no])
+
+if test "$with_xinit_workaround" = "yes" ; then
+ AC_DEFINE([XINIT_WKRND],,[workaround buggy X server])
+fi
+
+dnl ------------------------
+dnl check for DPMS extension
+dnl ------------------------
+
+AC_ARG_WITH([dpms], [AS_HELP_STRING([--without-dpms], [build without DPMS support])],,
+ [with_dpms=yes])
+
+CFLAGS_DPMS=""
+LIB_DPMS=""
+
+if test "$with_dpms" != "no" ; then
+ AC_MSG_CHECKING([for DPMS extension])
+
+ if "$PKG_CONFIG" --exists xext ; then
+ with_dpms=yes
+ CFLAGS_DPMS=`"$PKG_CONFIG" --cflags xext`
+ LIB_DPMS=`"$PKG_CONFIG" --libs xext`
+ AC_DEFINE([HAVE_DPMS],,[DPMS extension available])
+ AC_MSG_RESULT([yes])
+ else
+ with_dpms=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_DPMS])
+AC_SUBST([LIB_DPMS])
+
+dnl -------------------------
+dnl check for XTest extension
+dnl -------------------------
+
+AC_ARG_WITH([xtest], [AS_HELP_STRING([--without-xtest], [build without XTest support])],,
+ [with_xtest=yes])
+
+CFLAGS_XTEST=""
+LIB_XTEST=""
+
+if test "$with_xtest" != "no" ; then
+ AC_MSG_CHECKING([for XTest extension])
+
+ if "$PKG_CONFIG" --exists xtst ; then
+ with_xtest=yes
+ CFLAGS_XTEST=`"$PKG_CONFIG" --cflags xtst`
+ LIB_XTEST=`"$PKG_CONFIG" --libs xtst`
+ AC_DEFINE([HAVE_XTEST],,[XTest extension available])
+ AC_MSG_RESULT([yes])
+ else
+ with_xtest=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_XTEST])
+AC_SUBST([LIB_XTEST])
+
+dnl ----------------------------
+dnl check for Xinerama extension
+dnl ----------------------------
+
+AC_ARG_WITH([xinerama], [AS_HELP_STRING([--without-xinerama], [build without Xinerama support])],,
+ [with_xinerama=yes])
+
+CFLAGS_XINERAMA=""
+LIB_XINERAMA=""
+
+if test "$with_xinerama" != "no" ; then
+ AC_MSG_CHECKING([for Xinerama extension])
+
+ if "$PKG_CONFIG" --exists xinerama ; then
+ with_xinerama=yes
+ CFLAGS_XINERAMA=`"$PKG_CONFIG" --cflags xinerama`
+ LIB_XINERAMA=`"$PKG_CONFIG" --libs xinerama`
+ AC_DEFINE([HAVE_XINERAMA],,[Xinerama extension available])
+ AC_MSG_RESULT([yes])
+ else
+ with_xinerama=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_XINERAMA])
+AC_SUBST([LIB_XINERAMA])
+
+dnl ------------------
+dnl check for xine-lib
+dnl ------------------
+
+AC_MSG_CHECKING([for xine-lib])
+
+CFLAGS_XINE=""
+LIB_XINE=""
+
+if "$PKG_CONFIG" --exists "libxine >= 1.1.9" ; then
+ CFLAGS_XINE=`"$PKG_CONFIG" --cflags libxine`
+ LIB_XINE=`"$PKG_CONFIG" --libs libxine`
+ AC_MSG_RESULT([yes])
+else
+ AC_MSG_RESULT([no])
+
+ echo ""
+ echo "---------------------------------------"
+ echo "ERROR: Could not find xine-lib >= 1.1.9"
+ echo "---------------------------------------"
+ echo ""
+
+ AC_MSG_ERROR([could not find xine-lib])
+fi
+
+AC_SUBST([CFLAGS_XINE])
+AC_SUBST([LIB_XINE])
+
+dnl -------------
+dnl check for xcb
+dnl -------------
+
+AC_ARG_WITH([xcb], [AS_HELP_STRING([--without-xcb], [disable xcb support (not recommended)])],,
+ [with_xcb=yes])
+
+AC_MSG_CHECKING([for xcb and xine-lib >= 1.1.9])
+
+CFLAGS_XCB=""
+LIB_XCB=""
+
+if test "$with_xcb" != "no" ; then
+ if "$PKG_CONFIG" --exists "xcb >= 1.0" ; then
+ with_xcb=yes
+ CFLAGS_XCB=`"$PKG_CONFIG" --cflags xcb`
+ LIB_XCB=`"$PKG_CONFIG" --libs xcb`
+ AC_DEFINE([HAVE_XCB],,[xcb available])
+ AC_MSG_RESULT([yes])
+ else
+ with_xcb=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_XCB])
+AC_SUBST([LIB_XCB])
+
+AM_CONDITIONAL([with_xcb], [test "$with_xcb" = "yes"])
+
+dnl ---------------------
+dnl check for DVB headers
+dnl ---------------------
+
+AC_ARG_WITH([dvb], [AS_HELP_STRING([--without-dvb], [build without DVB support])],,
+ [with_dvb=yes])
+
+if test "$with_dvb" != "no" ; then
+ KDE_CHECK_HEADER([linux/dvb/frontend.h], [with_dvb=yes]
+ [AC_DEFINE([HAVE_DVB],,[DVB headers installed])], [with_dvb=no])
+fi
+
+AM_CONDITIONAL([with_dvb], [test "$with_dvb" = "yes"])
+
+dnl -------------------
+dnl check for gstreamer
+dnl -------------------
+
+AC_ARG_WITH([gstreamer], [AS_HELP_STRING([--without-gstreamer], [disable GStreamer player part])],,
+ [with_gstreamer=yes])
+
+CFLAGS_GSTREAMER=""
+LIB_GSTREAMER=""
+
+if test "$with_gstreamer" != "no" ; then
+ AC_MSG_CHECKING([for GStreamer])
+
+ if "$PKG_CONFIG" --exists "gstreamer-0.10 gstreamer-plugins-base-0.10"; then
+ with_gstreamer=yes
+ CFLAGS_GSTREAMER=`"$PKG_CONFIG" --cflags gstreamer-0.10 gstreamer-plugins-base-0.10`
+ LIB_GSTREAMER=`"$PKG_CONFIG" --libs gstreamer-0.10 gstreamer-plugins-base-0.10`
+ AC_MSG_RESULT([yes])
+ else
+ with_gstreamer=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_GSTREAMER])
+AC_SUBST([LIB_GSTREAMER])
+
+AM_CONDITIONAL([with_gstreamer], [test "$with_gstreamer" = "yes"])
+
+dnl --------------------
+dnl check for cdparanoia
+dnl --------------------
+
+KDE_CHECK_HEADER([cdda_interface.h], [with_cdparanoia=yes], [with_cdparanoia=no])
+
+if test "$with_cdparanoia" != "yes" ; then
+ echo ""
+ echo "-----------------------------------------"
+ echo "ERROR: Could not find cdparanoia headers."
+ echo "-----------------------------------------"
+ echo ""
+
+ AC_MSG_ERROR([could not find cdparanoia headers])
+fi
+
+dnl ----------------------------
+dnl check for Ogg Vorbis encoder
+dnl ----------------------------
+
+AC_ARG_WITH([oggvorbis], [AS_HELP_STRING([--without-oggvorbis], [build without Ogg Vorbis support])],,
+ [with_oggvorbis=yes])
+
+CFLAGS_OGGVORBIS=""
+LIB_OGGVORBIS=""
+
+if test "$with_oggvorbis" != "no" ; then
+ AC_MSG_CHECKING([for Ogg/Vorbis encoder])
+
+ if "$PKG_CONFIG" --exists vorbisenc ; then
+ with_oggvorbis=yes
+ CFLAGS_OGGVORBIS=`"$PKG_CONFIG" --cflags vorbisenc`
+ LIB_OGGVORBIS=`"$PKG_CONFIG" --libs vorbisenc`
+ AC_MSG_RESULT([yes])
+ else
+ with_oggvorbis=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_OGGVORBIS])
+AC_SUBST([LIB_OGGVORBIS])
+
+AM_CONDITIONAL([with_oggvorbis], [test "$with_oggvorbis" = "yes"])
+
+dnl --------------
+dnl check for LAME
+dnl --------------
+
+AC_ARG_WITH([lame], [AS_HELP_STRING([--without-lame], [build without LAME support])],,
+ [with_lame=yes])
+
+LIB_LAME=""
+
+if test "$with_lame" != "no" ; then
+ KDE_CHECK_HEADER([lame/lame.h], [with_lame=yes], [with_lame=no])
+fi
+
+if test "$with_lame" = "yes" ; then
+ KDE_CHECK_LIB([mp3lame], [lame_init], [LIB_LAME="-lmp3lame"], [with_lame=no], [-lm])
+fi
+
+AC_SUBST([LIB_LAME])
+
+AM_CONDITIONAL([with_lame], [test "$with_lame" = "yes"])
+KDE_CREATE_SUBDIRSLIST
+AM_CONDITIONAL(doc_SUBDIR_included, test "x$doc_SUBDIR_included" = xyes)
+AM_CONDITIONAL(kaffeine_SUBDIR_included, test "x$kaffeine_SUBDIR_included" = xyes)
+AM_CONDITIONAL(po_SUBDIR_included, test "x$po_SUBDIR_included" = xyes)
+AC_CONFIG_FILES([ Makefile ])
+AC_CONFIG_FILES([ doc/Makefile ])
+AC_CONFIG_FILES([ doc/kaffeine/Makefile ])
+AC_CONFIG_FILES([ kaffeine/Makefile ])
+AC_CONFIG_FILES([ kaffeine/images/Makefile ])
+AC_CONFIG_FILES([ kaffeine/mimetypes/Makefile ])
+AC_CONFIG_FILES([ kaffeine/mimetypes/application/Makefile ])
+AC_CONFIG_FILES([ kaffeine/protocols/Makefile ])
+AC_CONFIG_FILES([ kaffeine/servicemenus/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/audiobrowser/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/disc/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/disc/plugins/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/disc/plugins/mp3lame/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/disc/plugins/oggvorbis/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvb/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvb/lib/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvb/lib/libdvbapi/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvb/lib/libdvben50221/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvb/lib/libucsi/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvb/lib/libucsi/dvb/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvb/lib/libucsi/mpeg/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvb/plugins/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvb/plugins/epg/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvb/plugins/stream/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/input/dvbclient/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/player-parts/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/player-parts/dummy-part/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/player-parts/gstreamer-part/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/player-parts/kaffeine-part/Makefile ])
+AC_CONFIG_FILES([ kaffeine/src/player-parts/xine-part/Makefile ])
+AC_CONFIG_FILES([ po/Makefile ])
+AC_OUTPUT
+echo ""
+echo "-------------------------------------------------------"
+echo "Kaffeine configure results:"
+echo ""
+
+if test "$with_xcb" = "yes" ; then
+ echo "Build with xcb support: yes"
+else
+ echo "Build with xcb support: no"
+ echo "IMPORTANT: this is strongly discouraged"
+fi
+
+if test "$with_dpms" = "yes" ; then
+ echo "Build with DPMS support: yes"
+else
+ echo "Build with DPMS support: no"
+fi
+
+if test "$with_xtest" = "yes" ; then
+ echo "Build with XTest support: yes"
+else
+ echo "Build with XTest support: no"
+fi
+
+if test "$with_xinerama" = "yes" ; then
+ echo "Build with Xinerama support: yes"
+else
+ echo "Build with Xinerama support: no"
+fi
+
+if test "$with_dvb" = "yes" ; then
+ echo "Build with DVB support: yes"
+else
+ echo "Build with DVB support: no"
+fi
+
+if test "$with_gstreamer" = "yes" ; then
+ echo "Build GStreamer player part: yes"
+ echo "IMPORTANT: the GStreamer player part is experimental"
+else
+ echo "Build GStreamer player-part: no"
+fi
+
+if test "$with_oggvorbis" = "yes" ; then
+ echo "Build Ogg Vorbis encoder plugin: yes"
+else
+ echo "Build Ogg Vorbis encoder plugin: no"
+fi
+
+if test "$with_lame" = "yes" ; then
+ echo "Build LAME encoder plugin: yes"
+else
+ echo "Build LAME encoder plugin: no"
+fi
+# Check if KDE_SET_PREFIX was called, and --prefix was passed to configure
+if test -n "$kde_libs_prefix" -a -n "$given_prefix"; then
+ # And if so, warn when they don't match
+ if test "$kde_libs_prefix" != "$given_prefix"; then
+ # And if kde doesn't know about the prefix yet
+ echo ":"`kde-config --path exe`":" | grep ":$given_prefix/bin/:" 2>&1 >/dev/null
+ if test $? -ne 0; then
+ echo ""
+ echo "Warning: you chose to install this package in $given_prefix,"
+ echo "but KDE was found in $kde_libs_prefix."
+ echo "For this to work, you will need to tell KDE about the new prefix, by ensuring"
+ echo "that KDEDIRS contains it, e.g. export KDEDIRS=$given_prefix:$kde_libs_prefix"
+ echo "Then restart KDE."
+ echo ""
+ fi
+ fi
+fi
+
+if test x$GXX = "xyes" -a x$kde_have_gcc_visibility = "xyes" -a x$kde_cv_val_qt_gcc_visibility_patched = "xno"; then
+ echo ""
+ echo "Your GCC supports symbol visibility, but the patch for Qt supporting visibility"
+ echo "was not included. Therefore, GCC symbol visibility support remains disabled."
+ echo ""
+ echo "For better performance, consider including the Qt visibility supporting patch"
+ echo "located at:"
+ echo ""
+ echo "http://bugs.kde.org/show_bug.cgi?id=109386"
+ echo ""
+ echo "and recompile all of Qt and KDE. Note, this is entirely optional and"
+ echo "everything will continue to work just fine without it."
+ echo ""
+fi
+
+if test "$all_tests" = "bad"; then
+ if test ! "$cache_file" = "/dev/null"; then
+ echo ""
+ echo "Please remove the file $cache_file after changing your setup"
+ echo "so that configure will find the changes next time."
+ echo ""
+ fi
+else
+ echo ""
+ echo "Good - your configure finished. Start make now"
+ echo ""
+fi
diff --git a/configure.in.in b/configure.in.in
new file mode 100644
index 0000000..824efd6
--- /dev/null
+++ b/configure.in.in
@@ -0,0 +1,18 @@
+#MIN_CONFIG(3.3)
+
+KDE_ENABLE_HIDDEN_VISIBILITY
+
+AM_INIT_AUTOMAKE(kaffeine, 0.8.5)
+
+AM_MAINTAINER_MODE
+
+CXXFLAGS="$CXXFLAGS $KDE_DEFAULT_CXXFLAGS"
+
+if test "$build_arts" = "yes"; then
+ AC_DEFINE(USE_ARTS, 1, [If we use arts volume])
+ LIB_ARTS="-lartskde"
+ AC_SUBST(LIB_ARTS)
+fi
+
+KDE_INIT_DOXYGEN([The API Reference], [Version $VERSION])
+
diff --git a/doc/Makefile.am b/doc/Makefile.am
new file mode 100644
index 0000000..6812bd2
--- /dev/null
+++ b/doc/Makefile.am
@@ -0,0 +1,5 @@
+
+KDE_LANG = en
+KDE_DOCS = AUTO
+SUBDIRS = $(AUTODIRS)
+
diff --git a/doc/kaffeine/Makefile.am b/doc/kaffeine/Makefile.am
new file mode 100644
index 0000000..220b1f5
--- /dev/null
+++ b/doc/kaffeine/Makefile.am
@@ -0,0 +1,5 @@
+
+KDE_LANG = en
+KDE_DOCS = kaffeine
+
+
diff --git a/doc/kaffeine/discwindow.png b/doc/kaffeine/discwindow.png
new file mode 100644
index 0000000..3690fc0
--- /dev/null
+++ b/doc/kaffeine/discwindow.png
Binary files differ
diff --git a/doc/kaffeine/dvbbroadcast.png b/doc/kaffeine/dvbbroadcast.png
new file mode 100644
index 0000000..92f1181
--- /dev/null
+++ b/doc/kaffeine/dvbbroadcast.png
Binary files differ
diff --git a/doc/kaffeine/dvbclient.png b/doc/kaffeine/dvbclient.png
new file mode 100644
index 0000000..c780765
--- /dev/null
+++ b/doc/kaffeine/dvbclient.png
Binary files differ
diff --git a/doc/kaffeine/dvbconfig.png b/doc/kaffeine/dvbconfig.png
new file mode 100644
index 0000000..66cd07a
--- /dev/null
+++ b/doc/kaffeine/dvbconfig.png
Binary files differ
diff --git a/doc/kaffeine/dvbepg.png b/doc/kaffeine/dvbepg.png
new file mode 100644
index 0000000..ab16367
--- /dev/null
+++ b/doc/kaffeine/dvbepg.png
Binary files differ
diff --git a/doc/kaffeine/dvblive.jpg b/doc/kaffeine/dvblive.jpg
new file mode 100644
index 0000000..0d6948f
--- /dev/null
+++ b/doc/kaffeine/dvblive.jpg
Binary files differ
diff --git a/doc/kaffeine/dvbscan.png b/doc/kaffeine/dvbscan.png
new file mode 100644
index 0000000..5143f19
--- /dev/null
+++ b/doc/kaffeine/dvbscan.png
Binary files differ
diff --git a/doc/kaffeine/dvbtimers.png b/doc/kaffeine/dvbtimers.png
new file mode 100644
index 0000000..dbfa976
--- /dev/null
+++ b/doc/kaffeine/dvbtimers.png
Binary files differ
diff --git a/doc/kaffeine/dvbwin.png b/doc/kaffeine/dvbwin.png
new file mode 100644
index 0000000..2150238
--- /dev/null
+++ b/doc/kaffeine/dvbwin.png
Binary files differ
diff --git a/doc/kaffeine/gstpart.png b/doc/kaffeine/gstpart.png
new file mode 100644
index 0000000..d3f60ca
--- /dev/null
+++ b/doc/kaffeine/gstpart.png
Binary files differ
diff --git a/doc/kaffeine/index.docbook b/doc/kaffeine/index.docbook
new file mode 100644
index 0000000..8532031
--- /dev/null
+++ b/doc/kaffeine/index.docbook
@@ -0,0 +1,796 @@
+<?xml version="1.0" ?>
+<!DOCTYPE book PUBLIC "-//KDE//DTD DocBook XML V4.1.2-Based Variant V1.0//EN" "dtd/kdex.dtd" [
+ <!-- Define an entity for your application if it is not part of KDE
+ CVS -->
+ <!ENTITY kaffeine "<application>Kaffeine</application>">
+ <!ENTITY kappname "&kaffeine;"><!-- replace kmyapplication here
+ do *not* replace kappname-->
+ <!ENTITY package "kde-module"><!-- kdebase, kdeadmin, etc. Leave
+ this unchanged if your
+ application is not maintained in KDE CVS -->
+ <!ENTITY % addindex "IGNORE">
+ <!ENTITY % English "INCLUDE"> <!-- ONLY If you are writing non-English
+ original documentation, change
+ the language here -->
+]>
+
+<book lang="&language;">
+
+
+<bookinfo>
+<title>&kaffeine; 0.8 Handbook</title>
+
+<authorgroup>
+<author>
+<firstname>Jürgen</firstname>
+<othername></othername>
+<surname>Kofler</surname>
+<affiliation>
+<address><email>kaffeine@gmx.net</email></address>
+</affiliation>
+</author>
+<author>
+<firstname>Christophe</firstname>
+<othername></othername>
+<surname>Thommeret</surname>
+<affiliation>
+<address><email>hftom@free.fr</email></address>
+</affiliation>
+</author>
+</authorgroup>
+
+<!-- TRANS:ROLES_OF_TRANSLATORS -->
+
+<copyright>
+<year>2004</year>
+<year>2006</year>
+<holder>The Kaffeine Authors</holder>
+</copyright>
+<!-- Translators: put here the copyright notice of the translation -->
+<!-- Put here the FDL notice. Read the explanation in fdl-notice.docbook
+ and in the FDL itself on how to use it. -->
+<legalnotice>&FDLNotice;</legalnotice>
+
+<!-- Date and version information of the documentation
+Don't forget to include this last date and this last revision number, we
+need them for translation coordination !
+Please respect the format of the date (DD/MM/YYYY) and of the version
+(V.MM.LL), it could be used by automation scripts.
+Do NOT change these in the translation. -->
+
+<date>13/03/2006</date>
+<releaseinfo>0.08.00</releaseinfo>
+
+<!-- Abstract about this handbook -->
+
+<abstract>
+<para>
+A Media Player for KDE. <ulink url="http://kaffeine.sourceforge.net">http://kaffeine.sourceforge.net</ulink>
+</para>
+</abstract>
+
+<!-- This is a set of Keywords for indexing by search engines.
+Please at least include KDE, the KDE package it is in, the name
+ of your application, and a few relevant keywords. -->
+
+<keywordset>
+<keyword>kaffeine</keyword>
+<keyword>xine</keyword>
+<keyword>video</keyword>
+<keyword>audio</keyword>
+<keyword>mp3</keyword>
+</keywordset>
+
+</bookinfo>
+
+<!-- The contents of the documentation begin here. Label
+each chapter so with the id attribute. This is necessary for two reasons: it
+allows you to easily reference the chapter from other chapters of your
+document, and if there is no ID, the name of the generated HTML files will vary
+from time to time making it hard to manage for maintainers and for the CVS
+system. Any chapter labelled (OPTIONAL) may be left out at the author's
+discretion. Other chapters should not be left out in order to maintain a
+consistent documentation style across all KDE apps. -->
+
+
+<chapter id="kaffeine-app">
+<title>Kaffeine Shell</title>
+
+<sect1 id="startwindow">
+<title>The Start Window</title>
+
+<screenshot>
+<screeninfo>Start Window</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="startwindow.png" format="PNG"/>
+ </imageobject>
+
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>Provides fast access to the most important media sources.
+</para>
+
+</sect1>
+
+<sect1 id="playlistwindow">
+<title>The Playlist Window</title>
+
+<screenshot>
+<screeninfo>&kaffeine; Playlist Window</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="playlistwin.png" format="PNG"/>
+ </imageobject>
+
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>Kaffeine supports multiple playlists. Choose the active one with the "Playlist" selector. You can easily drag some files or folders from the file browser and drop it on the playlist to enqueue or drop it on the player window to create a new playlist. To change playlist name edit it and confirm with <keycap>Return</keycap>.
+</para>
+<para>You can find all playlist related functions in the <guimenu>Playlist</guimenu>-Menu and the context-menu (right-click on playlist).
+</para>
+
+</sect1>
+
+<sect1 id="disctwindow">
+<title>The Discs Window</title>
+
+<screenshot>
+<screeninfo>&kaffeine; Discs Window</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="discwindow.png" format="PNG"/>
+ </imageobject>
+
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>Here you can start Audio CD, DVD or VCD. You can even rip and encode audio tracks to be stored on your hard disk.
+</para>
+
+</sect1>
+
+<sect1 id="dvbwindow">
+<title>The DVB Window</title>
+
+<screenshot>
+<screeninfo>DVB Window</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="dvbwin.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>Kaffeine supports Digital Video Broadcasting devices supported by linuxtv drivers. This window is only visible if Kaffeine find a DVB device at startup. If you have a DVB device and Kaffeine doesn't find it, make sure the driver is loaded and your device recognized. (Further information can be found at www.linuxtv.org)
+</para>
+<remark>You can arrange your channels in categories. To create a new category, right click in the icon view to get a popup menu. Now, drag a channel name and drop it on the desired category' icon. To remove a channel from a category, drop it on the "All" icon. Right click on an icon to delete that category or change icon.</remark>
+<para>You can find all DVB related functions in the <guimenu>DVB</guimenu>-Menu.
+</para>
+
+<sect2 id="dvbconfig">
+<title>Configuration</title>
+
+<screenshot>
+<screeninfo>Configuration</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="dvbconfig.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>Select <guimenu>Menu->DVB->Configure DVB...</guimenu> to open the DVB config dialog. In order to get your device(s) working in Kaffeine, you have to choose a "source" in the list. If you have a DISEqC switch, choose a source for each satellite.
+</para>
+<para>The <guilabel>Recording</guilabel> page allow you to choose where programs are saved to disk.
+</para>
+</sect2>
+
+<sect2 id="dvbscan">
+<title>Getting channels</title>
+
+<screenshot>
+<screeninfo>Channels</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="dvbscan.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>Open the <guilabel>Channels</guilabel> dialog from the <guimenu>DVB</guimenu>-Menu. There, click the <guilabel>Start scan</guilabel> button to start scanning the network for available channels. This can take a while, so be patient ... When done, select the channels you want to add to your channels list and click <guilabel>Add selected</guilabel> or use the filters and click <guilabel>Add filtered</guilabel> (e.g. check "Free to air" and "TV" to add all fta TV).
+</para>
+<para>When added to channels list, channels are automatically assigned a number. To change this number, right click on the channel name and choose <guilabel>Edit ...</guilabel> from the popup menu. This number will allow you to zap using keypad.
+</para>
+<remark>Note that you can also change the channel number in the DVB window. Select the channel then click on the number to edit.</remark>
+</sect2>
+
+<sect2 id="live">
+<title>Viewing live</title>
+
+<screenshot>
+<screeninfo>Live TV</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="dvblive.jpg" format="JPEG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>To zap to a channel, you can either double-click on a channel name in the DVB window or use keypad (or remote control with kdelirc) to enter the channel number. Entered digit are displayed in the top left corner of the Player window. You can also hit pageUp/pageDown to zap to previous/next.
+</para>
+<para>You can now see your favorite program. Kaffeine also displays some informations about this channel using OSD. You can later hit "O" to see it again. (Hit "O" twice to display current program description).
+</para>
+<para>Now, what if your phone suddenly ring and you absolutely don't want to miss this crucial moment of the movie ? Don't worry. Just hit <guilabel>pause</guilabel>. Kaffeine will pause and immediately start to save the stream to your harddisk. Later, hit <guilabel>play</guilabel> and the program will continue from where you left it. To return to live, just rezap to this channel.
+</para>
+<remark>Note that live DVB only works with the xine engine (called "Kaffeine"). <guimenu>Menu->Settings->Engine->Kaffeine</guimenu>.</remark>
+</sect2>
+
+<sect2 id="epg">
+<title>Electronic Program Guide</title>
+
+<screenshot>
+<screeninfo>EPG</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="dvbepg.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para><guimenu>Menu->DVB->EPG...</guimenu> brings up the Electronic Program Guide window, displaying current/next programs. Left click on an entry to display the detailed description of the program. Scheduled events for a given channel are displayed when you right click on one of the channel entry and select <guimenu>View all programs</guimenu> from the context menu.
+</para>
+<para>Double click on an entry to zap to that channel.
+</para>
+<remark>Note that you have first to zap to some channels in order to get EPG.</remark>
+</sect2>
+
+<sect2 id="recording">
+<title>Recording</title>
+
+<screenshot>
+<screeninfo>Recording</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="dvbtimers.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>Kaffeine offers you several way of recording.
+</para>
+<para>When you are viewing a live program, you can simply choose <guimenu>Menu->DVB->Instant record</guimenu> to immediately start recording this program. The duration is defined in the <guilabel>Recording</guilabel> page of the DVB config dialog, but you can modify it on the fly from the Timers dialog (<guimenu>Menu->DVB->Timers...</guimenu>). Just select the program and click <guilabel>Edit</guilabel> button to change the duration.
+</para>
+<para>You can also create a timer from the EPG window. Right click on a program entry and select <guimenu>Add to timers</guimenu> from the context menu. In this case, the timer is created using <guilabel>Begin margin</guilabel> and <guilabel>End margin</guilabel> defined in the <guilabel>Recording</guilabel> page of the DVB config dialog. So, start time is set to [start time given by EPG]-[begin margin] and duration is set to [duration given by EPG]+[begin margin]+[end margin].
+</para>
+<para>Finally, you can create a new timer by hand. Open the Timers dialog, click on the <guilabel>New</guilabel> button and fill in required informations.
+</para>
+<para>Note that all timers can be deleted, even if running. Open the Timers dialog, select the program and click the <guilabel>Delete</guilabel> button. Of course, deleting a running timer doesn't delete the file on the disk.
+</para>
+<remark>You can view and/or record several channels at the same time on the same multiplex. Note that the priority is always given to timers, so if you are viewing a live show and a timer is to be started on a different multiplex, live will be stopped to allow recording.</remark>
+<para></para>
+<remark>Be aware that a DVB stream is about 1.5GB/hour.</remark>
+</sect2>
+
+<sect2 id="replay">
+<title>Playing a record</title>
+
+<para>Simply open the file and Kaffeine will start playing. That's all !
+</para>
+</sect2>
+
+<sect2 id="broadcasting">
+<title>Broadcasting</title>
+
+<screenshot>
+<screeninfo>Broadcasting</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="dvbbroadcast.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>Kaffeine can broadcast several DVB channels (being on the same multiplex) on a lan.
+</para>
+<para>Open the DVB config dialog and go to the <guilabel>Broadcasting</guilabel> page to set address and ports.
+</para>
+<para><guimenu>Menu->DVB->Broadcasting...</guimenu> opens the broadcasting editor. Select a channel in the <guilabel>Available channels</guilabel> list, and click the <guilabel>Add</guilabel> button to add it to the <guilabel>Broadcasting list</guilabel>. The <guilabel>Available channels</guilabel> list is now filled with channels on the same multiplex. You can now use multi-selection to add channels. Click <guilabel>OK</guilabel> button to start broadcasting.
+</para>
+<para>To stop broadcasting, open the dialog and click <guilabel>OK</guilabel> with an empty list.
+</para>
+<remark>Note that the priority is always given to timers, so if you are broadcasting and a timer is to be started on a different multiplex, broadcasting will be stopped to allow recording. And broadcasting has a higher priority than live.</remark>
+</sect2>
+
+</sect1>
+
+<sect1 id="dvbclientwindow">
+<title>The DVB Client Window</title>
+
+<screenshot>
+<screeninfo>DVB Client Window</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="dvbclient.png" format="PNG"/>
+ </imageobject>
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>To enable DVB client, you have to check the box in the Kaffeine configuration dialog. There you must also set address and ports. It will create a new tab labeled <guilabel>Dvb client</guilabel> showing a list of actually broadcasted channels (if any). Double click on a channel name to start playing it. DVB client also support time shifting (just hit pause).
+</para>
+</sect1>
+
+</chapter>
+
+<chapter id="player-parts">
+<title>Player Parts</title>
+
+<para>You'll find all available player parts in <guimenu>Settings</guimenu>-<guimenuitem>Player Engine</guimenuitem>.
+</para>
+
+<sect1 id="kaffeine-part">
+<title>The Kaffeine Part</title>
+
+<screenshot>
+<screeninfo>Kaffeine-Part</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="kaffeinepart.png" format="PNG"/>
+ </imageobject>
+
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>This is the default, xine based, full featured player part for Kaffeine. Plays almost everything...</para>
+
+<sect2 id="about-xine">
+<title>About xine</title>
+
+<para>
+ xine is a free multimedia player. It plays back CDs, DVDs, and VCDs.
+ It also decodes multimedia files like AVI, MOV, WMV, and MP3 from local disk drives, and displays multimedia streamed over the Internet.
+ It interprets many of the most common multimedia formats available - and some of the most uncommon formats, too.
+ Detailed info about xine features: <ulink url="http://www.xinehq.de">
+http://www.xinehq.de</ulink>
+</para>
+
+</sect2>
+
+</sect1>
+
+<sect1 id="gstreamer-part">
+<title>The GStreamer Part</title>
+
+<screenshot>
+<screeninfo>GStreamer-Part</screeninfo>
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="gstpart.png" format="PNG"/>
+ </imageobject>
+
+ <textobject>
+ <phrase>Screenshot</phrase>
+ </textobject>
+ </mediaobject>
+</screenshot>
+
+<para>A simple player part based on GStreamer. GStreamer homepage: <ulink url="http://gstreamer.freedesktop.org">
+http://gstreamer.freedesktop.org</ulink>
+</para>
+
+</sect1>
+
+</chapter>
+
+<chapter id="cmdline-options">
+<title>Command Line Options</title>
+
+<para>Usage:</para>
+<cmdsynopsis>
+<command>kaffeine</command>
+<group choice="opt">
+<option>f</option>
+<option>p</option><option>w</option>
+<option>a</option><option>x</option>
+<option>d</option>
+</group>
+<arg>--fullscreen</arg>
+<arg>--play</arg>
+<arg>--audiodriver</arg>
+<arg>--videodriver</arg>
+<arg>--device</arg>
+<arg>--verbose</arg>
+<arg>--wizard</arg>
+<arg rep="repeat"><replaceable>file</replaceable></arg>
+</cmdsynopsis>
+
+<para></para>
+
+<informaltable>
+<tgroup cols="2">
+<tbody>
+
+<row><entry><para><option>-f,--fullscreen</option></para></entry>
+<entry><para>Starts &kaffeine; in fullscreen mode.
+</para></entry>
+</row>
+<row>
+<entry><para><option>-p,--play</option></para></entry>
+<entry><para>Starts with last played track.
+</para></entry>
+</row>
+<row>
+<entry><para><option>-a,--audiodriver (argument)</option></para></entry>
+<entry><para>Sets the audio driver. Arguments can be: alsa, arts, oss, ...
+</para></entry>
+</row>
+<row>
+<entry><para><option>-x,--videodriver (argument)</option></para></entry>
+<entry><para>Sets the video driver. Arguments can be: xv, xshm, dxr3 ,...
+</para></entry>
+</row>
+<row>
+<entry><para><option>-d,--device (argument)</option></para></entry>
+<entry><para>Sets the Audio-CD/VCD/DVD path to (argument).
+</para></entry>
+</row>
+<row>
+<entry><para><option>--verbose</option></para></entry>
+<entry><para>Outputs more debug messages.
+</para></entry>
+</row>
+<row><entry><para><option>-w,--wizard</option></para></entry>
+<entry><para>Runs installation wizard.
+</para></entry>
+</row>
+<row>
+<entry><para><option>file...</option></para></entry>
+<entry><para>Files to play. Can be local files, a directory, an URL or "AudioCD", "VCD", "DVD".
+</para></entry>
+</row>
+</tbody>
+</tgroup>
+</informaltable>
+
+</chapter>
+
+<chapter id="dcop-interface">
+<title>The DCOP Interface</title>
+
+<sect1 id="dcop-overview">
+<title>Overview</title>
+<para>You can use the DCOP interface in two kinds: From inside another application with <function>KApplication::dcopClient()->send( "kaffeine", "KaffeineIface", "pause()" )</function>
+or from command line with <command>dcop kaffeine KaffeineIface openURL best_song_of_the_world.mp3</command>.
+</para>
+</sect1>
+
+<sect1 id="dcop-functions">
+<title>Functions</title>
+
+<sect2 id="kaffeineiface">
+<title>KaffeineIface Object</title>
+
+<informaltable>
+<tgroup cols="2">
+<tbody>
+
+<row>
+<entry><para><function>void openURL(QString URL)</function></para></entry>
+<entry><para>Opens and plays the given URL.</para></entry>
+</row>
+<row>
+<entry><para><function>void appendURL(QString URL)</function></para></entry>
+<entry><para>Appends the URL to current playlist.</para></entry>
+</row>
+<row>
+<entry><para><function>void playAudioCD()</function></para></entry>
+<entry><para>Starts playing Audio CD.</para></entry>
+</row>
+<row>
+<entry><para><function>void playVCD()</function></para></entry>
+<entry><para>Starts playing Video CD.</para></entry>
+</row>
+<row>
+<entry><para><function>void playDVD()</function></para></entry>
+<entry><para>Starts playing DVD.</para></entry>
+</row>
+<row><entry><para><function>void play()</function></para></entry>
+<entry><para>(Re)Starts playback.</para></entry>
+</row>
+<row><entry><para><function>bool isPlaying()</function></para></entry>
+<entry><para>Returns "true" or "false" on command line.</para></entry>
+</row>
+<row><entry><para><function>void pause()</function></para></entry>
+<entry><para>Toggles pause/playback.</para></entry>
+</row>
+<row><entry><para><function>void next()</function></para></entry>
+<entry><para>Plays next playlist entry/chapter/DVB channel.</para></entry>
+</row>
+<row><entry><para><function>void previous()</function></para></entry>
+<entry><para>Plays previous playlist entry/chapter/DVB channel.</para></entry>
+</row>
+<row><entry><para><function>void stop()</function></para></entry>
+<entry><para>Stops playback.</para></entry>
+</row>
+<row><entry><para><function>QString title()</function></para></entry>
+<entry><para>Returns the title of the current track.</para></entry>
+</row>
+<row><entry><para><function>QString getFileName()</function></para></entry>
+<entry><para>Returns filename of current track.</para></entry>
+</row>
+<row><entry><para><function>int getLength()</function></para></entry>
+<entry><para>Returns length of current track in seconds.</para></entry>
+</row>
+<row><entry><para><function>int getTimePos()</function></para></entry>
+<entry><para>Returns current stream position in seconds.</para></entry>
+</row>
+<row><entry><para><function>void quit()</function></para></entry>
+<entry><para>Quits Kaffeine.</para></entry>
+</row>
+<row><entry><para><function>void random()</function></para></entry>
+<entry><para>Toggles between random and normal play.</para></entry>
+</row>
+<row><entry><para><function>void fullscreen()</function></para></entry>
+<entry><para>Toggles between fullscreen and windowed mode.</para></entry>
+</row>
+<row><entry><para><function>void posPlus()</function></para></entry>
+<entry><para>Increases stream position.</para></entry>
+</row>
+<row><entry><para><function>void posMinus()</function></para></entry>
+<entry><para>Decreases stream position.</para></entry>
+</row>
+<row><entry><para><function>void volUp()</function></para></entry>
+<entry><para>Increases volume.</para></entry>
+</row>
+<row><entry><para><function>void volDown()</function></para></entry>
+<entry><para>Decreases volume.</para></entry>
+</row>
+<row><entry><para><function>void mute()</function></para></entry>
+<entry><para>Toggles mute on/off.</para></entry>
+</row>
+<row><entry><para><function>void setNumber(int number)</function></para></entry>
+<entry><para>Select DVB channel/playlist entry by number.</para></entry>
+</row>
+<row><entry><para><function>void dvbOSD()</function></para></entry>
+<entry><para>Toggles DVB-OSD on/off.</para></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+</sect2>
+
+<sect2 id="kaffeinepartiface">
+<title>KaffeinePartIface Object</title>
+
+<informaltable>
+<tgroup cols="2">
+<tbody>
+
+<row>
+<entry><para><function>int getContrast()</function></para></entry>
+<entry><para>Returns current contrast.</para></entry>
+</row>
+<row>
+<entry><para><function>void setContrast(int contrast)</function></para></entry>
+<entry><para>Sets contrast (0..65535).</para></entry>
+</row>
+<row>
+<entry><para><function>int getBrightness()</function></para></entry>
+<entry><para>Returns current brightness.</para></entry>
+</row>
+<row>
+<entry><para><function>void setBrightness(int brightness)</function></para></entry>
+<entry><para>Sets brightness (0..65535).</para></entry>
+</row>
+<row>
+<entry><para><function>void dvdMenuUp()</function></para></entry>
+<entry><para>DVD Menu: Cursor up.</para></entry>
+</row>
+<row>
+<entry><para><function>void dvdMenuDown()</function></para></entry>
+<entry><para>DVD Menu: Cursor down.</para></entry>
+</row>
+<row>
+<entry><para><function>void dvdMenuLeft()</function></para></entry>
+<entry><para>DVD Menu: Cursor left.</para></entry>
+</row>
+<row>
+<entry><para><function>void dvdMenuRight()</function></para></entry>
+<entry><para>DVD Menu: Cursor right.</para></entry>
+</row>
+<row>
+<entry><para><function>void dvdMenuSelect()</function></para></entry>
+<entry><para>DVD Menu: Selects the menu item pointed by the cursor.</para></entry>
+</row>
+<row>
+<entry><para><function>void dvdMenuToggle()</function></para></entry>
+<entry><para>Toggles DVD menu on/off.</para></entry>
+</row>
+<row>
+<entry><para><function>void aspectRatioAuto()</function></para></entry>
+<entry><para>Automatic aspect ratio.</para></entry>
+</row>
+<row>
+<entry><para><function>void aspectRatio4_3()</function></para></entry>
+<entry><para>Sets aspect ratio to 4:3.</para></entry>
+</row>
+<row>
+<entry><para><function>void aspectRatioAnamorphic()</function></para></entry>
+<entry><para>Sets aspect ratio to 16:9.</para></entry>
+</row>
+<row>
+<entry><para><function>void aspectRatioSquare()</function></para></entry>
+<entry><para>Sets aspect ratio to 1:1.</para></entry>
+</row>
+<row>
+<entry><para><function>void aspectRatioDVB()</function></para></entry>
+<entry><para>Sets aspect ratio to 2.11:1.</para></entry>
+</row>
+<row>
+<entry><para><function>void zoomIn()</function></para></entry>
+<entry><para>Zooms picture in.</para></entry>
+</row>
+<row>
+<entry><para><function>void zoomOut()</function></para></entry>
+<entry><para>Zooms picture out.</para></entry>
+</row>
+<row>
+<entry><para><function>void zoomOff()</function></para></entry>
+<entry><para>Disables zoom.</para></entry>
+</row>
+
+</tbody>
+</tgroup>
+</informaltable>
+
+</sect2>
+</sect1>
+</chapter>
+
+<chapter id="keybindings">
+<title>Keybindings</title>
+
+<para>You can configure shortcuts using <guimenu>Settings</guimenu>-<guimenuitem>Configure Shortcuts</guimenuitem>.
+</para>
+
+</chapter>
+
+
+<chapter id="faq">
+<title>Questions and Answers</title>
+
+
+<para>
+<ulink url="http://kaffeine.sourceforge.net/index.php?page=faq">Kaffeine-FAQ</ulink>
+</para>
+<para>
+<ulink url="http://xinehq.de/index.php/faq">xine-FAQ</ulink>
+</para>
+
+<para>For Questions use the <ulink url="http://lists.sourceforge.net/lists/listinfo/kaffeine-user">kaffeine-user mailinglist</ulink>.
+(First check the <ulink url="http://sourceforge.net/mailarchive/forum.php?forum_id=34875">archive</ulink>
+ if the question is still answered.)
+</para>
+
+
+</chapter>
+
+<chapter id="bug">
+<title>Reporting BUGS</title>
+
+<para>
+Before you report a bug, please first make sure the bug has not been reported
+yet in the bug tracking system at <ulink url="http://www.sourceforge.net/projects/kaffeine">http://www.sourceforge.net/projects/kaffeine</ulink>.
+Also have a look into the mailinglist <ulink url="http://sourceforge.net/mailarchive/forum.php?forum_id=34875">archive</ulink>.
+</para>
+
+<para>
+Please use only the tracking system on sourceforge for reporting bugs and log in before
+submitting (if you've a sourceforge account).
+</para>
+
+<para>
+When you submit a bug, please include all of the following information:
+
+<itemizedlist>
+<listitem><para>versions of Kaffeine, xine, KDE, X11</para></listitem>
+<listitem><para>the backtrace from KDE's Crash Manager</para></listitem>
+<listitem><para>console output (you can use --verbose to get more)</para></listitem>
+</itemizedlist>
+
+</para>
+
+</chapter>
+
+<chapter id="credits">
+<title>Copyright and License</title>
+
+<para>
+Program copyright 2003-2005, The Kaffeine Authors
+</para>
+
+
+<para>
+Documentation copyright 2003-2005, Jürgen Kofler <email>kaffeine@gmx.net</email>, Christophe Thommeret <email>hftom@free.fr</email>
+</para>
+
+<!-- TRANS:CREDIT_FOR_TRANSLATORS -->
+
+&underFDL; <!-- FDL: do not remove. Commercial development should -->
+<!-- replace this with their copyright and either remove it or re-set this.-->
+
+<!-- Determine which license your application is licensed under,
+ and delete all the remaining licenses below:
+
+ (NOTE: All documentation are licensed under the FDL,
+ regardless of what license the application uses) -->
+
+&underGPL; <!-- GPL License -->
+
+
+</chapter>
+
+&documentation.index;
+</book>
+<!--
+Local Variables:
+mode: sgml
+sgml-minimize-attributes:nil
+sgml-general-insert-case:lower
+sgml-indent-step:0
+sgml-indent-data:nil
+End:
+-->
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/doc/kaffeine/kaffeinepart.png b/doc/kaffeine/kaffeinepart.png
new file mode 100644
index 0000000..fe108b7
--- /dev/null
+++ b/doc/kaffeine/kaffeinepart.png
Binary files differ
diff --git a/doc/kaffeine/playlistwin.png b/doc/kaffeine/playlistwin.png
new file mode 100644
index 0000000..9c6a283
--- /dev/null
+++ b/doc/kaffeine/playlistwin.png
Binary files differ
diff --git a/doc/kaffeine/startwindow.png b/doc/kaffeine/startwindow.png
new file mode 100644
index 0000000..bfdfa83
--- /dev/null
+++ b/doc/kaffeine/startwindow.png
Binary files differ
diff --git a/kaffeine/BUGS b/kaffeine/BUGS
new file mode 100644
index 0000000..238c6ad
--- /dev/null
+++ b/kaffeine/BUGS
@@ -0,0 +1,19 @@
+
+
+******************************
+* Reporting Kaffeine BUGS *
+******************************
+
+Before you report a bug, please first make sure the bug has not been reported
+yet in the bug tracking system at http://sourceforge.net/tracker/?atid=581406&group_id=86937&func=browse
+Also look into the kaffeine-user archive: http://sourceforge.net/mailarchive/forum.php?forum_id=34875
+
+Please use only the tracking system on sourceforge for reporting bugs and log in before
+submitting (if you've a sourceforge account).
+
+
+When you submit a bug, please include all of the following information:
+
+ - versions of Kaffeine, xine, KDE, X11
+ - the backtrace from KDE's Crash Manager
+ - console output
diff --git a/kaffeine/COPYING-DOCS b/kaffeine/COPYING-DOCS
new file mode 100644
index 0000000..4a0fe1c
--- /dev/null
+++ b/kaffeine/COPYING-DOCS
@@ -0,0 +1,397 @@
+ GNU Free Documentation License
+ Version 1.2, November 2002
+
+
+ Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+0. PREAMBLE
+
+The purpose of this License is to make a manual, textbook, or other
+functional and useful document "free" in the sense of freedom: to
+assure everyone the effective freedom to copy and redistribute it,
+with or without modifying it, either commercially or noncommercially.
+Secondarily, this License preserves for the author and publisher a way
+to get credit for their work, while not being considered responsible
+for modifications made by others.
+
+This License is a kind of "copyleft", which means that derivative
+works of the document must themselves be free in the same sense. It
+complements the GNU General Public License, which is a copyleft
+license designed for free software.
+
+We have designed this License in order to use it for manuals for free
+software, because free software needs free documentation: a free
+program should come with manuals providing the same freedoms that the
+software does. But this License is not limited to software manuals;
+it can be used for any textual work, regardless of subject matter or
+whether it is published as a printed book. We recommend this License
+principally for works whose purpose is instruction or reference.
+
+
+1. APPLICABILITY AND DEFINITIONS
+
+This License applies to any manual or other work, in any medium, that
+contains a notice placed by the copyright holder saying it can be
+distributed under the terms of this License. Such a notice grants a
+world-wide, royalty-free license, unlimited in duration, to use that
+work under the conditions stated herein. The "Document", below,
+refers to any such manual or work. Any member of the public is a
+licensee, and is addressed as "you". You accept the license if you
+copy, modify or distribute the work in a way requiring permission
+under copyright law.
+
+A "Modified Version" of the Document means any work containing the
+Document or a portion of it, either copied verbatim, or with
+modifications and/or translated into another language.
+
+A "Secondary Section" is a named appendix or a front-matter section of
+the Document that deals exclusively with the relationship of the
+publishers or authors of the Document to the Document's overall subject
+(or to related matters) and contains nothing that could fall directly
+within that overall subject. (Thus, if the Document is in part a
+textbook of mathematics, a Secondary Section may not explain any
+mathematics.) The relationship could be a matter of historical
+connection with the subject or with related matters, or of legal,
+commercial, philosophical, ethical or political position regarding
+them.
+
+The "Invariant Sections" are certain Secondary Sections whose titles
+are designated, as being those of Invariant Sections, in the notice
+that says that the Document is released under this License. If a
+section does not fit the above definition of Secondary then it is not
+allowed to be designated as Invariant. The Document may contain zero
+Invariant Sections. If the Document does not identify any Invariant
+Sections then there are none.
+
+The "Cover Texts" are certain short passages of text that are listed,
+as Front-Cover Texts or Back-Cover Texts, in the notice that says that
+the Document is released under this License. A Front-Cover Text may
+be at most 5 words, and a Back-Cover Text may be at most 25 words.
+
+A "Transparent" copy of the Document means a machine-readable copy,
+represented in a format whose specification is available to the
+general public, that is suitable for revising the document
+straightforwardly with generic text editors or (for images composed of
+pixels) generic paint programs or (for drawings) some widely available
+drawing editor, and that is suitable for input to text formatters or
+for automatic translation to a variety of formats suitable for input
+to text formatters. A copy made in an otherwise Transparent file
+format whose markup, or absence of markup, has been arranged to thwart
+or discourage subsequent modification by readers is not Transparent.
+An image format is not Transparent if used for any substantial amount
+of text. A copy that is not "Transparent" is called "Opaque".
+
+Examples of suitable formats for Transparent copies include plain
+ASCII without markup, Texinfo input format, LaTeX input format, SGML
+or XML using a publicly available DTD, and standard-conforming simple
+HTML, PostScript or PDF designed for human modification. Examples of
+transparent image formats include PNG, XCF and JPG. Opaque formats
+include proprietary formats that can be read and edited only by
+proprietary word processors, SGML or XML for which the DTD and/or
+processing tools are not generally available, and the
+machine-generated HTML, PostScript or PDF produced by some word
+processors for output purposes only.
+
+The "Title Page" means, for a printed book, the title page itself,
+plus such following pages as are needed to hold, legibly, the material
+this License requires to appear in the title page. For works in
+formats which do not have any title page as such, "Title Page" means
+the text near the most prominent appearance of the work's title,
+preceding the beginning of the body of the text.
+
+A section "Entitled XYZ" means a named subunit of the Document whose
+title either is precisely XYZ or contains XYZ in parentheses following
+text that translates XYZ in another language. (Here XYZ stands for a
+specific section name mentioned below, such as "Acknowledgements",
+"Dedications", "Endorsements", or "History".) To "Preserve the Title"
+of such a section when you modify the Document means that it remains a
+section "Entitled XYZ" according to this definition.
+
+The Document may include Warranty Disclaimers next to the notice which
+states that this License applies to the Document. These Warranty
+Disclaimers are considered to be included by reference in this
+License, but only as regards disclaiming warranties: any other
+implication that these Warranty Disclaimers may have is void and has
+no effect on the meaning of this License.
+
+
+2. VERBATIM COPYING
+
+You may copy and distribute the Document in any medium, either
+commercially or noncommercially, provided that this License, the
+copyright notices, and the license notice saying this License applies
+to the Document are reproduced in all copies, and that you add no other
+conditions whatsoever to those of this License. You may not use
+technical measures to obstruct or control the reading or further
+copying of the copies you make or distribute. However, you may accept
+compensation in exchange for copies. If you distribute a large enough
+number of copies you must also follow the conditions in section 3.
+
+You may also lend copies, under the same conditions stated above, and
+you may publicly display copies.
+
+
+3. COPYING IN QUANTITY
+
+If you publish printed copies (or copies in media that commonly have
+printed covers) of the Document, numbering more than 100, and the
+Document's license notice requires Cover Texts, you must enclose the
+copies in covers that carry, clearly and legibly, all these Cover
+Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
+the back cover. Both covers must also clearly and legibly identify
+you as the publisher of these copies. The front cover must present
+the full title with all words of the title equally prominent and
+visible. You may add other material on the covers in addition.
+Copying with changes limited to the covers, as long as they preserve
+the title of the Document and satisfy these conditions, can be treated
+as verbatim copying in other respects.
+
+If the required texts for either cover are too voluminous to fit
+legibly, you should put the first ones listed (as many as fit
+reasonably) on the actual cover, and continue the rest onto adjacent
+pages.
+
+If you publish or distribute Opaque copies of the Document numbering
+more than 100, you must either include a machine-readable Transparent
+copy along with each Opaque copy, or state in or with each Opaque copy
+a computer-network location from which the general network-using
+public has access to download using public-standard network protocols
+a complete Transparent copy of the Document, free of added material.
+If you use the latter option, you must take reasonably prudent steps,
+when you begin distribution of Opaque copies in quantity, to ensure
+that this Transparent copy will remain thus accessible at the stated
+location until at least one year after the last time you distribute an
+Opaque copy (directly or through your agents or retailers) of that
+edition to the public.
+
+It is requested, but not required, that you contact the authors of the
+Document well before redistributing any large number of copies, to give
+them a chance to provide you with an updated version of the Document.
+
+
+4. MODIFICATIONS
+
+You may copy and distribute a Modified Version of the Document under
+the conditions of sections 2 and 3 above, provided that you release
+the Modified Version under precisely this License, with the Modified
+Version filling the role of the Document, thus licensing distribution
+and modification of the Modified Version to whoever possesses a copy
+of it. In addition, you must do these things in the Modified Version:
+
+A. Use in the Title Page (and on the covers, if any) a title distinct
+ from that of the Document, and from those of previous versions
+ (which should, if there were any, be listed in the History section
+ of the Document). You may use the same title as a previous version
+ if the original publisher of that version gives permission.
+B. List on the Title Page, as authors, one or more persons or entities
+ responsible for authorship of the modifications in the Modified
+ Version, together with at least five of the principal authors of the
+ Document (all of its principal authors, if it has fewer than five),
+ unless they release you from this requirement.
+C. State on the Title page the name of the publisher of the
+ Modified Version, as the publisher.
+D. Preserve all the copyright notices of the Document.
+E. Add an appropriate copyright notice for your modifications
+ adjacent to the other copyright notices.
+F. Include, immediately after the copyright notices, a license notice
+ giving the public permission to use the Modified Version under the
+ terms of this License, in the form shown in the Addendum below.
+G. Preserve in that license notice the full lists of Invariant Sections
+ and required Cover Texts given in the Document's license notice.
+H. Include an unaltered copy of this License.
+I. Preserve the section Entitled "History", Preserve its Title, and add
+ to it an item stating at least the title, year, new authors, and
+ publisher of the Modified Version as given on the Title Page. If
+ there is no section Entitled "History" in the Document, create one
+ stating the title, year, authors, and publisher of the Document as
+ given on its Title Page, then add an item describing the Modified
+ Version as stated in the previous sentence.
+J. Preserve the network location, if any, given in the Document for
+ public access to a Transparent copy of the Document, and likewise
+ the network locations given in the Document for previous versions
+ it was based on. These may be placed in the "History" section.
+ You may omit a network location for a work that was published at
+ least four years before the Document itself, or if the original
+ publisher of the version it refers to gives permission.
+K. For any section Entitled "Acknowledgements" or "Dedications",
+ Preserve the Title of the section, and preserve in the section all
+ the substance and tone of each of the contributor acknowledgements
+ and/or dedications given therein.
+L. Preserve all the Invariant Sections of the Document,
+ unaltered in their text and in their titles. Section numbers
+ or the equivalent are not considered part of the section titles.
+M. Delete any section Entitled "Endorsements". Such a section
+ may not be included in the Modified Version.
+N. Do not retitle any existing section to be Entitled "Endorsements"
+ or to conflict in title with any Invariant Section.
+O. Preserve any Warranty Disclaimers.
+
+If the Modified Version includes new front-matter sections or
+appendices that qualify as Secondary Sections and contain no material
+copied from the Document, you may at your option designate some or all
+of these sections as invariant. To do this, add their titles to the
+list of Invariant Sections in the Modified Version's license notice.
+These titles must be distinct from any other section titles.
+
+You may add a section Entitled "Endorsements", provided it contains
+nothing but endorsements of your Modified Version by various
+parties--for example, statements of peer review or that the text has
+been approved by an organization as the authoritative definition of a
+standard.
+
+You may add a passage of up to five words as a Front-Cover Text, and a
+passage of up to 25 words as a Back-Cover Text, to the end of the list
+of Cover Texts in the Modified Version. Only one passage of
+Front-Cover Text and one of Back-Cover Text may be added by (or
+through arrangements made by) any one entity. If the Document already
+includes a cover text for the same cover, previously added by you or
+by arrangement made by the same entity you are acting on behalf of,
+you may not add another; but you may replace the old one, on explicit
+permission from the previous publisher that added the old one.
+
+The author(s) and publisher(s) of the Document do not by this License
+give permission to use their names for publicity for or to assert or
+imply endorsement of any Modified Version.
+
+
+5. COMBINING DOCUMENTS
+
+You may combine the Document with other documents released under this
+License, under the terms defined in section 4 above for modified
+versions, provided that you include in the combination all of the
+Invariant Sections of all of the original documents, unmodified, and
+list them all as Invariant Sections of your combined work in its
+license notice, and that you preserve all their Warranty Disclaimers.
+
+The combined work need only contain one copy of this License, and
+multiple identical Invariant Sections may be replaced with a single
+copy. If there are multiple Invariant Sections with the same name but
+different contents, make the title of each such section unique by
+adding at the end of it, in parentheses, the name of the original
+author or publisher of that section if known, or else a unique number.
+Make the same adjustment to the section titles in the list of
+Invariant Sections in the license notice of the combined work.
+
+In the combination, you must combine any sections Entitled "History"
+in the various original documents, forming one section Entitled
+"History"; likewise combine any sections Entitled "Acknowledgements",
+and any sections Entitled "Dedications". You must delete all sections
+Entitled "Endorsements".
+
+
+6. COLLECTIONS OF DOCUMENTS
+
+You may make a collection consisting of the Document and other documents
+released under this License, and replace the individual copies of this
+License in the various documents with a single copy that is included in
+the collection, provided that you follow the rules of this License for
+verbatim copying of each of the documents in all other respects.
+
+You may extract a single document from such a collection, and distribute
+it individually under this License, provided you insert a copy of this
+License into the extracted document, and follow this License in all
+other respects regarding verbatim copying of that document.
+
+
+7. AGGREGATION WITH INDEPENDENT WORKS
+
+A compilation of the Document or its derivatives with other separate
+and independent documents or works, in or on a volume of a storage or
+distribution medium, is called an "aggregate" if the copyright
+resulting from the compilation is not used to limit the legal rights
+of the compilation's users beyond what the individual works permit.
+When the Document is included in an aggregate, this License does not
+apply to the other works in the aggregate which are not themselves
+derivative works of the Document.
+
+If the Cover Text requirement of section 3 is applicable to these
+copies of the Document, then if the Document is less than one half of
+the entire aggregate, the Document's Cover Texts may be placed on
+covers that bracket the Document within the aggregate, or the
+electronic equivalent of covers if the Document is in electronic form.
+Otherwise they must appear on printed covers that bracket the whole
+aggregate.
+
+
+8. TRANSLATION
+
+Translation is considered a kind of modification, so you may
+distribute translations of the Document under the terms of section 4.
+Replacing Invariant Sections with translations requires special
+permission from their copyright holders, but you may include
+translations of some or all Invariant Sections in addition to the
+original versions of these Invariant Sections. You may include a
+translation of this License, and all the license notices in the
+Document, and any Warranty Disclaimers, provided that you also include
+the original English version of this License and the original versions
+of those notices and disclaimers. In case of a disagreement between
+the translation and the original version of this License or a notice
+or disclaimer, the original version will prevail.
+
+If a section in the Document is Entitled "Acknowledgements",
+"Dedications", or "History", the requirement (section 4) to Preserve
+its Title (section 1) will typically require changing the actual
+title.
+
+
+9. TERMINATION
+
+You may not copy, modify, sublicense, or distribute the Document except
+as expressly provided for under this License. Any other attempt to
+copy, modify, sublicense or distribute the Document is void, and will
+automatically terminate your rights under this License. However,
+parties who have received copies, or rights, from you under this
+License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+
+10. FUTURE REVISIONS OF THIS LICENSE
+
+The Free Software Foundation may publish new, revised versions
+of the GNU Free Documentation License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns. See
+http://www.gnu.org/copyleft/.
+
+Each version of the License is given a distinguishing version number.
+If the Document specifies that a particular numbered version of this
+License "or any later version" applies to it, you have the option of
+following the terms and conditions either of that specified version or
+of any later version that has been published (not as a draft) by the
+Free Software Foundation. If the Document does not specify a version
+number of this License, you may choose any version ever published (not
+as a draft) by the Free Software Foundation.
+
+
+ADDENDUM: How to use this License for your documents
+
+To use this License in a document you have written, include a copy of
+the License in the document and put the following copyright and
+license notices just after the title page:
+
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.2
+ or any later version published by the Free Software Foundation;
+ with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
+replace the "with...Texts." line with this:
+
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+
+If you have Invariant Sections without Cover Texts, or some other
+combination of the three, merge those two alternatives to suit the
+situation.
+
+If your document contains nontrivial examples of program code, we
+recommend releasing these examples in parallel under your choice of
+free software license, such as the GNU General Public License,
+to permit their use in free software.
diff --git a/kaffeine/CREDITS b/kaffeine/CREDITS
new file mode 100644
index 0000000..f2e8c64
--- /dev/null
+++ b/kaffeine/CREDITS
@@ -0,0 +1,66 @@
+
+ ***************************
+ * KAFFEINE CONTRIBUTORS: *
+ * (alphabetical) *
+ ***************************
+
+Adrian Schroeter <adrian@suse.de>
+- fix for position changes in paused mode
+- help with xfree crash
+
+Alex Young <a.d.y@btinternet.com>
+- fix for volume slider
+
+Assaf Gillat <gillata@gmail.com>
+- alternate encoding for meta-tags; tons of patches
+
+Bryan Allen <theoiper@yahoo.com>
+- quit options for end of playback
+
+Carlo Miotto <cmiotto@interfree.it>
+- automatic resize
+
+Christopher Martin <christopher.martin@utoronto.ca>
+- a lot of patches
+
+Gav Wood <gav@kde.org>
+- lirc profile
+- dcop
+
+Giorgos Gousios <gousiosg@cs.man.ac.uk>
+- subtitle file handling
+
+Gustavo Pichorim Boiko <gustavo.boiko@kdemail.net>)
+- mouse wheel events for system tray icon
+
+James Stembridge <jstembridge@fastmail.fm>
+- toolbar fix
+- cvsignore files
+
+Jeroen Wijnhout <Jeroen.Wijnhout@kdemail.net>
+- shortcut configuration
+
+Laurent Montel <montel@kde.org>
+- mem leak fixes
+- speed improvements
+
+Michael Rolf <mi.rolf@gmx.net>
+- M3U import fix
+- tester
+
+Miguel Freitas <miguel@cetuc.puc-rio.br>
+- made xine's unscaled osd working for Kaffeine
+- xine aclocal flags patch
+- position slider fix
+- improved post plugin handling
+
+Steffen Schoenwiese <ss310636@inf.tu-dresden.de>
+- save volume
+- file dialogs remembers last directory
+
+Zack Cerza <zcerza@coe.neu.edu>
+- english manpages
+- debian build
+
+If you miss yourself here, send me a short mail: kaffeine@gmx.net
+
diff --git a/kaffeine/Makefile.am b/kaffeine/Makefile.am
new file mode 100644
index 0000000..6345063
--- /dev/null
+++ b/kaffeine/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = src images mimetypes protocols servicemenus
diff --git a/kaffeine/README.atsc b/kaffeine/README.atsc
new file mode 100644
index 0000000..5782e82
--- /dev/null
+++ b/kaffeine/README.atsc
@@ -0,0 +1,7 @@
+Please have a look at README.dvb.
+
+Additional notes:
+- Scanning isn't implemented yet.
+- Instead you can use the my small atsc channel converter tool at
+ http://websvn.kde.org/branches/work/~pfister/
+ (you need to have already a *zap channels file; look at http://linuxtv.org)
diff --git a/kaffeine/README.dvb b/kaffeine/README.dvb
new file mode 100644
index 0000000..a930765
--- /dev/null
+++ b/kaffeine/README.dvb
@@ -0,0 +1,69 @@
+------------------------------------------------------
+!! HAVE A LOOK AT KAFFEINE HANDBOOK !!
+------------------------------------------------------
+
+!!!!!!!!!! IMPORTANT !!!!!!!
+Live DVB only works with the xine backend (XinePart).
+Depending on your distro, this package could be called kaffeine-xine.
+Install it, start Kaffeine and change the backend in menu->settings->engine, then restart Kaffeine.
+Note that this is only needed for live playback. All other features (recording, broadcasting..) do not depend on the backend.
+Anyway, I strongly recommend the xine engine even if you don't have a DVB device. All others are incomplete and/or buggy.
+Also note that for licensing reasons, some distro (kubuntu, suse) comes with "restricted" media libraries (xine, gstreamer),
+so you won't be able to play some media files (in fact the most common ones:().
+You will have to install an "unrestricted" version in order to play all your media files.
+!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+
+This version of kaffeine includes support for DVB.
+
+Requirements :
+ A DVB device supported by linuxtv drivers.
+ Look at www.linuxtv.org for how to get, install and run these drivers.
+ Recent linux distributions should have full DVB support, so your device should be autodetected at boot time.
+
+Install:
+ You must have dvb headers to compile the dvb part.
+ Configure search for linux/dvb/frontend.h in standard paths (typically /usr/include)
+ ./configure
+ make
+ make install (as root)
+ YOU MUST INSTALL or it won't work.
+
+Usage:
+ Kaffeine uses dvbscan data files to find channels from you DVB network.
+ They are expected to be in :
+ ~/.kde/share/apps/kaffeine/dvb-s
+ ~/.kde/share/apps/kaffeine/dvb-t
+ ~/.kde/share/apps/kaffeine/dvb-c
+
+ If these dirs are missing, Kaffeine tries to download a daily updated archive from
+ http://hftom.free.fr/kaxtv/dvbdata.tar.gz, and extract it. If that fails, Kaffeine search for the installed archive in
+ $KDEDIR/share/apps/kaffeine.
+
+ Kaffeine tries to open your dvb device at start time, so make sure no other app are using it.
+
+ First , go to menu->DVB->Configure DVB . There, you have to choose a source for your device and configure diseqc (for dvb-s)
+ Kaffeine now support multiple dvb devices, repeat the configure step for each device.
+
+ Then go to the channels dialog ( either from the DVB menu or DVB tab ), select a source in the list and start scanning, then add
+ the desired channels to your channels list; repeat for each source.
+ Channels are assigned a number when they are added to the channels list.. You can later change it by editing the channel.
+
+ To zap to a channel, either double click on the channel name from the DVB tab (after tuning, Kaffeine autoswitch to player tab)
+ or enter its number with keypad. You can also use pageup/down to zap to previous/next.
+
+Remote control:
+ kdelirc dcop functions:
+ setNumber( int num )
+ next()
+ previous()
+ dvbOSD()
+ ...
+
+Channels categories:
+ Right click in the icon view to get a popupmenu and choose "New category".
+ Now, drag a channel name and drop it on the desired category' icon.
+ To remove a channel from a category, drop it on the "All" icon.
+ To delete a category, right click on its icon to get a popmenu.
+
+ You can also change the channel number. Select the channel, then click on the number to edit.
diff --git a/kaffeine/README.gstreamer b/kaffeine/README.gstreamer
new file mode 100644
index 0000000..04bf70a
--- /dev/null
+++ b/kaffeine/README.gstreamer
@@ -0,0 +1,17 @@
+
+************************************
+* README for gstreamer player-part *
+************************************
+
+REQUIREMENTS:
+ - GStreamer >= 0.8.4 (http://gstreamer.freedesktop.org)
+
+HINTS:
+ - Tested with GStreamer 0.8.10. The part will not work with the GStreamer 0.9.x series!!!
+ - For internet/network streams the gnomevfs plugin is required.
+
+
+
+
+
+
diff --git a/kaffeine/configure.in.bot b/kaffeine/configure.in.bot
new file mode 100644
index 0000000..af431f7
--- /dev/null
+++ b/kaffeine/configure.in.bot
@@ -0,0 +1,54 @@
+echo ""
+echo "-------------------------------------------------------"
+echo "Kaffeine configure results:"
+echo ""
+
+if test "$with_xcb" = "yes" ; then
+ echo "Build with xcb support: yes"
+else
+ echo "Build with xcb support: no"
+ echo "IMPORTANT: this is strongly discouraged"
+fi
+
+if test "$with_dpms" = "yes" ; then
+ echo "Build with DPMS support: yes"
+else
+ echo "Build with DPMS support: no"
+fi
+
+if test "$with_xtest" = "yes" ; then
+ echo "Build with XTest support: yes"
+else
+ echo "Build with XTest support: no"
+fi
+
+if test "$with_xinerama" = "yes" ; then
+ echo "Build with Xinerama support: yes"
+else
+ echo "Build with Xinerama support: no"
+fi
+
+if test "$with_dvb" = "yes" ; then
+ echo "Build with DVB support: yes"
+else
+ echo "Build with DVB support: no"
+fi
+
+if test "$with_gstreamer" = "yes" ; then
+ echo "Build GStreamer player part: yes"
+ echo "IMPORTANT: the GStreamer player part is experimental"
+else
+ echo "Build GStreamer player-part: no"
+fi
+
+if test "$with_oggvorbis" = "yes" ; then
+ echo "Build Ogg Vorbis encoder plugin: yes"
+else
+ echo "Build Ogg Vorbis encoder plugin: no"
+fi
+
+if test "$with_lame" = "yes" ; then
+ echo "Build LAME encoder plugin: yes"
+else
+ echo "Build LAME encoder plugin: no"
+fi
diff --git a/kaffeine/configure.in.in b/kaffeine/configure.in.in
new file mode 100644
index 0000000..00b5334
--- /dev/null
+++ b/kaffeine/configure.in.in
@@ -0,0 +1,283 @@
+dnl -----------
+dnl basic stuff
+dnl -----------
+
+KDE_ENABLE_HIDDEN_VISIBILITY
+
+AC_ARG_VAR([PKG_CONFIG], [Path to pkg-config])
+
+if test -z "$PKG_CONFIG" ; then
+ PKG_CONFIG="pkg-config"
+fi
+
+AC_MSG_CHECKING([for pkg-config])
+
+if ! "$PKG_CONFIG" --version ; then
+ echo ""
+ echo "---------------------------------------------------------------------"
+ echo "ERROR: Could not find pkg-config. Make sure it is in your path or set"
+ echo "the PKG_CONFIG environment variable to the full path to pkg-config."
+ echo "---------------------------------------------------------------------"
+ echo ""
+ AC_MSG_ERROR([could not find pkg-config])
+fi
+
+AC_ARG_WITH([xinit-workaround],
+ [AS_HELP_STRING([--with-xinit-workaround],
+ [use this flag if Kaffeine hangs at startup and you are using XFree86 4.4 or X.Org 6.7.0])],,
+ [with_xinit_workaround=no])
+
+if test "$with_xinit_workaround" = "yes" ; then
+ AC_DEFINE([XINIT_WKRND],,[workaround buggy X server])
+fi
+
+dnl ------------------------
+dnl check for DPMS extension
+dnl ------------------------
+
+AC_ARG_WITH([dpms], [AS_HELP_STRING([--without-dpms], [build without DPMS support])],,
+ [with_dpms=yes])
+
+CFLAGS_DPMS=""
+LIB_DPMS=""
+
+if test "$with_dpms" != "no" ; then
+ AC_MSG_CHECKING([for DPMS extension])
+
+ if "$PKG_CONFIG" --exists xext ; then
+ with_dpms=yes
+ CFLAGS_DPMS=`"$PKG_CONFIG" --cflags xext`
+ LIB_DPMS=`"$PKG_CONFIG" --libs xext`
+ AC_DEFINE([HAVE_DPMS],,[DPMS extension available])
+ AC_MSG_RESULT([yes])
+ else
+ with_dpms=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_DPMS])
+AC_SUBST([LIB_DPMS])
+
+dnl -------------------------
+dnl check for XTest extension
+dnl -------------------------
+
+AC_ARG_WITH([xtest], [AS_HELP_STRING([--without-xtest], [build without XTest support])],,
+ [with_xtest=yes])
+
+CFLAGS_XTEST=""
+LIB_XTEST=""
+
+if test "$with_xtest" != "no" ; then
+ AC_MSG_CHECKING([for XTest extension])
+
+ if "$PKG_CONFIG" --exists xtst ; then
+ with_xtest=yes
+ CFLAGS_XTEST=`"$PKG_CONFIG" --cflags xtst`
+ LIB_XTEST=`"$PKG_CONFIG" --libs xtst`
+ AC_DEFINE([HAVE_XTEST],,[XTest extension available])
+ AC_MSG_RESULT([yes])
+ else
+ with_xtest=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_XTEST])
+AC_SUBST([LIB_XTEST])
+
+dnl ----------------------------
+dnl check for Xinerama extension
+dnl ----------------------------
+
+AC_ARG_WITH([xinerama], [AS_HELP_STRING([--without-xinerama], [build without Xinerama support])],,
+ [with_xinerama=yes])
+
+CFLAGS_XINERAMA=""
+LIB_XINERAMA=""
+
+if test "$with_xinerama" != "no" ; then
+ AC_MSG_CHECKING([for Xinerama extension])
+
+ if "$PKG_CONFIG" --exists xinerama ; then
+ with_xinerama=yes
+ CFLAGS_XINERAMA=`"$PKG_CONFIG" --cflags xinerama`
+ LIB_XINERAMA=`"$PKG_CONFIG" --libs xinerama`
+ AC_DEFINE([HAVE_XINERAMA],,[Xinerama extension available])
+ AC_MSG_RESULT([yes])
+ else
+ with_xinerama=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_XINERAMA])
+AC_SUBST([LIB_XINERAMA])
+
+dnl ------------------
+dnl check for xine-lib
+dnl ------------------
+
+AC_MSG_CHECKING([for xine-lib])
+
+CFLAGS_XINE=""
+LIB_XINE=""
+
+if "$PKG_CONFIG" --exists "libxine >= 1.1.9" ; then
+ CFLAGS_XINE=`"$PKG_CONFIG" --cflags libxine`
+ LIB_XINE=`"$PKG_CONFIG" --libs libxine`
+ AC_MSG_RESULT([yes])
+else
+ AC_MSG_RESULT([no])
+
+ echo ""
+ echo "---------------------------------------"
+ echo "ERROR: Could not find xine-lib >= 1.1.9"
+ echo "---------------------------------------"
+ echo ""
+
+ AC_MSG_ERROR([could not find xine-lib])
+fi
+
+AC_SUBST([CFLAGS_XINE])
+AC_SUBST([LIB_XINE])
+
+dnl -------------
+dnl check for xcb
+dnl -------------
+
+AC_ARG_WITH([xcb], [AS_HELP_STRING([--without-xcb], [disable xcb support (not recommended)])],,
+ [with_xcb=yes])
+
+AC_MSG_CHECKING([for xcb and xine-lib >= 1.1.9])
+
+CFLAGS_XCB=""
+LIB_XCB=""
+
+if test "$with_xcb" != "no" ; then
+ if "$PKG_CONFIG" --exists "xcb >= 1.0" ; then
+ with_xcb=yes
+ CFLAGS_XCB=`"$PKG_CONFIG" --cflags xcb`
+ LIB_XCB=`"$PKG_CONFIG" --libs xcb`
+ AC_DEFINE([HAVE_XCB],,[xcb available])
+ AC_MSG_RESULT([yes])
+ else
+ with_xcb=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_XCB])
+AC_SUBST([LIB_XCB])
+
+AM_CONDITIONAL([with_xcb], [test "$with_xcb" = "yes"])
+
+dnl ---------------------
+dnl check for DVB headers
+dnl ---------------------
+
+AC_ARG_WITH([dvb], [AS_HELP_STRING([--without-dvb], [build without DVB support])],,
+ [with_dvb=yes])
+
+if test "$with_dvb" != "no" ; then
+ KDE_CHECK_HEADER([linux/dvb/frontend.h], [with_dvb=yes]
+ [AC_DEFINE([HAVE_DVB],,[DVB headers installed])], [with_dvb=no])
+fi
+
+AM_CONDITIONAL([with_dvb], [test "$with_dvb" = "yes"])
+
+dnl -------------------
+dnl check for gstreamer
+dnl -------------------
+
+AC_ARG_WITH([gstreamer], [AS_HELP_STRING([--without-gstreamer], [disable GStreamer player part])],,
+ [with_gstreamer=yes])
+
+CFLAGS_GSTREAMER=""
+LIB_GSTREAMER=""
+
+if test "$with_gstreamer" != "no" ; then
+ AC_MSG_CHECKING([for GStreamer])
+
+ if "$PKG_CONFIG" --exists "gstreamer-0.10 gstreamer-plugins-base-0.10"; then
+ with_gstreamer=yes
+ CFLAGS_GSTREAMER=`"$PKG_CONFIG" --cflags gstreamer-0.10 gstreamer-plugins-base-0.10`
+ LIB_GSTREAMER=`"$PKG_CONFIG" --libs gstreamer-0.10 gstreamer-plugins-base-0.10`
+ AC_MSG_RESULT([yes])
+ else
+ with_gstreamer=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_GSTREAMER])
+AC_SUBST([LIB_GSTREAMER])
+
+AM_CONDITIONAL([with_gstreamer], [test "$with_gstreamer" = "yes"])
+
+dnl --------------------
+dnl check for cdparanoia
+dnl --------------------
+
+KDE_CHECK_HEADER([cdda_interface.h], [with_cdparanoia=yes], [with_cdparanoia=no])
+
+if test "$with_cdparanoia" != "yes" ; then
+ echo ""
+ echo "-----------------------------------------"
+ echo "ERROR: Could not find cdparanoia headers."
+ echo "-----------------------------------------"
+ echo ""
+
+ AC_MSG_ERROR([could not find cdparanoia headers])
+fi
+
+dnl ----------------------------
+dnl check for Ogg Vorbis encoder
+dnl ----------------------------
+
+AC_ARG_WITH([oggvorbis], [AS_HELP_STRING([--without-oggvorbis], [build without Ogg Vorbis support])],,
+ [with_oggvorbis=yes])
+
+CFLAGS_OGGVORBIS=""
+LIB_OGGVORBIS=""
+
+if test "$with_oggvorbis" != "no" ; then
+ AC_MSG_CHECKING([for Ogg/Vorbis encoder])
+
+ if "$PKG_CONFIG" --exists vorbisenc ; then
+ with_oggvorbis=yes
+ CFLAGS_OGGVORBIS=`"$PKG_CONFIG" --cflags vorbisenc`
+ LIB_OGGVORBIS=`"$PKG_CONFIG" --libs vorbisenc`
+ AC_MSG_RESULT([yes])
+ else
+ with_oggvorbis=no
+ AC_MSG_RESULT([no])
+ fi
+fi
+
+AC_SUBST([CFLAGS_OGGVORBIS])
+AC_SUBST([LIB_OGGVORBIS])
+
+AM_CONDITIONAL([with_oggvorbis], [test "$with_oggvorbis" = "yes"])
+
+dnl --------------
+dnl check for LAME
+dnl --------------
+
+AC_ARG_WITH([lame], [AS_HELP_STRING([--without-lame], [build without LAME support])],,
+ [with_lame=yes])
+
+LIB_LAME=""
+
+if test "$with_lame" != "no" ; then
+ KDE_CHECK_HEADER([lame/lame.h], [with_lame=yes], [with_lame=no])
+fi
+
+if test "$with_lame" = "yes" ; then
+ KDE_CHECK_LIB([mp3lame], [lame_init], [LIB_LAME="-lmp3lame"], [with_lame=no], [-lm])
+fi
+
+AC_SUBST([LIB_LAME])
+
+AM_CONDITIONAL([with_lame], [test "$with_lame" = "yes"])
diff --git a/kaffeine/fast-slow-dcop.patch b/kaffeine/fast-slow-dcop.patch
new file mode 100644
index 0000000..4bced05
--- /dev/null
+++ b/kaffeine/fast-slow-dcop.patch
@@ -0,0 +1,54 @@
+Index: src/player-parts/xine-part/xine_part.h
+===================================================================
+--- src/player-parts/xine-part/xine_part.h (revision 746328)
++++ src/player-parts/xine-part/xine_part.h (working copy)
+@@ -108,6 +108,8 @@
+ QString screenShot();
+ void nextAudioChannel();
+ void nextSubtitleChannel();
++ void speedFaster();
++ void speedSlower();
+
+ public slots:
+ /*
+Index: src/player-parts/xine-part/xine_part_iface.h
+===================================================================
+--- src/player-parts/xine-part/xine_part_iface.h (revision 746328)
++++ src/player-parts/xine-part/xine_part_iface.h (working copy)
+@@ -128,6 +128,8 @@
+
+ virtual void nextAudioChannel() = 0;
+ virtual void nextSubtitleChannel() = 0;
++ virtual void speedFaster() = 0;
++ virtual void speedSlower() = 0;
+ };
+
+ #endif /* XINE_PART_IFACE_H */
+Index: src/player-parts/xine-part/xine_part.cpp
+===================================================================
+--- src/player-parts/xine-part/xine_part.cpp (revision 746328)
++++ src/player-parts/xine-part/xine_part.cpp (working copy)
+@@ -449,6 +449,11 @@
+ }
+ }
+
++void XinePart::speedFaster()
++{
++ slotFastForward();
++}
++
+ void XinePart::slotFastForward()
+ {
+ if (m_xine->getSpeed() == KXineWidget::Pause)
+@@ -459,6 +464,11 @@
+ m_xine->slotSpeedFaster();
+ }
+
++void XinePart::speedSlower()
++{
++ slotSlowMotion();
++}
++
+ void XinePart::slotSlowMotion()
+ {
+ if (m_xine->getSpeed() == KXineWidget::Pause)
diff --git a/kaffeine/generic_tr.patch b/kaffeine/generic_tr.patch
new file mode 100644
index 0000000..0864ed0
--- /dev/null
+++ b/kaffeine/generic_tr.patch
@@ -0,0 +1,13 @@
+Index: kaffeine/src/kaffeine.desktop
+===================================================================
+--- kaffeine/src/kaffeine.desktop (revision 708328)
++++ kaffeine/src/kaffeine.desktop (working copy)
+@@ -57,7 +57,7 @@
+ GenericName[sv]=Mediaspelare
+ GenericName[tg]=Навозишгари Медиа
+ GenericName[th]=โปรแกรมเล่นสื่อ
+-GenericName[tr]=Oynatıcı
++GenericName[tr]=Çokluortam Oynatıcısı
+ GenericName[uk]=Програвач медіа-матеріалів
+ GenericName[xx]=xxMedia Playerxx
+ GenericName[zh_CN]=媒体播放器
diff --git a/kaffeine/images/COPYING b/kaffeine/images/COPYING
new file mode 100644
index 0000000..94de4aa
--- /dev/null
+++ b/kaffeine/images/COPYING
@@ -0,0 +1,10 @@
+
+***************************
+* ARTWORK COPYRIGHT HINTS *
+***************************
+
+- new Kaffeine logo animation (logo): (c) Dieter Zander, License: LGPL
+
+- all "coffee bean icons": (c) 2003-2004 by Jürgen Kofler, Licence: LGPL
+
+- record icons: take from Nuvola-Icon Set, (c) by David Vignoni, Licence: LGPL
diff --git a/kaffeine/images/Makefile.am b/kaffeine/images/Makefile.am
new file mode 100644
index 0000000..dfc6e81
--- /dev/null
+++ b/kaffeine/images/Makefile.am
@@ -0,0 +1,83 @@
+EXTRA_DIST = kaffeine16x16.png kaffeine22x22.png kaffeine32x32.png \
+ kaffeine48x48.png kaffeine64x64.png logo.mpg logo.avi kaffeine128x128.png \
+ kaffeine-play.png kaffeine-pause.png kaffeine-record.png player_record16x16.png \
+ player_record22x22.png player_record16x16.png mime_kaffeine32x32.png \
+ mime_kaffeine32x32.png mime_kaffeine48x48.png player_mute16x16.png \
+ player_mute22x22.png player_mute32x32.png kdvbtv.png kdvbtvc.png \
+ kdvbra.png kdvbrac.png dvbdata.tar.gz nocover.png kilogram16x16.png kilogram22x22.png kilogram32x32.png
+
+install-data-local:
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/
+ $(INSTALL_DATA) $(srcdir)/kaffeine16x16.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kaffeine.png
+ $(INSTALL_DATA) $(srcdir)/kdvbtv.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kdvbtv.png
+ $(INSTALL_DATA) $(srcdir)/kdvbtvc.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kdvbtvc.png
+ $(INSTALL_DATA) $(srcdir)/kdvbra.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kdvbra.png
+ $(INSTALL_DATA) $(srcdir)/kdvbrac.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kdvbrac.png
+ $(INSTALL_DATA) $(srcdir)/kilogram16x16.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kilogram.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/16x16/mimetypes/
+ $(INSTALL_DATA) $(srcdir)/mime_kaffeine16x16.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/mimetypes/mime_kaffeine.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/
+ $(INSTALL_DATA) $(srcdir)/player_record16x16.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/player_record.png
+ $(INSTALL_DATA) $(srcdir)/player_mute16x16.png $(DESTDIR)$(kde_icondir)/hicolor/16x16/actions/player_mute.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/
+ $(INSTALL_DATA) $(srcdir)/kaffeine22x22.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/kaffeine.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/
+ $(INSTALL_DATA) $(srcdir)/player_record22x22.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/player_record.png
+ $(INSTALL_DATA) $(srcdir)/player_mute22x22.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/actions/player_mute.png
+ $(INSTALL_DATA) $(srcdir)/kilogram22x22.png $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/kilogram.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/
+ $(INSTALL_DATA) $(srcdir)/kaffeine-play.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/kaffeine-play.png
+ $(INSTALL_DATA) $(srcdir)/kaffeine-pause.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/kaffeine-pause.png
+ $(INSTALL_DATA) $(srcdir)/kaffeine-record.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/kaffeine-record.png
+ $(INSTALL_DATA) $(srcdir)/kaffeine32x32.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/kaffeine.png
+ $(INSTALL_DATA) $(srcdir)/kilogram32x32.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/kilogram.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/32x32/mimetypes/
+ $(INSTALL_DATA) $(srcdir)/mime_kaffeine32x32.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/mimetypes/mime_kaffeine.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/
+ $(INSTALL_DATA) $(srcdir)/player_record32x32.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/player_record.png
+ $(INSTALL_DATA) $(srcdir)/player_mute32x32.png $(DESTDIR)$(kde_icondir)/hicolor/32x32/actions/player_mute.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/48x48/apps/
+ $(INSTALL_DATA) $(srcdir)/kaffeine48x48.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/apps/kaffeine.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/48x48/mimetypes/
+ $(INSTALL_DATA) $(srcdir)/mime_kaffeine48x48.png $(DESTDIR)$(kde_icondir)/hicolor/48x48/mimetypes/mime_kaffeine.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/64x64/apps/
+ $(INSTALL_DATA) $(srcdir)/kaffeine64x64.png $(DESTDIR)$(kde_icondir)/hicolor/64x64/apps/kaffeine.png
+ $(mkinstalldirs) $(DESTDIR)$(kde_datadir)/kaffeine/
+ $(INSTALL_DATA) $(srcdir)/logo.mpg $(DESTDIR)$(kde_datadir)/kaffeine/logo.mpg
+ $(INSTALL_DATA) $(srcdir)/logo.avi $(DESTDIR)$(kde_datadir)/kaffeine/logo.avi
+ $(INSTALL_DATA) $(srcdir)/logo $(DESTDIR)$(kde_datadir)/kaffeine/logo
+ $(mkinstalldirs) $(DESTDIR)$(kde_icondir)/hicolor/128x128/apps/
+ $(INSTALL_DATA) $(srcdir)/kaffeine128x128.png $(DESTDIR)$(kde_icondir)/hicolor/128x128/apps/kaffeine.png
+ $(INSTALL_DATA) $(srcdir)/dvbdata.tar.gz $(DESTDIR)$(kde_datadir)/kaffeine/dvbdata.tar.gz
+ $(INSTALL_DATA) $(srcdir)/nocover.png $(DESTDIR)$(kde_datadir)/kaffeine/nocover.png
+
+uninstall-local:
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kilogram.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/kilogram.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/kilogram.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kaffeine.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kdvbtv.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kdvbtvc.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kdvbra.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/kdvbrac.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/player_record.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/16x16/apps/player_mute.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/kaffeine.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/kaffeine-play.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/kaffeine-pause.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x2/apps/player_record.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/22x22/apps/player_mute.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/kaffeine.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/player_record.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/32x32/apps/player_mute.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/48x48/apps/kaffeine.png
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/64x64/apps/kaffeine.png
+ -rm -f $(DESTDIR)$(kde_datadir)/kaffeine/logo.mpg
+ -rm -f $(DESTDIR)$(kde_datadir)/kaffeine/logo.avi
+ -rm -f $(DESTDIR)$(kde_datadir)/kaffeine/logo
+ -rm -f $(DESTDIR)$(kde_icondir)/hicolor/128x128/apps/kaffeine.png
+ -rm -f $(DESTDIR)$(kde_datadir)/kaffeine/dvbdata.tar.gz
+ -rm -f $(DESTDIR)$(kde_datadir)/kaffeine/nocover.png
+
+pics_DATA = playing.png
+picsdir = $(kde_datadir)/kaffeine/pics
diff --git a/kaffeine/images/dvbdata.tar.gz b/kaffeine/images/dvbdata.tar.gz
new file mode 100644
index 0000000..e2b082f
--- /dev/null
+++ b/kaffeine/images/dvbdata.tar.gz
Binary files differ
diff --git a/kaffeine/images/kaffeine-pause.png b/kaffeine/images/kaffeine-pause.png
new file mode 100644
index 0000000..f942294
--- /dev/null
+++ b/kaffeine/images/kaffeine-pause.png
Binary files differ
diff --git a/kaffeine/images/kaffeine-play.png b/kaffeine/images/kaffeine-play.png
new file mode 100644
index 0000000..8ba732d
--- /dev/null
+++ b/kaffeine/images/kaffeine-play.png
Binary files differ
diff --git a/kaffeine/images/kaffeine-record.png b/kaffeine/images/kaffeine-record.png
new file mode 100644
index 0000000..0f7f430
--- /dev/null
+++ b/kaffeine/images/kaffeine-record.png
Binary files differ
diff --git a/kaffeine/images/kaffeine128x128.png b/kaffeine/images/kaffeine128x128.png
new file mode 100644
index 0000000..7bc5b1d
--- /dev/null
+++ b/kaffeine/images/kaffeine128x128.png
Binary files differ
diff --git a/kaffeine/images/kaffeine16x16.png b/kaffeine/images/kaffeine16x16.png
new file mode 100644
index 0000000..f35400f
--- /dev/null
+++ b/kaffeine/images/kaffeine16x16.png
Binary files differ
diff --git a/kaffeine/images/kaffeine22x22.png b/kaffeine/images/kaffeine22x22.png
new file mode 100644
index 0000000..3007f36
--- /dev/null
+++ b/kaffeine/images/kaffeine22x22.png
Binary files differ
diff --git a/kaffeine/images/kaffeine32x32.png b/kaffeine/images/kaffeine32x32.png
new file mode 100644
index 0000000..839182d
--- /dev/null
+++ b/kaffeine/images/kaffeine32x32.png
Binary files differ
diff --git a/kaffeine/images/kaffeine48x48.png b/kaffeine/images/kaffeine48x48.png
new file mode 100644
index 0000000..5d4cb61
--- /dev/null
+++ b/kaffeine/images/kaffeine48x48.png
Binary files differ
diff --git a/kaffeine/images/kaffeine64x64.png b/kaffeine/images/kaffeine64x64.png
new file mode 100644
index 0000000..2670e7c
--- /dev/null
+++ b/kaffeine/images/kaffeine64x64.png
Binary files differ
diff --git a/kaffeine/images/kdvbra.png b/kaffeine/images/kdvbra.png
new file mode 100644
index 0000000..721f81c
--- /dev/null
+++ b/kaffeine/images/kdvbra.png
Binary files differ
diff --git a/kaffeine/images/kdvbrac.png b/kaffeine/images/kdvbrac.png
new file mode 100644
index 0000000..ba886df
--- /dev/null
+++ b/kaffeine/images/kdvbrac.png
Binary files differ
diff --git a/kaffeine/images/kdvbtv.png b/kaffeine/images/kdvbtv.png
new file mode 100644
index 0000000..643d705
--- /dev/null
+++ b/kaffeine/images/kdvbtv.png
Binary files differ
diff --git a/kaffeine/images/kdvbtvc.png b/kaffeine/images/kdvbtvc.png
new file mode 100644
index 0000000..fb8a220
--- /dev/null
+++ b/kaffeine/images/kdvbtvc.png
Binary files differ
diff --git a/kaffeine/images/kilogram16x16.png b/kaffeine/images/kilogram16x16.png
new file mode 100644
index 0000000..2293430
--- /dev/null
+++ b/kaffeine/images/kilogram16x16.png
Binary files differ
diff --git a/kaffeine/images/kilogram22x22.png b/kaffeine/images/kilogram22x22.png
new file mode 100644
index 0000000..cbeb589
--- /dev/null
+++ b/kaffeine/images/kilogram22x22.png
Binary files differ
diff --git a/kaffeine/images/kilogram32x32.png b/kaffeine/images/kilogram32x32.png
new file mode 100644
index 0000000..2078333
--- /dev/null
+++ b/kaffeine/images/kilogram32x32.png
Binary files differ
diff --git a/kaffeine/images/logo b/kaffeine/images/logo
new file mode 100644
index 0000000..f3d53e2
--- /dev/null
+++ b/kaffeine/images/logo
Binary files differ
diff --git a/kaffeine/images/logo.avi b/kaffeine/images/logo.avi
new file mode 100644
index 0000000..df7a855
--- /dev/null
+++ b/kaffeine/images/logo.avi
Binary files differ
diff --git a/kaffeine/images/logo.mpg b/kaffeine/images/logo.mpg
new file mode 100644
index 0000000..efa49d1
--- /dev/null
+++ b/kaffeine/images/logo.mpg
Binary files differ
diff --git a/kaffeine/images/mime_kaffeine16x16.png b/kaffeine/images/mime_kaffeine16x16.png
new file mode 100644
index 0000000..0a49636
--- /dev/null
+++ b/kaffeine/images/mime_kaffeine16x16.png
Binary files differ
diff --git a/kaffeine/images/mime_kaffeine32x32.png b/kaffeine/images/mime_kaffeine32x32.png
new file mode 100644
index 0000000..ef32cd8
--- /dev/null
+++ b/kaffeine/images/mime_kaffeine32x32.png
Binary files differ
diff --git a/kaffeine/images/mime_kaffeine48x48.png b/kaffeine/images/mime_kaffeine48x48.png
new file mode 100644
index 0000000..7192e90
--- /dev/null
+++ b/kaffeine/images/mime_kaffeine48x48.png
Binary files differ
diff --git a/kaffeine/images/nocover.png b/kaffeine/images/nocover.png
new file mode 100644
index 0000000..7163e73
--- /dev/null
+++ b/kaffeine/images/nocover.png
Binary files differ
diff --git a/kaffeine/images/player_mute16x16.png b/kaffeine/images/player_mute16x16.png
new file mode 100644
index 0000000..fb332c4
--- /dev/null
+++ b/kaffeine/images/player_mute16x16.png
Binary files differ
diff --git a/kaffeine/images/player_mute22x22.png b/kaffeine/images/player_mute22x22.png
new file mode 100644
index 0000000..92c5af7
--- /dev/null
+++ b/kaffeine/images/player_mute22x22.png
Binary files differ
diff --git a/kaffeine/images/player_mute32x32.png b/kaffeine/images/player_mute32x32.png
new file mode 100644
index 0000000..0822fca
--- /dev/null
+++ b/kaffeine/images/player_mute32x32.png
Binary files differ
diff --git a/kaffeine/images/player_record16x16.png b/kaffeine/images/player_record16x16.png
new file mode 100644
index 0000000..d9e1aca
--- /dev/null
+++ b/kaffeine/images/player_record16x16.png
Binary files differ
diff --git a/kaffeine/images/player_record22x22.png b/kaffeine/images/player_record22x22.png
new file mode 100644
index 0000000..d1eb150
--- /dev/null
+++ b/kaffeine/images/player_record22x22.png
Binary files differ
diff --git a/kaffeine/images/player_record32x32.png b/kaffeine/images/player_record32x32.png
new file mode 100644
index 0000000..0605531
--- /dev/null
+++ b/kaffeine/images/player_record32x32.png
Binary files differ
diff --git a/kaffeine/images/playing.png b/kaffeine/images/playing.png
new file mode 100644
index 0000000..7cb4f47
--- /dev/null
+++ b/kaffeine/images/playing.png
Binary files differ
diff --git a/kaffeine/mimetypes/Makefile.am b/kaffeine/mimetypes/Makefile.am
new file mode 100644
index 0000000..dfd6a7b
--- /dev/null
+++ b/kaffeine/mimetypes/Makefile.am
@@ -0,0 +1,2 @@
+
+SUBDIRS = application
diff --git a/kaffeine/mimetypes/application/Makefile.am b/kaffeine/mimetypes/application/Makefile.am
new file mode 100644
index 0000000..ec74682
--- /dev/null
+++ b/kaffeine/mimetypes/application/Makefile.am
@@ -0,0 +1,6 @@
+
+
+mime_DATA = x-kaffeine.desktop x-mplayer2.desktop
+mimedir = $(kde_mimedir)/application
+
+EXTRA_DIST = $(mime_DATA)
diff --git a/kaffeine/mimetypes/application/x-kaffeine.desktop b/kaffeine/mimetypes/application/x-kaffeine.desktop
new file mode 100644
index 0000000..4e82fd5
--- /dev/null
+++ b/kaffeine/mimetypes/application/x-kaffeine.desktop
@@ -0,0 +1,51 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=MimeType
+MimeType=application/x-kaffeine
+Icon=mime_kaffeine
+Patterns=*.kaffeine
+Comment=Kaffeine Playlist
+Comment[af]=Kaffeine Speel Lys
+Comment[ar]=لائحة القراءة ل- Kaffeine
+Comment[bg]=Списък за изпълнение (Kaffeine)
+Comment[bn]=ক্যাফিন সঙ্গীত-তালিকা
+Comment[br]=Roll tonioù Kaffeine
+Comment[ca]=Repertori de Kaffeine
+Comment[cs]=Seznam skladeb Kaffeine
+Comment[da]=Kaffeines spilleliste
+Comment[de]=Kaffeine Wiedergabeliste
+Comment[el]=Λίστα αναπαραγωγής Kaffeine
+Comment[es]=Lista de reproducción de Kaffeine
+Comment[et]=Kaffeine esitusnimekiri
+Comment[fi]=Kaffeinen soittolista
+Comment[fr]=Liste de lecture de Kaffeine
+Comment[ga]=Seinmliosta Kaffeine
+Comment[gl]=Lista de Reprodución de Kaffeine
+Comment[he]=רשימת ניגון של Kaffeine
+Comment[hu]=Kaffeine-lejátszólista
+Comment[is]=Kaffeine lagalisti
+Comment[it]=Playlist di Kaffeine
+Comment[ja]=Kaffeine プレイリスト
+Comment[ka]=Kaffeine-ის რეპერტუარი
+Comment[km]=បញ្ជី​ចាក់ Kaffeine
+Comment[lt]=Kaffeine grojaraštis
+Comment[nb]=Kaffeine-spilleliste
+Comment[nl]=Kaffeine-afspeellijst
+Comment[nn]=Kaffeine-speleliste
+Comment[pa]=ਕੈਫ਼ੀਨ ਸੰਗੀਤ-ਸੂਚੀ
+Comment[pl]=Lista odtwarzania Kaffeine
+Comment[pt]=Lista de Reprodução do Kaffeine
+Comment[pt_BR]=Lista de Reprodução do Kaffeine
+Comment[se]=Kaffeine-čuojahanlistu
+Comment[sr]=Kaffeine-ова листа нумера
+Comment[sr@Latn]=Kaffeine-ova lista numera
+Comment[sv]=Kaffeines spellista
+Comment[tg]=Рӯйхати мусиқии Kaffeine
+Comment[th]=รายการเล่นของ Kaffeine
+Comment[tr]=Kaffeine Oynatma Listesi
+Comment[uk]=Список композицій Kaffeine
+Comment[xx]=xxKaffeine Playlistxx
+Comment[zh_CN]=Kaffeine 播放列表
+Comment[zh_TW]=Kaffeine 播放列表
+
+
diff --git a/kaffeine/mimetypes/application/x-mplayer2.desktop b/kaffeine/mimetypes/application/x-mplayer2.desktop
new file mode 100644
index 0000000..7719691
--- /dev/null
+++ b/kaffeine/mimetypes/application/x-mplayer2.desktop
@@ -0,0 +1,25 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=MimeType
+MimeType=application/x-mplayer2
+Icon=video
+Patterns=*.avi;*.AVI;*.asf;*.wmv;*.ASF;*.WMV;*.asx;*.ASX;*.wma;*.WMA;*.wmx;*.WMX
+Comment=Microsoft Media
+Comment[bn]=মাইক্রোসফ্ট মিডিয়া
+Comment[ca]=Medi de Microsoft
+Comment[cs]=Microsoft média
+Comment[da]=Microsoft medie
+Comment[el]=Πολυμέσα Microsoft
+Comment[fi]=Microsoft-media
+Comment[fr]=Média Microsoft
+Comment[he]=מדיה של מיקרוסופט
+Comment[is]=Microsoft miðill
+Comment[km]=ម៉ៃក្រូសូហ្វ​មេឌៀ
+Comment[lt]=Microsoft daugialypė terpė
+Comment[nn]=Microsoft-medium
+Comment[pa]=ਮਾਈਕਰੋਸਾਫਟ ਮੀਡਿਆ
+Comment[sv]=Microsoft media
+Comment[tg]=Майкрософт медиа
+Comment[th]=รูปแบบสื่อของ Microsoft
+Comment[tr]=Microsoft Ortamı
+Comment[xx]=xxMicrosoft Mediaxx
diff --git a/kaffeine/protocols/Makefile.am b/kaffeine/protocols/Makefile.am
new file mode 100644
index 0000000..86a624e
--- /dev/null
+++ b/kaffeine/protocols/Makefile.am
@@ -0,0 +1,14 @@
+
+
+EXTRA_DIST = mms.protocol rtsp.protocol
+
+install-data-local:
+ $(mkinstalldirs) $(DESTDIR)$(kde_datadir)/kaffeine
+ $(INSTALL_DATA) $(srcdir)/mms.protocol $(DESTDIR)$(kde_datadir)/kaffeine/mms.protocol
+ $(INSTALL_DATA) $(srcdir)/rtsp.protocol $(DESTDIR)$(kde_datadir)/kaffeine/rtsp.protocol
+
+uninstall-local:
+ -rm -f $(DESTDIR)$(kde_datadir)/kaffeine/mms.protocol
+ -rm -f $(DESTDIR)$(kde_datadir)/kaffeine/rtsp.protocol
+
+
diff --git a/kaffeine/protocols/mms.protocol b/kaffeine/protocols/mms.protocol
new file mode 100644
index 0000000..41f9037
--- /dev/null
+++ b/kaffeine/protocols/mms.protocol
@@ -0,0 +1,12 @@
+[Protocol]
+exec=kaffeine "%u"
+protocol=mms
+input=none
+output=none
+helper=true
+reading=false
+listing=false
+writing=false
+makedir=false
+deleting=false
+
diff --git a/kaffeine/protocols/rtsp.protocol b/kaffeine/protocols/rtsp.protocol
new file mode 100644
index 0000000..2362835
--- /dev/null
+++ b/kaffeine/protocols/rtsp.protocol
@@ -0,0 +1,12 @@
+[Protocol]
+exec=kaffeine "%u"
+protocol=rtsp
+input=none
+output=none
+helper=true
+reading=false
+listing=false
+writing=false
+makedir=false
+deleting=false
+
diff --git a/kaffeine/scandialog.patch b/kaffeine/scandialog.patch
new file mode 100644
index 0000000..58208da
--- /dev/null
+++ b/kaffeine/scandialog.patch
@@ -0,0 +1,53 @@
+--- scandialog.cpp 2007-12-21 21:21:22.000000000 +0000
++++ newscandialog.cpp 2007-12-21 21:23:26.000000000 +0000
+@@ -109,13 +109,15 @@
+ foundList->clear();
+ foundList->setAllColumnsShowFocus( true );
+ foundList->setSelectionMode( QListView::Extended );
+- channelsList->setSorting( 0 );
++ channelsList->setSorting( 1 ); // sort by source 1st than channel name
++ channelsList->setAllColumnsShowFocus( true );
++ channelsList->setSelectionMode( QListView::Extended );
+
+ ChannelDesc *chan;
+ QListViewItem *it;
+ for ( int i=0; i<(int)chandesc->count(); i++ ) {
+ chan = chandesc->at(i);
+- it = new QListViewItem( channelsList, chan->name );
++ it = new QListViewItem( channelsList, chan->name, chan->tp.source );
+ if ( !chan->pix.isNull() )
+ it->setPixmap( 0, chan->pix );
+ else {
+
+--- scandialogui.ui 2007-12-21 21:21:22.000000000 +0000
++++ newscandialogui.ui 2007-12-12 18:59:16.000000000 +0000
+@@ -66,9 +66,28 @@
+ <bool>true</bool>
+ </property>
+ </column>
++ <column>
++ <property name="text">
++ <string>Source</string>
++ </property>
++ <property name="clickable">
++ <bool>true</bool>
++ </property>
++ <property name="resizable">
++ <bool>true</bool>
++ </property>
++ </column>
+ <property name="name">
+ <cstring>channelsList</cstring>
+ </property>
++ <property name="sizePolicy">
++ <sizepolicy>
++ <hsizetype>7</hsizetype>
++ <vsizetype>3</vsizetype>
++ <horstretch>0</horstretch>
++ <verstretch>0</verstretch>
++ </sizepolicy>
++ </property>
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+
diff --git a/kaffeine/servicemenus/Makefile.am b/kaffeine/servicemenus/Makefile.am
new file mode 100644
index 0000000..555cdb3
--- /dev/null
+++ b/kaffeine/servicemenus/Makefile.am
@@ -0,0 +1,19 @@
+
+
+EXTRA_DIST = kaffeine_open_directory.desktop kaffeine_append_file.desktop kaffeine_play_audiocd.desktop kaffeine_play_dvd.desktop kaffeine_play_vcd.desktop
+
+install-data-local:
+ $(mkinstalldirs) $(DESTDIR)$(kde_datadir)/konqueror/servicemenus
+ $(INSTALL_DATA) $(srcdir)/kaffeine_open_directory.desktop $(DESTDIR)$(kde_datadir)/konqueror/servicemenus/kaffeine_open_directory.desktop
+ $(INSTALL_DATA) $(srcdir)/kaffeine_append_file.desktop $(DESTDIR)$(kde_datadir)/konqueror/servicemenus/kaffeine_append_file.desktop
+ $(INSTALL_DATA) $(srcdir)/kaffeine_play_audiocd.desktop $(DESTDIR)$(kde_datadir)/konqueror/servicemenus/kaffeine_play_audiocd.desktop
+ $(INSTALL_DATA) $(srcdir)/kaffeine_play_dvd.desktop $(DESTDIR)$(kde_datadir)/konqueror/servicemenus/kaffeine_play_dvd.desktop
+ $(INSTALL_DATA) $(srcdir)/kaffeine_play_vcd.desktop $(DESTDIR)$(kde_datadir)/konqueror/servicemenus/kaffeine_play_vcd.desktop
+
+uninstall-local:
+ -rm -f $(DESTDIR)$(kde_datadir)/konqueror/servicemenus/kaffeine_open_directory.desktop
+ -rm -f $(DESTDIR)$(kde_datadir)/konqueror/servicemenus/kaffeine_append_file.desktop
+ -rm -f $(DESTDIR)$(kde_datadir)/konqueror/servicemenus/kaffeine_play_audiocd.desktop
+ -rm -f $(DESTDIR)$(kde_datadir)/konqueror/servicemenus/kaffeine_play_dvd.desktop
+ -rm -f $(DESTDIR)$(kde_datadir)/konqueror/servicemenus/kaffeine_play_vcd.desktop
+
diff --git a/kaffeine/servicemenus/kaffeine_append_file.desktop b/kaffeine/servicemenus/kaffeine_append_file.desktop
new file mode 100644
index 0000000..72b7103
--- /dev/null
+++ b/kaffeine/servicemenus/kaffeine_append_file.desktop
@@ -0,0 +1,51 @@
+[Desktop Entry]
+ServiceTypes=application/x-ogg,audio/basic,audio/vnd.rn-realaudio,audio/x-aiff,audio/x-mp3,audio/x-mpeg,audio/x-mpegurl,audio/x-ms-wma,audio/x-ogg,audio/x-pn-realaudio,audio/x-pn-realaudio-plugin,audio/x-scpls,audio/x-wav,audio/x-flac,video/x-matroska,audio/x-matroska,video/mpeg,video/msvideo,video/quicktime,video/vnd.rn-realvideo,video/x-avi,video/x-fli,video/x-flic,video/x-ms-asf,video/x-ms-wmv,video/x-msvideo,application/x-mplayer2,application/smil,application/x-kaffeine,audio/x-musepack
+Actions=kaffeine_append_file;
+Encoding=UTF-8
+
+[Desktop Action kaffeine_append_file]
+Name=Append to Kaffeine Playlist
+Name[af]=Voeg agter aan Kaffeine Speel lys by
+Name[ar]= ازادة الى لائحة قراءة Kaffeine
+Name[bg]=Добавяне към списъка за изпълнение на Kaffeine
+Name[bn]=ক্যাফিন সঙ্গীত-তালিকাতে সংযোজন করো
+Name[br]=Ouzhpennañ da roll tonioù Kaffeine
+Name[ca]=Afegeix al repertori de Kaffeine
+Name[cs]=Přidat do seznamu skladeb Kaffeine
+Name[da]=Tilføj til Kaffeines spilleliste
+Name[de]=An Kaffeine Wiedergabeliste anhängen
+Name[el]=Προσθήκη στη λίστα αναπαραγωγής του Kaffeine
+Name[es]=Añadir a la lista de reproducción de Kaffeine
+Name[et]=Lisa Kaffeine esitusnimekirja
+Name[fi]=Lisää Kaffeinen soittolistaan
+Name[fr]=Ajouter à la liste de lecture de Kaffeine
+Name[ga]=Iarcheangail leis an Seinmliosta Kaffeine
+Name[gl]=Engadir á Lista de Reprodución de Kaffeine
+Name[he]=הוסף לרשימת ניגון של Kaffeine
+Name[hu]=Hozzáfűzés a Kaffeine lejátszólistájához
+Name[is]=Bæta við Kaffeine lagalista
+Name[it]=Accoda alla playlist di Kaffeine
+Name[ja]=Kaffeine プレイリストに追加
+Name[ka]=დამატება Kaffeine-ის რეპერტუარში
+Name[km]=បន្ថែម​ទៅ​ខាង​ចុង​បញ្ជីចាក់ Kaffeine
+Name[lt]=Prijungti prie Kaffeine grojaraščio
+Name[nb]=Legg til i Kaffeines spilleliste
+Name[nl]=Toevoegen aan Kaffeine-afspeellijst
+Name[nn]=Legg til Kaffeine-speleliste
+Name[pa]=ਕੈਫ਼ੀਨ ਸੰਗੀਤ-ਸੂਚੀ ਵਿੱਚ ਸ਼ਾਮਲ
+Name[pl]=Dodaj do listy odtwarzania Kaffeine
+Name[pt]=Adicionar à Lista de Reprodução do Kaffeine
+Name[pt_BR]=Adicionar à Lista de Reprodução do Kaffeine
+Name[se]=Lasit Kaffeine-čuojahanlistu
+Name[sr]=Додај на Kaffeine-ову листу нумера
+Name[sr@Latn]=Dodaj na Kaffeine-ovu listu numera
+Name[sv]=Lägg till i Kaffeines spellista
+Name[tg]=Илова кардан ба рӯйхати мусиқии Kaffeine
+Name[th]=เพิ่มเข้าไปในรายการเล่นของ Kaffeine
+Name[tr]=Kaffeine Oynatma Listesine Ekle
+Name[uk]=Додати до списку композицій Kaffeine
+Name[xx]=xxAppend to Kaffeine Playlistxx
+Name[zh_CN]=追加到 Kaffeine 播放列表
+Name[zh_TW]=加入到 Kaffeine 播放列表
+Exec=dcop kaffeine KaffeineIface appendURL %u
+Icon=kaffeine
diff --git a/kaffeine/servicemenus/kaffeine_open_directory.desktop b/kaffeine/servicemenus/kaffeine_open_directory.desktop
new file mode 100644
index 0000000..ab09b0a
--- /dev/null
+++ b/kaffeine/servicemenus/kaffeine_open_directory.desktop
@@ -0,0 +1,51 @@
+[Desktop Entry]
+ServiceTypes=inode/directory
+Actions=kaffeine_open_dir;
+Encoding=UTF-8
+
+[Desktop Action kaffeine_open_dir]
+Name=Open with Kaffeine
+Name[af]=Maak met Kaffeine oop
+Name[ar]=أفتح مستخدما Kaffeine
+Name[bg]=Отваряне с Kaffeine
+Name[bn]=ক্যাফিন দিয়ে খোলো
+Name[br]=Digeriñ gant Kaffeine
+Name[ca]=Obre amb Kaffeine
+Name[cs]=Otevřít v Kaffeine
+Name[da]=Åbn med Kaffeine
+Name[de]=Mit Kaffeine öffnen
+Name[el]=Άνοιγμα με το Kaffeine
+Name[es]=Abrir con Kaffeine
+Name[et]=Ava Kaffeine'is
+Name[fi]=Avaa Kaffeinessa
+Name[fr]=Ouvrir avec Kaffeine
+Name[ga]=Oscail le Kaffeine
+Name[gl]=Abrir con Kaffeine
+Name[he]=פתח עם Kaffeine
+Name[hu]=Megnyitás a Kaffeine-nel
+Name[is]=Opna með Kaffeine
+Name[it]=Apri con Kaffeine
+Name[ja]=Kaffeine で開く
+Name[ka]=Kaffeine-ით გახსნა
+Name[km]=បើក​ជាមួយ Kaffeine
+Name[lt]=Atverti su Kaffeine
+Name[nb]=Åpne med Kaffeine
+Name[nl]=Openen met Kaffeine
+Name[nn]=Opna med Kaffeine
+Name[pa]=ਕੈਫ਼ੀਨ ਨਾਲ ਖੋਲ੍ਹੋ
+Name[pl]=Otwórz w Kaffeine
+Name[pt]=Abrir com o Kaffeine
+Name[pt_BR]=Abrir com o Kaffeine
+Name[se]=Raba Kaffeineain
+Name[sr]=Отвори Kaffeine-ом
+Name[sr@Latn]=Otvori Kaffeine-om
+Name[sv]=Öppna med Kaffeine
+Name[tg]=Кушодан бо Kaffeine
+Name[th]=เปิดด้วย Kaffeine
+Name[tr]=Kaffeine ile aç
+Name[uk]=Відкрити з Kaffeine
+Name[xx]=xxOpen with Kaffeinexx
+Name[zh_CN]=用 Kaffeine 打开
+Name[zh_TW]=以 Kaffeine 開啟
+Exec=kaffeine %U
+Icon=kaffeine
diff --git a/kaffeine/servicemenus/kaffeine_play_audiocd.desktop b/kaffeine/servicemenus/kaffeine_play_audiocd.desktop
new file mode 100644
index 0000000..65a72b8
--- /dev/null
+++ b/kaffeine/servicemenus/kaffeine_play_audiocd.desktop
@@ -0,0 +1,52 @@
+[Desktop Entry]
+ServiceTypes=media/audiocd
+Actions=Play;
+Encoding=UTF-8
+X-KDE-Priority=TopLevel
+
+[Desktop Action Play]
+Name=Play Audio CD with Kaffeine
+Name[af]=Speel oudio CD met Kaffeine
+Name[ar]=قراءة قرص مدمج صوتي بواسطة Kaffeine
+Name[bg]=Изпълнение на компактдиск с Kaffeine
+Name[bn]=ক্যাফিন দিয়ে অডিও সিডি চালাও
+Name[br]=Seniñ ur bladenn klevet gant Kaffeine
+Name[ca]=Reprodueix Audio CD amb Kaffeine
+Name[cs]=Pehrát audio CD Kaffeine
+Name[da]=Spil lyd-cd med Kaffeine
+Name[de]=Audio-CD mit Kaffeine abspielen
+Name[el]=Αναπαραγωγή CD ήχου με το Kaffeine
+Name[es]=Reproducir CD de audio con Kaffeine
+Name[et]=Esita audio-CD Kaffeine'is
+Name[fi]=Soita musiikki-cd Kaffeinessa
+Name[fr]=Jouer un CD Audio avec Kaffeine
+Name[ga]=Seinn CD Fuaime le Kaffeine
+Name[gl]=Reproducir o CD de Áudio con Kaffeine
+Name[he]=נגן תקליטור שמע עם Kaffeine
+Name[hu]=Hang-CD lejátszása a Kaffeine-nel
+Name[is]=Spila tónlistardisk með Kaffeine
+Name[it]=Riproduci CD audio con Kaffeine
+Name[ja]=Kaffeine でオーディオ CD を再生
+Name[ka]=აუდიო CD-ის დაკვრა Kaffeine-ით
+Name[km]=ចាក់​ស៊ីឌី​អូឌីយ៉ូ​​ជាមួយ Kaffeine
+Name[lt]=Groti Audio CD su Kaffeine
+Name[nb]=Spill lyd-CD med Kaffeine
+Name[nl]=Audio-cd met Kaffeine afspelen
+Name[nn]=Spel lyd-CD med Kaffeine
+Name[pa]=ਕੈਫ਼ੀਨ ਨਾਲ ਆਡੀਓ CD ਚਲਾਓ
+Name[pl]=Odtwarzaj Audio CD w Kaffeine
+Name[pt]=Tocar o CD de Áudio com o Kaffeine
+Name[pt_BR]=Reproduzir o CD de Áudio com o Kaffeine
+Name[se]=Čuojat jietna-CD:a Kaffeineain
+Name[sr]=Пустио аудио CD Kaffeine-ом
+Name[sr@Latn]=Pustio audio CD Kaffeine-om
+Name[sv]=Spela ljud-cd med Kaffeine
+Name[tg]=Навозиши диски аудио бо Kaffeine
+Name[th]=เล่นซีดีบันทึกเสียงด้วย Kaffeine
+Name[tr]=Kaffeine ile Ses CD'si Çal
+Name[uk]=Програти аудіо-КД з Kaffeine
+Name[xx]=xxPlay Audio CD with Kaffeinexx
+Name[zh_CN]=用 Kaffeine 播放音频 CD
+Name[zh_TW]=使用 Kaffeine 播放音樂 CD
+Icon=kaffeine
+Exec=kaffeine -d %u AudioCD
diff --git a/kaffeine/servicemenus/kaffeine_play_dvd.desktop b/kaffeine/servicemenus/kaffeine_play_dvd.desktop
new file mode 100644
index 0000000..436d3cd
--- /dev/null
+++ b/kaffeine/servicemenus/kaffeine_play_dvd.desktop
@@ -0,0 +1,52 @@
+[Desktop Entry]
+ServiceTypes=media/dvdvideo
+Actions=Play;
+Encoding=UTF-8
+X-KDE-Priority=TopLevel
+
+[Desktop Action Play]
+Name=Play DVD with Kaffeine
+Name[af]=Speel DVD met Kaffeiene
+Name[ar]=قراءة قرص رقمي مرئي بواسطة Kaffeine
+Name[bg]=Изпълнение на DVD с Kaffeine
+Name[bn]=ক্যাফিন দিয়ে ডিভিডি চালাও
+Name[br]=Seniñ an DVD gant Kaffeine
+Name[ca]=Reprodueix DVD amb Kaffeine
+Name[cs]=Přehrát DVD v Kaffeine
+Name[da]=Spil dvd med Kaffeine
+Name[de]=DVD mit Kaffeine abspielen
+Name[el]=Αναπαραγωγή DVD με το Kaffeine
+Name[es]=Reproducir DVD con Kaffeine
+Name[et]=Esita DVD Kaffeine'is
+Name[fi]=Toista dvd-levy Kaffeinessa
+Name[fr]=Lire le DVD avec Kaffeine
+Name[ga]=Seinn DVD le Kaffeine
+Name[gl]=Ver o DVD con Kaffeine
+Name[he]=נגן תקליטור DVD עם Kaffeine
+Name[hu]=DVD lejátszása a Kaffeine-nel
+Name[is]=Spila DVD með Kaffeine
+Name[it]=Riproduci DVD con Kaffeine
+Name[ja]=Kaffeine で DVD を再生
+Name[ka]=DVD-ის დაკვრა Kaffeine-ით
+Name[km]=ចាក់​ឌីវីឌី​ជាមួយ Kaffeine
+Name[lt]=Groti DVD su Kaffeine
+Name[nb]=Spill DVD med Kaffeine
+Name[nl]=DVD met Kaffeine afspelen
+Name[nn]=Spel DVD med Kaffeine
+Name[pa]=ਕੈਫ਼ੀਨ ਨਾਲ DVD ਚਲਾਓ
+Name[pl]=Odtwarzaj DVD w Kaffeine
+Name[pt]=Ver o DVD com o Kaffeine
+Name[pt_BR]=Reproduzir o DVD com o Kaffeine
+Name[se]=Čuojat DVD:a Kaffeineain
+Name[sr]=Пусти DVD Kaffeine-ом
+Name[sr@Latn]=Pusti DVD Kaffeine-om
+Name[sv]=Spela dvd med Kaffeine
+Name[tg]=Намоиши DVD бо Kaffeine
+Name[th]=เล่นดีวีดีด้วย Kaffeine
+Name[tr]=DVD'yi Kaffeine ile oynat
+Name[uk]=Програти DVD з Kaffeine
+Name[xx]=xxPlay DVD with Kaffeinexx
+Name[zh_CN]=用 Kaffeine 播放 DVD
+Name[zh_TW]=使用 Kaffeine 播放 DVD
+Icon=kaffeine
+Exec=kaffeine -d %u DVD
diff --git a/kaffeine/servicemenus/kaffeine_play_vcd.desktop b/kaffeine/servicemenus/kaffeine_play_vcd.desktop
new file mode 100644
index 0000000..3ab57f7
--- /dev/null
+++ b/kaffeine/servicemenus/kaffeine_play_vcd.desktop
@@ -0,0 +1,52 @@
+[Desktop Entry]
+ServiceTypes=media/svcd,media/vcd
+Actions=Play;
+Encoding=UTF-8
+X-KDE-Priority=TopLevel
+
+[Desktop Action Play]
+Name=Play VCD with Kaffeine
+Name[af]=Speel VCD met Kaffeine
+Name[ar]= قراءة قرص مدمج مرئي VCD بواسطة Kaffeine
+Name[bg]=Изпълнение на VCD с Kaffeine
+Name[bn]=ক্যাফিন দিয়ে ভিসিডি চালাও
+Name[br]=Seniñ ar VCD gant Kaffeine
+Name[ca]=Reprodueix VCD amb Kaffeine
+Name[cs]=Přehrát VCD v Kaffeine
+Name[da]=Spil vcd med Kaffeine
+Name[de]=VCD mit Kaffeine abspielen
+Name[el]=Αναπαραγωγή VCD με το Kaffeine
+Name[es]=Reproducir VCD con Kaffeine
+Name[et]=Esita VCD Kaffeine'is
+Name[fi]=Toista videocd-levy Kaffeinessa
+Name[fr]=Lire le VCD avec Kaffeine
+Name[ga]=Seinn VCD le Kaffeine
+Name[gl]=Ver o VCD con Kaffeine
+Name[he]=נגן תקליטור VCD עם Kaffeine
+Name[hu]=VCD lejátszása a Kaffeine-nel
+Name[is]=Spila VCD með Kaffeine
+Name[it]=Riproduci VCD con Kaffeine
+Name[ja]=Kaffeine で VCD を再生
+Name[ka]=VCD-ის დაკვრა Kaffeine-ით
+Name[km]=ចាក់​វីស៊ីឌី​ជា​មួយ Kaffeine
+Name[lt]=Groti VCD su Kaffeine
+Name[nb]=Spill VCD med Kaffeine
+Name[nl]=VCD met Kaffeine afspelen
+Name[nn]=Spel VCD med Kaffeine
+Name[pa]=ਕੈਫ਼ੀਨ ਨਾਲ VCD ਚਲਾਓ
+Name[pl]=Odtwarzaj VCD w Kaffeine
+Name[pt]=Ver o VCD com o Kaffeine
+Name[pt_BR]=Reproduzir o VCD com o Kaffeine
+Name[se]=Čuojat VCD:a Kaffeineain
+Name[sr]=Пусти VCD Kaffeine-ом
+Name[sr@Latn]=Pusti VCD Kaffeine-om
+Name[sv]=Spela vcd med Kaffeine
+Name[tg]=Намоиши VCD бо Kaffeine
+Name[th]=เล่นวิดีโอซีดีด้วย Kaffeine
+Name[tr]=CD'yi Kaffeine ile oynat
+Name[uk]=Програти VCD з Kaffeine
+Name[xx]=xxPlay VCD with Kaffeinexx
+Name[zh_CN]=用 Kaffeine 播放 VCD
+Name[zh_TW]=使用 Kaffeine 播放 VCD
+Icon=kaffeine
+Exec=kaffeine -d %u VCD
diff --git a/kaffeine/src/Makefile.am b/kaffeine/src/Makefile.am
new file mode 100644
index 0000000..e832491
--- /dev/null
+++ b/kaffeine/src/Makefile.am
@@ -0,0 +1,53 @@
+SUBDIRS = player-parts input
+
+bin_PROGRAMS = kaffeine
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/ \
+ -I$(top_srcdir)/kaffeine/src/input/dvb/ \
+ -I$(top_builddir)/kaffeine/src/input/dvb/plugins/epg \
+ -I$(top_srcdir)/kaffeine/src/input/dvb/plugins/epg \
+ -I$(top_builddir)/kaffeine/src/input/dvb/ \
+ -I$(top_builddir)/kaffeine/src/input/disc/ \
+ -I$(top_srcdir)/kaffeine/src/input/disc/ \
+ -I$(top_srcdir)/kaffeine/src/input/disc/plugins \
+ -I$(top_srcdir)/kaffeine/src/player-parts/kaffeine-part \
+ -I$(top_srcdir)/kaffeine/src/input/dvbclient/ \
+ -I$(top_srcdir)/kaffeine/src/input/audiobrowser/ \
+ $(all_includes) $(CFLAGS_DPMS) $(CFLAGS_XTEST)
+
+METASOURCES = AUTO
+
+kaffeine_SOURCES = main.cpp \
+ kaffeine.cpp \
+ startwindow.cpp \
+ pref.cpp \
+ kaffeineiface.skel \
+ systemtray.cpp \
+ instwizard.cpp\
+ kmultitabbar.cpp \
+ inputmanager.cpp
+
+kaffeine_LDFLAGS = $(all_libraries) $(KDE_RPATH)
+
+if with_dvb
+ DVBLIB = input/dvb/libkaffeinedvb.la
+endif
+
+kaffeine_LDADD = $(LIB_KPARTS) \
+ player-parts/kaffeine-part/libkaffeinepart.la \
+ input/dvbclient/libkaffeinedvbclient.la \
+ input/audiobrowser/libkaffeineaudiobrowser.la \
+ input/disc/libkaffeinedisc.la \
+ $(DVBLIB) $(LIB_DPMS) $(LIB_XTEST)
+
+# this is where the desktop file will go
+shelldesktopdir = $(xdg_appsdir)
+shelldesktop_DATA = kaffeine.desktop
+
+# this is where the XML-GUI resource file goes
+shellrcdir = $(kde_datadir)/kaffeine
+shellrc_DATA = kaffeineui.rc
+
+# this is where profile file for KDE-LIRC goes
+profiledata_DATA = kaffeine.profile.xml
+profiledatadir = $(kde_datadir)/profiles
diff --git a/kaffeine/src/drivescombo.cpp b/kaffeine/src/drivescombo.cpp
new file mode 100644
index 0000000..a33eb2b
--- /dev/null
+++ b/kaffeine/src/drivescombo.cpp
@@ -0,0 +1,60 @@
+/*
+ * drivescombo.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "drivescombo.h"
+
+#include <kdebug.h>
+
+#include <qfile.h>
+
+DrivesCombo::DrivesCombo(QWidget* parent, const char* name)
+ : KComboBox(parent, name)
+{
+ setEditable(true);
+
+ QFile file("/etc/fstab");
+ if (file.open(IO_ReadOnly))
+ {
+ QTextStream stream(&file);
+ QString line;
+ QStringList drives;
+
+ while (!stream.eof())
+ {
+ line = stream.readLine();
+ if (line.contains("cdfss"))
+ {
+ kdDebug() << "DrivesCombo: found disc drive: " << line.section(' ', 0, 0) << endl;
+ drives.append(line.section(' ', 0, 0));
+ }
+ }
+ insertStringList(drives);
+ }
+ file.close();
+}
+
+
+DrivesCombo::~DrivesCombo()
+{
+}
diff --git a/kaffeine/src/drivescombo.h b/kaffeine/src/drivescombo.h
new file mode 100644
index 0000000..05b28ef
--- /dev/null
+++ b/kaffeine/src/drivescombo.h
@@ -0,0 +1,43 @@
+/*
+ * drivescombo.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DRIVESCOMBO_H
+#define DRIVESCOMBO_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kcombobox.h>
+
+/**
+Let user choose the disc drive. Takes presets from /etc/fstab.
+
+@author Juergen Kofler
+*/
+class DrivesCombo : public KComboBox
+{
+public:
+ DrivesCombo(QWidget* parent, const char* name = 0);
+ virtual ~DrivesCombo();
+
+};
+
+#endif /* DRIVESCOMBO_H */
diff --git a/kaffeine/src/input/Makefile.am b/kaffeine/src/input/Makefile.am
new file mode 100644
index 0000000..75b2ab7
--- /dev/null
+++ b/kaffeine/src/input/Makefile.am
@@ -0,0 +1,21 @@
+noinst_LTLIBRARIES = libkaffeineinput.la
+
+if with_dvb
+ DVB_SUBDIR = dvb
+endif
+
+SUBDIRS = . dvbclient audiobrowser disc $(DVB_SUBDIR)
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src \
+ -I$(top_srcdir)/kaffeine/src/player-parts/kaffeine-part $(all_includes)
+
+noinst_HEADERS = kaffeineinput.h
+
+METASOURCES = AUTO
+
+libkaffeineinput_la_SOURCES = kaffeineinput.cpp
+
+libkaffeineinput_la_LDFLAGS = $(KDE_RPATH) \
+ $(all_libraries)
+
+libkaffeineinput_la_LIBADD = $(top_builddir)/kaffeine/src/player-parts/kaffeine-part/libkaffeinepart.la
diff --git a/kaffeine/src/input/audiobrowser/Makefile.am b/kaffeine/src/input/audiobrowser/Makefile.am
new file mode 100644
index 0000000..b743ccd
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/Makefile.am
@@ -0,0 +1,28 @@
+METASOURCES = AUTO
+
+noinst_LTLIBRARIES = libkaffeineaudiobrowser.la
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/ \
+ -I$(top_srcdir)/kaffeine/src/ \
+ $(all_includes) \
+ -I$(top_srcdir)/kaffeine/src/player-parts/kaffeine-part
+
+libkaffeineaudiobrowser_la_SOURCES = playlist.cpp \
+ playlistitem.cpp \
+ urllistview.cpp \
+ googlefetcher.cpp \
+ googlefetcherdialog.cpp
+
+KDE_CXXFLAGS = $(USE_EXCEPTIONS)
+
+libkaffeineaudiobrowser_la_LDFLAGS = $(KDE_RPATH) \
+ $(all_libraries) \
+ -L$(top_srcdir)/kaffeine/src/input
+
+libkaffeineaudiobrowser_la_LIBADD = $(top_builddir)/kaffeine/src/input/libkaffeineinput.la \
+ $(top_builddir)/kaffeine/src/player-parts/kaffeine-part/libkaffeinepart.la \
+ $(LIB_KHTML)
+
+# this is where the XML-GUI resource file goes
+shellrcdir = $(kde_datadir)/kaffeine
+shellrc_DATA = kaffeineplaylist.rc
diff --git a/kaffeine/src/input/audiobrowser/googlefetcher.cpp b/kaffeine/src/input/audiobrowser/googlefetcher.cpp
new file mode 100644
index 0000000..fe88d14
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/googlefetcher.cpp
@@ -0,0 +1,282 @@
+/*
+ * googlefetcher.cpp
+ *
+ * Copyright (C) 2004 Nathan Toone <nathan@toonetown.com>
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <dom/html_document.h>
+#include <dom/html_misc.h>
+#include <dom/html_table.h>
+#include <dom/dom_exception.h>
+#include <dom/dom2_traversal.h>
+
+#include <khtml_part.h>
+
+#include <klocale.h>
+#include <kinputdialog.h>
+#include <kurl.h>
+#include <kio/netaccess.h>
+
+#include "googlefetcher.h"
+#include "googlefetcherdialog.h"
+
+GoogleImage::GoogleImage(QString thumbURL, QString size)
+{
+ // thumbURL is in the following format - and we can regex the imageURL
+ // images?q=tbn:hKSEWNB8aNcJ:www.styxnet.com/deyoung/styx/stygians/cp_portrait.jpg
+ m_thumbURL = thumbURL.replace("\"","");
+ m_imageURL = thumbURL.remove(QRegExp("^.*q=tbn:[^:]*:")).replace("\"","");
+ m_size = size.replace("pixels - ", "\n(") + ")";
+}
+
+
+GoogleFetcher::GoogleFetcher( QString artist, QString album, bool gallery )
+{
+ m_artist = artist;
+ m_album = album;
+ m_searchString = artist+" "+album;
+ encoding = 0;
+ galleryImage=galleryPage=0;
+ galleryMode = gallery;
+}
+
+void GoogleFetcher::slotLoadImageURLs(GoogleFetcher::ImageSize size)
+{
+ if(m_loadedQuery == m_searchString && m_loadedSize == size)
+ return;
+
+ m_imageList.clear();
+
+ KURL url("http://images.google.com/images");
+ if ( encoding )
+ url.addQueryItem("q", m_searchString,encoding);
+ else
+ url.addQueryItem("q", m_searchString);
+
+ switch (size) {
+ case XLarge:
+ url.addQueryItem("imgsz", "xlarge|xxlarge");
+ break;
+ case Large:
+ url.addQueryItem("imgsz", "large");
+ break;
+ case Medium:
+ url.addQueryItem("imgsz", "medium");
+ break;
+ case Small:
+ url.addQueryItem("imgsz", "small");
+ break;
+ case Icon:
+ url.addQueryItem("imgsz", "icon");
+ break;
+ default:
+ break;
+ }
+
+ m_loadedQuery = m_searchString;
+ m_loadedSize = size;
+
+ // We don't normally like exceptions but missing DOMException will kill
+ // JuK rather abruptly whether we like it or not so we don't really have a
+ // choice if we're going to screen-scrape Google.
+ try {
+
+ KHTMLPart part;
+
+ // Create empty document.
+
+ part.begin();
+ part.end();
+
+ DOM::Document search = part.document();
+ search.setAsync(false); // Grab the document before proceeding.
+
+ kdDebug() << "Performing Google Search: " << url << endl;
+
+ search.load(url.url()+QString("&start=%1&sa=N").arg(galleryPage*20) );
+
+ QString text = search.toString().string();
+
+ if ( !hasImageResults(text) ) {
+ kdDebug() << "Search returned no results.\n";
+ emit signalNewSearch(m_imageList);
+ return;
+ }
+
+ // Go through each of the top (table) nodes
+
+ int pos = text.find("/imgres?imgurl");
+ int tpos;
+ QString s, c;
+ while ( pos>-1 ) {
+ text = text.right( text.length()-pos-14 );
+ tpos = text.find("&h=");
+ text = text.right( text.length()-tpos-3 );
+ tpos = text.find("&w=");
+ c = "pixels - " + text.left( tpos );
+ text = text.right( text.length()-tpos-3 );
+ tpos = text.find("&sz=");
+ c = c + "x" + text.left( tpos );
+ tpos = text.find("src=");
+ text = text.right( text.length()-tpos-4 );
+ if ( (tpos=text.find("width="))==-1 )
+ break;
+ s = text.left( tpos-1 );
+ text = text.right( text.length()-tpos );
+ if ( (tpos=text.find("></a>"))==-1 )
+ break;
+ m_imageList.append(GoogleImage(s, c));
+ pos = text.find("/imgres?imgurl");
+ }
+ } // try
+ catch (DOM::DOMException &e)
+ {
+ kdError() << "Caught DOM Exception: " << e.code << endl;
+ }
+ catch (...)
+ {
+ kdError() << "Caught unknown exception.\n";
+ }
+
+ emit signalNewSearch(m_imageList);
+}
+
+QImage GoogleFetcher::galleryNext( bool &end )
+{
+ QString file;
+ QImage image;
+ m_loadedSize = All;
+ int tries = 0;
+ end = false;
+
+ while ( tries<3 ) {
+ if( m_imageList.isEmpty() ) {
+ if ( tries==0 ) {
+ encoding = 0;
+ m_loadedQuery = "";
+ ++tries;
+ displayWaitMessage();
+ }
+ else if ( tries==1 ) {
+ encoding = 4; // try iso8859-1
+ m_loadedQuery = "";
+ ++tries;
+ kdDebug() << "Trying iso8859-1" << endl;
+ displayWaitMessage();
+ }
+ else {
+ end = true;
+ return QImage();
+ }
+ }
+ else {
+ if(KIO::NetAccess::download( m_imageList[galleryImage].imageURL(), file, 0))
+ image = QImage(file);
+ else
+ image = QImage();
+ ++galleryImage;
+ if ( galleryImage==(int)m_imageList.count() ) {
+ m_imageList.clear();
+ galleryImage = 0;
+ ++galleryPage;
+ }
+ KIO::NetAccess::removeTempFile(file);
+ return image;
+ }
+ }
+ return QImage();
+}
+
+QPixmap GoogleFetcher::pixmap( bool forceFetch )
+{
+ bool chosen = false;
+ m_loadedSize = All;
+ int tries = 0;
+
+ encoding = 0;
+ displayWaitMessage();
+
+ QPixmap pixmap;
+
+ while(!chosen) {
+
+ if(m_imageList.isEmpty())
+ switch(tries) {
+ case 0:
+ encoding = 4; // try iso8859-1
+ m_loadedQuery = "";
+ ++tries;
+ kdDebug() << "Trying iso8859-1" << endl;
+ displayWaitMessage();
+ break;
+ default :
+ if ( forceFetch == true )
+ chosen = !requestNewSearchTerms(true);
+ else
+ chosen = true;
+ }
+ else {
+ GoogleFetcherDialog dialog("google", m_imageList, m_artist, m_album, 0);
+ connect(&dialog, SIGNAL(sizeChanged(GoogleFetcher::ImageSize)),
+ this, SLOT(slotLoadImageURLs(GoogleFetcher::ImageSize)));
+ connect(this, SIGNAL(signalNewSearch(GoogleImageList &)),
+ &dialog, SLOT(refreshScreen(GoogleImageList &)));
+ dialog.exec();
+ pixmap = dialog.result();
+ chosen = dialog.takeIt();
+
+ if(dialog.newSearch())
+ requestNewSearchTerms();
+ }
+ }
+ return pixmap;
+}
+
+void GoogleFetcher::displayWaitMessage()
+{
+ //KStatusBar *statusBar = static_cast<KMainWindow *>(kapp->mainWidget())->statusBar();
+ //statusBar->message(i18n("Searching for Images. Please Wait..."));
+ slotLoadImageURLs();
+ //statusBar->clear();*/
+}
+
+bool GoogleFetcher::requestNewSearchTerms(bool noResults)
+{
+ bool ok;
+ m_searchString = KInputDialog::getText(i18n("Cover Downloader"),
+ noResults ?
+ i18n("No matching images found, please enter new search terms:") :
+ i18n("Enter new search terms:"),
+ m_searchString, &ok);
+ if(ok && !m_searchString.isEmpty())
+ displayWaitMessage();
+ else
+ m_searchString = m_loadedQuery;
+
+ return ok;
+}
+
+bool GoogleFetcher::hasImageResults( QString &doc )
+{
+ if ( !doc.contains( "/imgres?imgurl" ) )
+ return false;
+
+ return true;
+}
+
+#include "googlefetcher.moc"
diff --git a/kaffeine/src/input/audiobrowser/googlefetcher.h b/kaffeine/src/input/audiobrowser/googlefetcher.h
new file mode 100644
index 0000000..7c90091
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/googlefetcher.h
@@ -0,0 +1,91 @@
+/*
+ * googlefetcher.h
+ *
+ * Copyright (C) 2004 Nathan Toone <nathan@toonetown.com>
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef GOOGLEFETCHER_H
+#define GOOGLEFETCHER_H
+
+#include <kdialogbase.h>
+
+#include <qpixmap.h>
+#include <qstringlist.h>
+#include <qregexp.h>
+
+namespace DOM {
+ class HTMLDocument;
+}
+
+class KURL;
+
+class GoogleImage
+{
+public:
+ GoogleImage(QString thumbURL = QString::null, QString size = QString::null);
+
+ QString imageURL() const { return m_imageURL; }
+ QString thumbURL() const { return m_thumbURL; }
+ QString size() const { return m_size; }
+
+private:
+ QString m_imageURL;
+ QString m_thumbURL;
+ QString m_size;
+};
+
+typedef QValueList<GoogleImage> GoogleImageList;
+
+class GoogleFetcher : public QObject
+{
+ Q_OBJECT
+
+public:
+ enum ImageSize { All, Icon, Small, Medium, Large, XLarge };
+
+ GoogleFetcher( QString artist, QString album, bool gallery=false );
+ QPixmap pixmap( bool forceFetch = false );
+ QImage galleryNext( bool &end );
+
+signals:
+ void signalNewSearch(GoogleImageList &images);
+
+private:
+ void displayWaitMessage();
+ bool requestNewSearchTerms(bool noResults = false);
+
+ // Returns true if there are results in the search, otherwise returns false.
+ bool hasImageResults( QString &doc );
+
+private slots:
+ void slotLoadImageURLs(GoogleFetcher::ImageSize size = All);
+
+private:
+ QString m_artist, m_album;
+ QString m_searchString;
+ QString m_loadedQuery;
+ ImageSize m_loadedSize;
+ GoogleImageList m_imageList;
+ uint m_selectedIndex;
+ int encoding;
+ int galleryImage;
+ int galleryPage;
+ bool galleryMode;
+};
+
+#endif /* GOOGLEFETCHER_H */
diff --git a/kaffeine/src/input/audiobrowser/googlefetcherdialog.cpp b/kaffeine/src/input/audiobrowser/googlefetcherdialog.cpp
new file mode 100644
index 0000000..bda3853
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/googlefetcherdialog.cpp
@@ -0,0 +1,254 @@
+/*
+ * googlefetcherdialog.cpp
+ *
+ * Copyright (C) 2004 Nathan Toone <nathan@toonetown.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <kapplication.h>
+#include <kio/netaccess.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kmessagebox.h>
+#include <kcombobox.h>
+
+#include <qhbox.h>
+#include <qimage.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qeventloop.h>
+
+#include "googlefetcherdialog.h"
+
+GoogleFetcherDialog::GoogleFetcherDialog(const QString &name,
+ const GoogleImageList &imageList,
+ const QString &artist,
+ const QString &album,
+ QWidget *parent) :
+ KDialogBase(parent, name.latin1(), true, QString::null,
+ Ok | Cancel | User1 , NoDefault, true),
+ m_pixmap(QPixmap()),
+ m_imageList(imageList),
+ m_takeIt(false),
+ m_newSearch(false)
+{
+ m_artist = artist;
+ m_album = album;
+ disableResize();
+
+ QHBox *mainBox = new QHBox(this);
+ m_iconWidget = new KIconView(mainBox);
+ m_iconWidget->setResizeMode(QIconView::Adjust);
+ m_iconWidget->setSelectionMode(QIconView::Extended);
+ m_iconWidget->setSpacing(10);
+ m_iconWidget->setMode(KIconView::Execute);
+ m_iconWidget->setFixedSize(500,550);
+ m_iconWidget->arrangeItemsInGrid();
+ m_iconWidget->setItemsMovable(FALSE);
+
+ QHBox *imgSize = new QHBox(actionButton(User1)->parentWidget());
+ //QLabel *label = new QLabel(imgSize);
+ //label->setText(i18n("Image size:"));
+
+ KComboBox *combo = new KComboBox(imgSize);
+ combo->insertItem(i18n("All Sizes"));
+ combo->insertItem(i18n("Very Small"));
+ combo->insertItem(i18n("Small"));
+ combo->insertItem(i18n("Medium"));
+ combo->insertItem(i18n("Large"));
+ combo->insertItem(i18n("Very Large"));
+ combo->setCurrentItem(0);
+ connect(combo, SIGNAL(activated(int)), this, SLOT(imgSizeChanged(int)));
+ connect(m_iconWidget, SIGNAL( executed(QIconViewItem*) ), this, SLOT(slotOk()));
+
+ imgSize->adjustSize();
+ setMainWidget(mainBox);
+ setButtonText(User1, i18n("New Search"));
+}
+
+GoogleFetcherDialog::~GoogleFetcherDialog()
+{
+
+}
+
+void GoogleFetcherDialog::setLayout()
+{
+ setCaption(QString("%1 - %2 (%3)")
+ .arg(m_artist)
+ .arg(m_album)
+ .arg(m_imageList.size()));
+
+ m_iconWidget->clear();
+ for(uint i = 0; i < m_imageList.size(); i++)
+ new CoverIconViewItem(m_iconWidget, m_imageList[i]);
+
+ adjustSize();
+}
+
+void GoogleFetcherDialog::setImageList(const GoogleImageList &imageList)
+{
+ m_imageList=imageList;
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// public slots
+////////////////////////////////////////////////////////////////////////////////
+
+void GoogleFetcherDialog::refreshScreen(GoogleImageList &imageList)
+{
+ setImageList(imageList);
+ setLayout();
+}
+
+int GoogleFetcherDialog::exec()
+{
+ setLayout();
+ return KDialogBase::exec();
+}
+
+void GoogleFetcherDialog::slotOk()
+{
+ uint selectedIndex = m_iconWidget->index(m_iconWidget->currentItem());
+ m_pixmap = pixmapFromURL(m_imageList[selectedIndex].imageURL());
+
+ if(m_pixmap.isNull()) {
+ KMessageBox::sorry(this,
+ i18n("The cover you have selected is unavailable. Please select another."),
+ i18n("Cover Unavailable"));
+ QPixmap blankPix;
+ blankPix.resize(80, 80);
+ blankPix.fill();
+ m_iconWidget->currentItem()->setPixmap(blankPix, true, true);
+ return;
+ }
+
+ m_takeIt = true;
+ m_newSearch = false;
+ hide();
+}
+
+void GoogleFetcherDialog::slotCancel()
+{
+ m_takeIt = true;
+ m_newSearch = false;
+ m_pixmap = QPixmap();
+ hide();
+}
+
+void GoogleFetcherDialog::slotUser1()
+{
+ m_takeIt = false;
+ m_newSearch = true;
+ m_pixmap = QPixmap();
+ hide();
+}
+
+void GoogleFetcherDialog::imgSizeChanged(int index)
+{
+ GoogleFetcher::ImageSize imageSize = GoogleFetcher::All;
+ switch (index) {
+ case 1:
+ imageSize = GoogleFetcher::Icon;
+ break;
+ case 2:
+ imageSize = GoogleFetcher::Small;
+ break;
+ case 3:
+ imageSize = GoogleFetcher::Medium;
+ break;
+ case 4:
+ imageSize=GoogleFetcher::Large;
+ break;
+ case 5:
+ imageSize=GoogleFetcher::XLarge;
+ break;
+ default:
+ break;
+ }
+ emit sizeChanged(imageSize);
+}
+
+QPixmap GoogleFetcherDialog::fetchedImage(uint index) const
+{
+ return (index > m_imageList.count()) ? QPixmap() : pixmapFromURL(m_imageList[index].imageURL());
+}
+
+QPixmap GoogleFetcherDialog::pixmapFromURL(const KURL &url) const
+{
+ QString file;
+
+ if(KIO::NetAccess::download(url, file, 0)) {
+ QPixmap pixmap = QPixmap(file);
+ KIO::NetAccess::removeTempFile(file);
+ return pixmap;
+ }
+ KIO::NetAccess::removeTempFile(file);
+ return QPixmap();
+}
+
+////////////////////////////////////////////////////////////////////////////////
+// CoverIconViewItem
+////////////////////////////////////////////////////////////////////////////////
+
+CoverIconViewItem::CoverIconViewItem(QIconView *parent, const GoogleImage &image) :
+ QObject(parent), KIconViewItem(parent, parent->lastItem(), image.size()), m_job(0)
+{
+ // Set up the iconViewItem
+
+ QPixmap mainMap;
+ mainMap.resize(80, 80);
+ mainMap.fill();
+ setPixmap(mainMap, true, true);
+
+ // Start downloading the image.
+
+ m_job = KIO::get(image.thumbURL(), false, false);
+ connect(m_job, SIGNAL(result(KIO::Job *)), this, SLOT(imageResult(KIO::Job *)));
+ connect(m_job, SIGNAL(data(KIO::Job *, const QByteArray &)),
+ this, SLOT(imageData(KIO::Job *, const QByteArray &)));
+}
+
+CoverIconViewItem::~CoverIconViewItem()
+{
+ if(m_job) {
+ m_job->kill();
+
+ // Drain results issued by KIO before being deleted,
+ // and before deleting the job.
+ kapp->eventLoop()->processEvents(QEventLoop::ExcludeUserInput);
+
+ delete m_job;
+ }
+}
+
+void CoverIconViewItem::imageData(KIO::Job *, const QByteArray &data)
+{
+ int currentSize = m_buffer.size();
+ m_buffer.resize(currentSize + data.size(), QGArray::SpeedOptim);
+ memcpy(&(m_buffer.data()[currentSize]), data.data(), data.size());
+}
+
+void CoverIconViewItem::imageResult(KIO::Job *job)
+{
+ if(job->error())
+ return;
+
+ QPixmap iconImage(m_buffer);
+ iconImage = QImage(iconImage.convertToImage()).smoothScale(80, 80);
+ setPixmap(iconImage, true, true);
+}
+
+#include "googlefetcherdialog.moc"
diff --git a/kaffeine/src/input/audiobrowser/googlefetcherdialog.h b/kaffeine/src/input/audiobrowser/googlefetcherdialog.h
new file mode 100644
index 0000000..48ec70c
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/googlefetcherdialog.h
@@ -0,0 +1,98 @@
+/*
+ * googlefetcherdialog.h
+ *
+ * Copyright (C) 2004 Nathan Toone <nathan@toonetown.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef GOOGLEFETCHERDIALOG_H
+#define GOOGLEFETCHERDIALOG_H
+
+#include <kiconview.h>
+#include <kio/job.h>
+
+#include "googlefetcher.h"
+
+class KURL;
+
+class GoogleFetcherDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ GoogleFetcherDialog(const QString &name,
+ const GoogleImageList &urlList,
+ const QString &artist,
+ const QString &album,
+ QWidget *parent = 0);
+
+ virtual ~GoogleFetcherDialog();
+
+ QPixmap result() const { return m_pixmap; }
+ bool takeIt() const { return m_takeIt; }
+ bool newSearch() const { return m_newSearch; }
+
+ void setLayout();
+ void setImageList(const GoogleImageList &urlList);
+
+public slots:
+ int exec();
+ void refreshScreen(GoogleImageList &list);
+
+signals:
+ void sizeChanged(GoogleFetcher::ImageSize);
+
+protected slots:
+ void slotOk();
+ void slotCancel();
+ void slotUser1();
+ void imgSizeChanged(int index);
+
+private:
+ QPixmap fetchedImage(uint index) const;
+ QPixmap pixmapFromURL(const KURL &url) const;
+
+ QPixmap m_pixmap;
+ GoogleImageList m_imageList;
+ KIconView *m_iconWidget;
+ bool m_takeIt;
+ bool m_newSearch;
+ QString m_artist, m_album;
+};
+
+namespace KIO
+{
+ class TransferJob;
+}
+
+class CoverIconViewItem : public QObject, public KIconViewItem
+{
+ Q_OBJECT
+
+public:
+ CoverIconViewItem(QIconView *parent, const GoogleImage &image);
+ ~CoverIconViewItem();
+
+private slots:
+ void imageData(KIO::Job *job, const QByteArray &data);
+ void imageResult(KIO::Job* job);
+
+private:
+ QByteArray m_buffer;
+ QGuardedPtr<KIO::TransferJob> m_job;
+};
+
+#endif /* GOOGLEFETCHERDIALOG_H */
diff --git a/kaffeine/src/input/audiobrowser/kaffeineplaylist.rc b/kaffeine/src/input/audiobrowser/kaffeineplaylist.rc
new file mode 100644
index 0000000..a274d74
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/kaffeineplaylist.rc
@@ -0,0 +1,17 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="kaffeineplaylist" version="4">
+<MenuBar>
+ <Menu name="playlist"><text>Play&amp;list</text>
+ <Action name="playlist_shuffle"/>
+ <Action name="playlist_repeat"/>
+ <Action name="playlist_autocover"/>
+ <Action name="playlist_showplayer"/>
+ <Separator/>
+ <Action name="playlist_clear"/>
+ <Action name="playlist_new"/>
+ <Action name="playlist_load"/>
+ <Action name="playlist_save_as"/>
+ <Action name="playlist_remove"/>
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/kaffeine/src/input/audiobrowser/playlist.cpp b/kaffeine/src/input/audiobrowser/playlist.cpp
new file mode 100644
index 0000000..480d70b
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/playlist.cpp
@@ -0,0 +1,2365 @@
+/*
+ * playlist.cpp
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2005-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <krandomsequence.h>
+#include <kapplication.h>
+#include <kglobalsettings.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <kmimetype.h>
+#include <kstandarddirs.h>
+#include <kmessagebox.h>
+#include <kio/netaccess.h>
+#include <kio/job.h>
+#include <kprogress.h>
+#include <kfilemetainfo.h>
+#include <klineedit.h>
+#include <kcombobox.h>
+#include <kpushbutton.h>
+#include <kdebug.h>
+#include <kurl.h>
+#include <kaccel.h>
+#include <dcopref.h>
+#include <ktoolbar.h>
+#include <kcolordialog.h>
+#include <kurlcombobox.h>
+#include <kurlcompletion.h>
+
+#include <qlabel.h>
+#include <qclipboard.h>
+#include <qdragobject.h>
+#include <qstringlist.h>
+#include <qdom.h>
+#include <qxml.h>
+#include <qregexp.h>
+#include <qheader.h>
+#include <qlayout.h>
+#include <qpixmap.h>
+#include <qvbox.h>
+#include <qlistbox.h>
+#include <qtextcodec.h>
+#include <qtooltip.h>
+#include <qinputdialog.h>
+#include <qtimer.h>
+#include <qwhatsthis.h>
+#include <qpopupmenu.h>
+
+#include "googlefetcher.h"
+#include "mrl.h"
+#include "playlistimport.h"
+#include "playlistitem.h"
+#include "playlist.h"
+#include "playlist.moc"
+
+
+
+RollTitle::RollTitle( QWidget *parent ) : QLabel( "I", parent )
+{
+ QColorGroup cg = parentWidget()->colorGroup();
+ QColor base = cg.base();
+ QColor selection = cg.highlight();
+ int r = (base.red() + selection.red()) / 2;
+ int b = (base.blue() + selection.blue()) / 2;
+ int g = (base.green() + selection.green()) / 2;
+ back = QColor(r, g, b);
+ fore = parentWidget()->colorGroup().text();
+ setPaletteBackgroundColor( back );
+ setPaletteForegroundColor( fore );
+ setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ title = " ##### ";
+ titleOffset = 0;
+ setTitle( title );
+ connect( &titleTimer, SIGNAL( timeout() ), this, SLOT( rollTitle() ) );
+ titleTimer.start( 50 );
+}
+
+void RollTitle::setTitle( MRL mrl )
+{
+ title = " ##### ";
+ QString s1 = mrl.artist().stripWhiteSpace();
+ QString s2 = mrl.album().stripWhiteSpace();
+ QString s3 = mrl.title().stripWhiteSpace();
+ if ( !s1.isEmpty() )
+ title+= s1+" - ";
+ if ( !s2.isEmpty() )
+ title+= s2+" - ";
+ if ( s3.isEmpty() )
+ title+= mrl.url();
+ else
+ title+= s3;
+ titleOffset = 0;
+ setTitle( title );
+}
+
+void RollTitle::setTitle( QString t )
+{
+ QLabel *lab = new QLabel( t, this );
+ lab->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
+ lab->resize( lab->sizeHint() );
+ int x = 2*lab->frameWidth();
+ titlePix = QPixmap( lab->width()-x, height()-x, -1, QPixmap::BestOptim );
+ delete lab;
+ QPainter p( &titlePix );
+ p.fillRect( 0, 0, titlePix.width(), titlePix.height(), back );
+ p.setPen( fore );
+ p.setFont( font() );
+ p.drawText( QRect(0,(titlePix.height()-QFontInfo(font()).pointSize())/2,titlePix.width(),QFontInfo(font()).pointSize()*2), Qt::AlignAuto|Qt::SingleLine, t );
+ p.end();
+}
+
+void RollTitle::rollTitle()
+{
+ int w = 2*frameWidth();
+ QPixmap pix( width()-w, height()-w, -1, QPixmap::BestOptim );
+ QPainter p1( &pix );
+ p1.fillRect( 0, 0, pix.width(), pix.height(), back );
+ p1.end();
+ int x = titlePix.width()-titleOffset;
+ bitBlt( &pix, 0, 0, &titlePix, titleOffset, 0, x, titlePix.height(), CopyROP );
+ while ( x<pix.width() ) {
+ bitBlt( &pix, x, 0, &titlePix, 0, 0, titlePix.width(), titlePix.height(), CopyROP );
+ x+= titlePix.width();
+ }
+ ++titleOffset;
+ if ( titleOffset>titlePix.width() )
+ titleOffset = 0;
+ bitBlt( this, w/2, w/2, &pix, 0, 0, width()-w, height()-w, CopyROP );
+}
+
+void RollTitle::paintEvent( QPaintEvent *pe )
+{
+ QLabel::paintEvent( pe );
+ QColorGroup cg = parentWidget()->colorGroup();
+ QColor base = cg.base();
+ QColor selection = cg.highlight();
+ int r = (base.red() + selection.red()) / 2;
+ int b = (base.blue() + selection.blue()) / 2;
+ int g = (base.green() + selection.green()) / 2;
+ back=QColor(r,g,b);
+ setPaletteBackgroundColor( back );
+ fore = parentWidget()->colorGroup().text();
+ setPaletteForegroundColor( fore );
+ setTitle( title );
+}
+
+
+
+struct CoverPopup : public QWidget
+{
+ CoverPopup(const QPixmap &image, const QPoint &p) :
+ QWidget(0, 0, WDestructiveClose | WX11BypassWM)
+ {
+ QHBoxLayout *layout = new QHBoxLayout(this);
+ QLabel *label = new QLabel(this);
+
+ layout->addWidget(label);
+ label->setFrameStyle(QFrame::Box | QFrame::Raised);
+ label->setLineWidth(1);
+ label->setPixmap(image);
+
+ setGeometry(p.x(), p.y(), label->width(), label->height());
+ show();
+ }
+ virtual void leaveEvent(QEvent *) { close(); }
+ virtual void mouseReleaseEvent(QMouseEvent *) { close(); }
+};
+
+CoverFrame::CoverFrame( QWidget *parent ) : QFrame( parent )
+{
+ imagePath = "";
+ QString path = locate("appdata", "nocover.png");
+ if ( !path )
+ path = locate("data", "kaffeine/nocover.png");
+ noCoverPix.convertFromImage( QImage(path) );
+ setPaletteBackgroundPixmap( noCoverPix );
+}
+
+CoverFrame::~CoverFrame()
+{
+}
+
+void CoverFrame::setCoverPixmap( const QString &path )
+{
+ QPixmap pix;
+ QImage img;
+
+ img = QImage( path );
+ if ( !img.isNull() ) {
+ img = img.smoothScale( 80, 80 );
+ pix.convertFromImage( img );
+ setPaletteBackgroundPixmap( pix );
+ imagePath = path;
+ }
+ else {
+ setPaletteBackgroundPixmap( noCoverPix );
+ imagePath = "";
+ }
+}
+
+void CoverFrame::popup( const QPixmap &pix ) const
+{
+ QPoint mouse = QCursor::pos();
+ QRect desktop = KApplication::desktop()->screenGeometry(mouse);
+ int x = mouse.x();
+ int y = mouse.y();
+ int height = pix.height() + 4;
+ int width = pix.width() + 4;
+
+ // Detect the right direction to pop up (always towards the center of the
+ // screen), try to pop up with the mouse pointer 10 pixels into the image in
+ // both directions. If we're too close to the screen border for this margin,
+ // show it at the screen edge, accounting for the four pixels (two on each
+ // side) for the window border.
+
+ if(x - desktop.x() < desktop.width() / 2)
+ x = (x - desktop.x() < 10) ? desktop.x() : (x - 10);
+ else
+ x = (x - desktop.x() > desktop.width() - 10) ? desktop.width() - width +desktop.x() : (x - width + 10);
+
+ if(y - desktop.y() < desktop.height() / 2)
+ y = (y - desktop.y() < 10) ? desktop.y() : (y - 10);
+ else
+ y = (y - desktop.y() > desktop.height() - 10) ? desktop.height() - height + desktop.y() : (y - height + 10);
+
+ new CoverPopup( pix, QPoint(x, y) );
+}
+
+void CoverFrame::mousePressEvent( QMouseEvent *e )
+{
+ int i;
+ QPixmap pix;
+
+ switch ( e->button() ) {
+ case LeftButton: {
+ if ( imagePath.isEmpty() )
+ break;
+ pix.convertFromImage( QImage( imagePath ) );
+ if ( !pix.isNull() )
+ popup( pix );
+ break;
+ }
+ case RightButton: {
+ QPopupMenu pop( this );
+ pop.insertItem( i18n("Choose a Cover..."), 1 );
+ pop.insertItem( i18n("Gallery..."), 2 );
+ i = pop.exec( QCursor::pos() );
+ if ( i==1 )
+ emit changeCurrentCover();
+ else if ( i==2 )
+ emit gallery();
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+
+PlayList::PlayList( QWidget* parent, QObject *objParent, const char *name ) : KaffeineInput(objParent , name),
+ m_playTime(0), m_playTimeVisible(0), m_countVisible(0), m_searchSelection(false),
+ m_metaOnLoading(true), m_sortAscending(true), m_currentEntry(NULL), m_currentRandomListEntry(-1),
+ m_endless(false), m_random(false), m_useAlternateEncoding(false), m_alternateEncoding("ISO 8859-1")
+{
+ google = NULL;
+
+ mainWidget = new QVBox( parent );
+ //mainWidget->setSizePolicy( QSizePolicy (QSizePolicy::Preferred, QSizePolicy::Preferred) );
+ hSplit = new QSplitter( mainWidget );
+ hSplit->setOpaqueResize( true );
+ panel = new QVBox( hSplit );
+ playlist = new QWidget( hSplit );
+ hSplit->moveToFirst( panel );
+ hSplit->setResizeMode( panel, QSplitter::KeepSize );
+
+ vSplit = new QSplitter( QSplitter::Vertical, panel );
+ vSplit->setOpaqueResize( true );
+ QWidget *vb = new QWidget( vSplit );
+ KToolBar *tb = new KToolBar( vb );
+ QVBoxLayout *v = new QVBoxLayout( vb, 0, 0 );
+ v->addWidget( tb );
+ tb->setIconSize( 16 );
+
+ browserComb = new KURLComboBox( KURLComboBox::Directories, true, vb );
+ browserComb->setCompletionObject( new KURLCompletion( KURLCompletion::DirCompletion ) );
+ browserComb->setAutoDeleteCompletionObject( true );
+ browserComb->setMaxItems( 10 );
+ browserComb->setFocusPolicy(QWidget::ClickFocus);
+
+
+ /* if (!m_medium)
+ m_combo->lineEdit()->setText( location->path() );
+ else
+ m_combo->lineEdit()->setText( "/" );*/
+
+ QVBoxLayout *v1 = new QVBoxLayout( 0, 3, 3 );
+ v1->addWidget( browserComb );
+ fileBrowser = new KDirOperator( KURL("/"), vb );
+ fileBrowser->setupMenu( KDirOperator::SortActions|KDirOperator::NavActions|KDirOperator::ViewActions );
+ view = new KFileIconView( fileBrowser, "view" );
+ view->setSelectionMode( KFile::Multi );
+ fileBrowser->setMode( KFile::Files );
+ fileBrowser->setView( view );
+ fileBrowser->setViewConfig( KGlobal::config(), "PlaylistFileBrowser" );
+ fileBrowser->setOnlyDoubleClickSelectsFiles( true );
+ v1->addWidget( fileBrowser );
+ v->addLayout( v1 );
+
+ KActionCollection *col = fileBrowser->actionCollection();
+ col->action( "up" )->plug( tb );
+ col->action( "back" )->plug( tb );
+ col->action( "forward" )->plug( tb );
+ col->action( "reload" )->plug( tb );
+ col->action( "home" )->plug( tb );
+
+ vSplit->moveToFirst( vb );
+ playerBox = new QVBox( vSplit );
+ playerBox->setMinimumHeight( 50 );
+ playerBox->setMinimumWidth( 200 );
+ vSplit->moveToLast( playerBox );
+
+ m_playlistDirectory = locateLocal("appdata", "playlists");
+ m_playlistDirectory.append("/");
+ KIO::NetAccess::mkdir(m_playlistDirectory, mainWidget);
+ kdDebug() << "PLAYLIST" << endl;
+
+ QGridLayout* layout = new QGridLayout( playlist, 4, 2, 3 );
+
+ m_list = new UrlListView(playlist);
+ mainWidget->setAcceptDrops(true);
+ m_list->setHScrollBarMode(KListView::AlwaysOff);
+ m_list->setItemMargin(2);
+ m_list->setMargin(0);
+ m_list->setSelectionMode(QListView::Extended);
+ m_list->addColumn("");
+ m_list->addColumn(i18n("Title"));
+ m_list->addColumn(i18n("Artist"));
+ m_list->addColumn(i18n("Album"));
+ m_list->addColumn(i18n("Track"));
+ m_list->addColumn(i18n("Length"));
+ m_list->setShowToolTips(true);
+ m_list->setColumnWidthMode(MIME_COLUMN, QListView::Manual);
+ m_list->setColumnWidthMode(TITLE_COLUMN, QListView::Manual);
+ m_list->setColumnWidthMode(ARTIST_COLUMN, QListView::Manual);
+ m_list->setColumnWidthMode(ALBUM_COLUMN, QListView::Manual);
+ m_list->setColumnWidthMode(TRACK_COLUMN, QListView::Manual);
+ m_list->setColumnWidthMode(LENGTH_COLUMN, QListView::Manual);
+ m_list->setResizeMode(QListView::NoColumn);
+ KConfig* config = kapp->config();
+ m_list->restoreLayout(config, "Playlist Layout");
+ m_list->setFullWidth(true);
+ m_list->setSorting(-1);
+ m_list->setDragEnabled(true);
+ m_list->setAcceptDrops(true);
+ m_list->setDropVisualizer(true);
+ m_list->setItemsMovable(true);
+ m_list->setItemsRenameable(true);
+ m_list->setRenameable(TITLE_COLUMN);
+ m_list->setRenameable(ARTIST_COLUMN);
+ m_list->setRenameable(ALBUM_COLUMN);
+ m_list->setRenameable(TRACK_COLUMN);
+ m_list->setAllColumnsShowFocus(true);
+ m_list->setShowSortIndicator(true);
+ layout->addMultiCellWidget(m_list, 3, 3, 0, 1);
+
+ coverFrame = new CoverFrame( playlist );
+ coverFrame->setFixedWidth( 80 );
+ coverFrame->setFixedHeight( 80 );
+ layout->addMultiCellWidget(coverFrame, 0, 2, 0, 0);
+
+ QHBoxLayout *h1 = new QHBoxLayout();
+ searchBtn = new QToolButton( playlist );
+ searchBtn->setAutoRaise( true );
+ QToolTip::add( searchBtn, i18n("Search"));
+ searchBtn->setIconSet( KGlobal::iconLoader()->loadIconSet("locationbar_erase", KIcon::Small) );
+ h1->addWidget( searchBtn );
+ QLabel* filterLabel = new QLabel(i18n("Filter") + ":", playlist);
+ h1->addWidget(filterLabel);
+ m_playlistFilter = new KLineEdit(playlist);
+ m_playlistFilter->setFocusPolicy(QWidget::ClickFocus);
+ h1->addWidget(m_playlistFilter);
+ layout->addLayout( h1, 2, 1 );
+
+ QHBoxLayout *h2 = new QHBoxLayout();
+ QLabel* playlistLabel = new QLabel(i18n("Playlist:"), playlist);
+ h2->addWidget(playlistLabel);
+ m_playlistSelector = new KComboBox( playlist );
+ m_playlistSelector->setMinimumWidth(10);
+ m_playlistSelector->setSizePolicy( QSizePolicy (QSizePolicy::MinimumExpanding, QSizePolicy::Preferred) );
+ m_playlistSelector->setEditable(true);
+ m_playlistSelector->setDuplicatesEnabled(false);
+ m_playlistSelector->setFocusPolicy(QWidget::ClickFocus);
+ QToolTip::add(m_playlistSelector, i18n("Select the active playlist. To change playlist name edit it and confirm with 'Return'."));
+ h2->addWidget(m_playlistSelector);
+ layout->addLayout( h2, 1, 1 );
+
+ roller = new RollTitle( playlist );
+ layout->addWidget( roller, 0, 1 );
+
+ KAccel* accel = new KAccel(mainWidget);
+ accel->insert("Delete selected", Qt::Key_Delete, this, SLOT(slotRemoveSelected()));
+
+ m_isCurrentEntry = UserIcon("playing");
+ m_cdPixmap = KGlobal::iconLoader()->loadIcon("cdtrack", KIcon::Small);
+
+ setXMLFile("kaffeineplaylist.rc");
+ setupActions();
+
+ QStrList formats = QImageIO::outputFormats();
+ coverImageFormat = "PNG";
+ for (int i=0; i<(int)formats.count(); i++ ) {
+ if ( QString(formats.at(i))=="JPEG" ) {
+ coverImageFormat = "JPEG";
+ break;
+ }
+ }
+
+ loadConfig( KGlobal::config() );
+
+ connect(coverFrame, SIGNAL(changeCurrentCover()), this, SLOT(chooseCurrentCover()));
+ connect(coverFrame, SIGNAL(gallery()), this, SLOT(showGallery()));
+ connect(browserComb, SIGNAL(urlActivated( const KURL& )), this, SLOT(setBrowserURL( const KURL& )));
+ connect(browserComb, SIGNAL(returnPressed( const QString& )), this, SLOT(setBrowserURL( const QString& )));
+ connect(fileBrowser, SIGNAL(urlEntered( const KURL& )), this, SLOT(browserURLChanged( const KURL& )));
+ connect(fileBrowser, SIGNAL(fileSelected(const KFileItem*)), this, SLOT(fileSelected(const KFileItem*)));
+ connect(m_playlistFilter, SIGNAL(textChanged(const QString&)), this, SLOT(slotFindText(const QString&)));
+ connect( searchBtn, SIGNAL(clicked()), this, SLOT(resetSearch()) );
+ connect(m_playlistSelector, SIGNAL(returnPressed(const QString&)), this, SLOT(slotNewPlaylistName(const QString&)));
+ connect(m_playlistSelector, SIGNAL(activated(int)),this, SLOT(slotPlaylistActivated(int)));
+ connect(m_list, SIGNAL(dropped(QDropEvent*, QListViewItem*)), this, SLOT(slotDropEvent(QDropEvent*, QListViewItem*)));
+ connect(m_list, SIGNAL(aboutToMove()), this, SLOT(slotPreDropEvent()));
+ connect(m_list, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(slotPlayDirect(QListViewItem*)));
+ connect(m_list, SIGNAL(returnPressed(QListViewItem*)), this, SLOT(slotPlayDirect(QListViewItem*)));
+ connect(m_list, SIGNAL(signalCut()), this, SLOT(slotCut()));
+ connect(m_list, SIGNAL(signalCopy()), this, SLOT(slotCopy()));
+ connect(m_list, SIGNAL(signalPaste()), this, SLOT(slotPaste()));
+ connect(m_list, SIGNAL(signalSelectAll()), this, SLOT(slotSelectAll()));
+ connect(m_list, SIGNAL(signalPlayItem(QListViewItem*)), this, SLOT(slotPlayDirect(QListViewItem*)));
+ connect(m_list, SIGNAL(signalPlaylistFromSelected()), this, SLOT(slotPlaylistFromSelected()));
+ connect(m_list, SIGNAL(signalAddToQueue(MRL)), this, SLOT(slotAddToQueue(MRL)));
+ connect(m_list->header(), SIGNAL(clicked(int)), this, SLOT(slotSort(int)));
+}
+
+void PlayList::togglePanel()
+{
+ if ( panel->isHidden() )
+ panel->show();
+ else
+ panel->hide();
+}
+
+void PlayList::getTargets( QStringList &uiNames, QStringList &iconNames, QStringList &targetNames )
+{
+ uiNames.append( i18n("Play Playlist") );
+ iconNames.append( "view_text" );
+ targetNames.append( "PLAYLIST" );
+}
+
+bool PlayList::execTarget( const QString &target )
+{
+ if ( target=="PLAYLIST" ) {
+ emit showMe( this );
+ QTimer::singleShot( 100, this, SLOT(startPlaylist()) );
+ return true;
+ }
+ return false;
+}
+
+void PlayList::setFileFilter( const QString& filter )
+{
+ m_fileFilter = filter;
+ fileBrowser->setNameFilter( m_fileFilter );
+}
+
+PlayList::~PlayList()
+{
+ delete m_list;
+}
+
+void PlayList::setupActions()
+{
+ m_repeat = new KToggleAction(i18n("&Repeat"), 0 , CTRL|Key_E, this, SLOT(slotRepeat()), actionCollection(),"playlist_repeat");
+ m_repeat->setStatusText(i18n("Loop playlist"));
+ m_shuffle = new KToggleAction(i18n("Sh&uffle"), 0 , CTRL|Key_R, this, SLOT(slotShuffle()), actionCollection(),"playlist_shuffle");
+ m_shuffle->setStatusText(i18n("Play items in random order"));
+ m_autoCover = new KToggleAction(i18n("Autodownload covers"), 0 , 0, this, SLOT(slotAutoCover()), actionCollection(),"playlist_autocover");
+ m_autoCover->setStatusText(i18n("Automatic dowloading of covers"));
+ m_showPlayer = new KToggleAction(i18n("Don't switch to player window"), 0 , 0, this, SLOT(slotShowPlayer()), actionCollection(),"playlist_showplayer");
+ m_showPlayer->setStatusText(i18n("Don't switch automatically to player window"));
+ new KAction(i18n("&Clear Current Playlist"), "eraser", 0, this, SLOT(slotClearList()), actionCollection(), "playlist_clear");
+ new KAction(i18n("Ne&w Playlist"), "filenew", 0, this, SLOT(slotNewList()), actionCollection(), "playlist_new");
+ new KAction(i18n("&Import Playlist..."), "project_open", 0, this, SLOT(slotPlaylistLoad()), actionCollection(), "playlist_load");
+ new KAction(i18n("&Save Current Playlist As..."), "filesaveas", 0, this, SLOT(slotPlaylistSaveAs()), actionCollection(), "playlist_save_as");
+ new KAction(i18n("Re&move Current Playlist"), "fileclose", 0, this, SLOT(slotPlaylistRemove()), actionCollection(), "playlist_remove");
+}
+
+void PlayList::slotClearList()
+{
+ clearList();
+}
+
+void PlayList::slotRepeat()
+{
+ setEndless(m_repeat->isChecked());
+}
+
+void PlayList::slotShuffle()
+{
+ setRandom(m_shuffle->isChecked());
+}
+
+void PlayList::slotAutoCover()
+{
+ m_cover = m_autoCover->isChecked();
+}
+
+void PlayList::slotShowPlayer()
+{
+}
+
+void PlayList::slotToggleShuffle()
+{
+ m_shuffle->setChecked(!m_shuffle->isChecked());
+ slotShuffle();
+}
+
+void PlayList::slotPlaylistLoad()
+{
+ QString path = KFileDialog::getOpenFileName(":kaffeine_openPlaylist", QString("*.kaffeine|") + i18n("Kaffeine Playlists") + "\n*.*|" + i18n("All Files"), 0, i18n("Open Playlist"));
+ if (path.isEmpty() || (!path.contains(".kaffeine", false)))
+ return;
+
+ loadPlaylist(path);
+}
+
+void PlayList::slotPlaylistSaveAs()
+{
+ QString startPath = ":kaffeine_savePlaylist";
+ //if (!lastPlaylist.isEmpty()) startPath = lastPlaylist;
+ QString path = KFileDialog::getSaveFileName(startPath,
+ QString("*.kaffeine|") + i18n("Kaffeine Playlists") + "\n" +
+ QString("*.m3u|") + i18n("M3U Playlists") + "\n" +
+ QString("*.pls|") + i18n("PLS Playlists") + "\n" +
+ "*.*|" + i18n("All Files"), 0, i18n("Save Playlist"));
+
+ if ( path.isEmpty() )
+ return;
+ if ( path.right(4).lower() == ".m3u" ) {
+ exportM3UPlaylist(path);
+ } else if ( path.right(4).lower() == ".pls" ) {
+ exportPLSPlaylist(path);
+ } else if ( path.right(9).lower() == ".kaffeine" ) {
+ savePlaylist(path);
+ } else {
+ path.append(".kaffeine");
+ savePlaylist(path);
+ }
+}
+
+void PlayList::slotPlaylistRemove()
+{
+ removeCurrentPlaylist();
+}
+
+QWidget* PlayList::wantPlayerWindow()
+{
+ return playerBox;
+}
+
+QWidget* PlayList::inputMainWidget()
+{
+ return mainWidget;
+}
+
+void PlayList::loadConfig(KConfig* config)
+{
+ QValueList<int> sl;
+ bool b;
+
+ config->setGroup("Playlist");
+ b = config->readBoolEntry("Endless Mode", false);
+ m_repeat->setChecked(b);
+ setEndless(b);
+ b = config->readBoolEntry("Random Mode", false);
+ m_shuffle->setChecked(b);
+ setRandom(b);
+ b = config->readBoolEntry("AutoCover", false);
+ m_autoCover->setChecked(b);
+ m_cover = b;
+ b = config->readBoolEntry("DontShowPlayer", false);
+ m_showPlayer->setChecked(b);
+
+ sl = config->readIntListEntry("HSplitSizes");
+ if ( sl.count() )
+ hSplit->setSizes( sl );
+ else {
+ sl.append( 200 );
+ sl.append( 200 );
+ hSplit->setSizes( sl );
+ }
+ vSplit->setSizes( config->readIntListEntry("VSplitSizes") );
+ QStringList list;
+ list = config->readListEntry("Playlists");
+ if (!list.count())
+ {
+ list.append(i18n("Playlist") + "1");
+ }
+ int lastRegularPlaylist = list.count();
+ list.append(i18n("NEW"));
+ m_playlistSelector->insertStringList(list);
+ m_currentPlaylist = config->readNumEntry("Current", 0);
+ if (m_currentPlaylist > lastRegularPlaylist)
+ m_currentPlaylist = 0;
+ m_playlistSelector->setCurrentItem(m_currentPlaylist);
+ add(m_playlistDirectory + m_playlistSelector->text(m_currentPlaylist) + ".kaffeine", NULL);
+ m_nextPlaylistNumber = config->readNumEntry("Next Playlist", 2);
+ QString currentEntry = config->readEntry("Current Entry", QString());
+ if ((!currentEntry.isEmpty()) && (m_list->childCount()))
+ {
+ QListViewItem* tmp = findByURL(currentEntry);
+ if (tmp)
+ setCurrentEntry(tmp, false);
+ }
+ fileBrowser->readConfig( config, "PlaylistFileBrowser" );
+ fileBrowser->setURL( KURL(config->readEntry( "FileBrowserURL", "/" )), true );
+ browserComb->setURL( KURL(config->readEntry( "FileBrowserURL", "/" )) );
+}
+
+void PlayList::saveConfig()
+{
+ saveConfig( KGlobal::config() );
+}
+
+void PlayList::saveConfig(KConfig* config)
+{
+ saveCurrentPlaylist();
+ config->setGroup("Playlist");
+ config->writeEntry("Endless Mode", m_repeat->isChecked());
+ config->writeEntry("Random Mode", m_shuffle->isChecked());
+ config->writeEntry("AutoCover", m_autoCover->isChecked());
+ config->writeEntry("DontShowPlayer", m_showPlayer->isChecked());
+ config->writeEntry( "HSplitSizes", hSplit->sizes() );
+ config->writeEntry( "VSplitSizes", vSplit->sizes() );
+ QStringList list;
+ QString text;
+ for (uint i=0; i < m_playlistSelector->listBox()->count(); i++)
+ {
+ text = m_playlistSelector->text(i);
+ if ( text != i18n("NEW") )
+ list.append(text);
+ }
+ config->writeEntry("Playlists", list);
+ config->writeEntry("Current", m_currentPlaylist);
+ config->writeEntry("Next Playlist", m_nextPlaylistNumber);
+ config->writeEntry("Current Entry", m_currentEntryMRL.url());
+ m_list->saveLayout(config, "Playlist Layout");
+ fileBrowser->writeConfig( config, "PlaylistFileBrowser" );
+ config->writeEntry( "FileBrowserURL", fileBrowser->url().url() );
+}
+
+void PlayList::closeEvent(QCloseEvent* ce)
+{
+ kdDebug() << "Playlist: close Event" << endl;
+ ce->ignore();
+}
+
+/******************************************
+ * get the urls from playlist
+ ******************************************/
+void PlayList::startPlaylist()
+{
+ MRL mrl;
+ if ( trackNumber( 1, mrl ) )
+ emit play( mrl, this );
+}
+
+bool PlayList::currentTrack( MRL &mrl )
+{
+ mrl = getCurrent();
+ if ( !mrl.isEmpty() )
+ return true;
+ else
+ return false;
+}
+
+MRL PlayList::getCurrent()
+{
+ if (isQueueMode())
+ {
+ m_queue.clear();
+ updateStatus();
+ }
+
+ if (m_random)
+ {
+ if (m_currentRandomListEntry == -1) return MRL();
+ setCurrentEntry(m_randomList.at(m_currentRandomListEntry));
+ return m_currentEntryMRL;
+ }
+
+ if (!m_currentEntry)
+ if (m_list->childCount() > 0)
+ {
+ if (m_list->firstChild()->isVisible())
+ setCurrentEntry(m_list->firstChild());
+ else
+ {
+ if (m_list->firstChild()->itemBelow())
+ setCurrentEntry(m_list->firstChild()->itemBelow());
+ else
+ return MRL();
+ }
+ }
+ else
+ return MRL();
+
+ setCurrentEntry(m_currentEntry);
+ return m_currentEntryMRL;
+}
+
+bool PlayList::playbackFinished( MRL &mrl )
+{
+ return nextTrack( mrl );
+}
+
+bool PlayList::nextTrack( MRL &mrl )
+{
+ if (isQueueMode())
+ {
+ mrl = m_queue.first();
+ m_queue.remove(m_queue.begin());
+ updateStatus();
+ return true;
+ }
+
+ if (!m_currentEntry) {
+ mrl = getCurrent();
+ if ( !mrl.isEmpty() )
+ return true;
+ else
+ return false;
+ }
+
+ if (m_random)
+ {
+ if ((m_currentRandomListEntry+1) < (int)m_randomList.count())
+ m_currentRandomListEntry += 1;
+ else
+ {
+ if (m_endless)
+ m_currentRandomListEntry = 0;
+ else
+ return false;
+ }
+ setCurrentEntry(m_randomList.at(m_currentRandomListEntry));
+ mrl = m_currentEntryMRL;
+ return true;
+ }
+
+ QListViewItem* tmpItem;
+ tmpItem = m_currentEntry->itemBelow();
+
+ if (tmpItem)
+ {
+ setCurrentEntry(tmpItem);
+ mrl = m_currentEntryMRL;
+ return true;
+ }
+ else
+ {
+ if (m_endless)
+ {
+ setCurrentEntry(m_list->firstChild());
+ mrl = m_currentEntryMRL;
+ return true;
+ }
+ else
+ return false;
+ }
+}
+
+bool PlayList::previousTrack( MRL &mrl )
+{
+ if (isQueueMode())
+ {
+ m_queue.clear();
+ updateStatus();
+ }
+
+ if (!m_currentEntry) {
+ mrl = getCurrent();
+ if ( !mrl.isEmpty() )
+ return true;
+ else
+ return false;
+ }
+
+ if (m_random) {
+ if (m_currentRandomListEntry > 0)
+ m_currentRandomListEntry -= 1;
+ else {
+ if (m_endless)
+ m_currentRandomListEntry = m_randomList.count()-1;
+ else
+ return false;
+ }
+ setCurrentEntry(m_randomList.at(m_currentRandomListEntry));
+ mrl = m_currentEntryMRL;
+ return true;
+ }
+
+ QListViewItem* tmpItem;
+ tmpItem = m_currentEntry->itemAbove();
+
+ if (tmpItem) {
+ setCurrentEntry(tmpItem);
+ mrl = m_currentEntryMRL;
+ return true;
+ }
+ else {
+ if (m_endless) {
+ setCurrentEntry(getLast());
+ mrl = m_currentEntryMRL;
+ return true;
+ }
+ else
+ return false;
+ }
+}
+
+bool PlayList::trackNumber( int number, MRL &mrl )
+{
+ if (number > m_list->childCount())
+ return false;
+
+ QListViewItem * item = m_list->firstChild();
+ for (int i = 1; i < number; i++)
+ item = item->nextSibling();
+
+ setCurrentEntry(item);
+ mrl = m_currentEntryMRL;
+ return true;
+}
+
+QListViewItem* PlayList::getLast()
+{
+ return m_list->lastItem();
+}
+
+QListViewItem* PlayList::getFirst()
+{
+ return m_list->firstChild();
+}
+
+QListViewItem* PlayList::findByURL(const QString& url)
+{
+ QListViewItemIterator it(m_list);
+ while (it.current())
+ {
+ if (dynamic_cast<PlaylistItem*>(*it)->url() == url)
+ {
+ return (*it);
+ }
+ ++it;
+ }
+
+ /* fallback */
+ return getFirst();
+}
+
+/********* set current entry (with play icon) ****************/
+
+void PlayList::setCurrentEntry(QListViewItem* item, bool playIcon)
+{
+ PlaylistItem* newItem = dynamic_cast<PlaylistItem*>(item);
+ PlaylistItem* oldItem = dynamic_cast<PlaylistItem*>(m_currentEntry);
+ if (m_currentEntry)
+ {
+ oldItem->setPlaying(false);
+ m_currentEntry->setPixmap(TITLE_COLUMN, QPixmap());
+ }
+ if (playIcon)
+ {
+ newItem->setPlaying(true);
+ item->setPixmap(TITLE_COLUMN, m_isCurrentEntry);
+ }
+ m_currentEntry = item;
+ if (m_random)
+ m_currentRandomListEntry = m_randomList.find(item);
+ m_currentEntryMRL = newItem->toMRL();
+ roller->setTitle( m_currentEntryMRL );
+ m_list->setCurrentItem(m_currentEntry);
+
+ m_list->ensureVisible(10, m_list->itemPos(m_currentEntry), 10, 30);
+}
+
+QListViewItem* PlayList::insertItem(QListViewItem* after, const MRL& m)
+{
+ PlaylistItem* tmp = NULL;
+ MRL mrl(m);
+
+ m_list->setSorting(-1);
+ QListViewItemIterator it(m_list);
+ while (it.current())
+ {
+ if (dynamic_cast<PlaylistItem*>(*it)->url() == mrl.url())
+ {
+ kdDebug() << "PlayList: Source '" << mrl.url() << "' still exists. Skipped." << endl;
+ return after;
+ }
+ ++it;
+ }
+
+ if (mrl.mime().isNull())
+ {
+ KMimeType::Ptr mime = KMimeType::findByURL(mrl.kurl().path());
+ mrl.setMime(mime->name());
+ }
+
+ tmp = new PlaylistItem(m_list, dynamic_cast<KListViewItem *>(after), mrl);
+ if (!tmp) return after;
+
+ if ((mrl.mime() == "video/dvd") || (mrl.mime() == "video/vcd") || (mrl.mime() == "audio/cd"))
+ tmp->setPixmap(MIME_COLUMN, m_cdPixmap);
+ else
+ tmp->setPixmap(MIME_COLUMN, KMimeType::mimeType(mrl.mime())->pixmap(KIcon::Small));
+
+ if (tmp->length().contains(':'))
+ m_playTime += timeStringToMs(tmp->length());
+
+ if (m_searchSelection)
+ {
+ QString text = m_playlistFilter->text();
+ if ((!tmp->title().contains(text, false)) && (!tmp->url().contains(text, false))
+ && (!tmp->artist().contains(text, false)) && (!tmp->album().contains(text, false)))
+ {
+ tmp->setVisible(false);
+ }
+ }
+
+ if (tmp->isVisible())
+ {
+ if (tmp->length().contains(':'));
+ m_playTimeVisible += timeStringToMs(tmp->length());
+ m_countVisible++;
+ }
+
+ return tmp;
+}
+
+void PlayList::fileSelected( const KFileItem *item )
+{
+ if ( !item )
+ return;
+ add( QStringList( item->url().path() ), NULL );
+ QListViewItem* tmp = findByURL(item->url().path());
+ if (tmp) {
+ setCurrentEntry(tmp);
+ emit play(m_currentEntryMRL, this);
+ }
+}
+
+void PlayList::setBrowserURL( const QString &path )
+{
+ fileBrowser->setURL( KURL(path), true );
+}
+
+void PlayList::setBrowserURL( const KURL &path )
+{
+ fileBrowser->setURL( path, true );
+}
+
+void PlayList::browserURLChanged( const KURL &u )
+{
+ QString url;
+
+ if ( u.isLocalFile() )
+ url = u.path();
+ else
+ url = u.prettyURL();
+
+ QStringList urls = browserComb->urls();
+ urls.remove( url ); // do not duplicate
+ urls.prepend( url );
+ browserComb->setURLs( urls, KURLComboBox::RemoveBottom );
+}
+
+void PlayList::add(const QString& url, QListViewItem* after)
+{
+ add(QStringList(url), after);
+}
+
+
+void PlayList::add(const QStringList& urlList, QListViewItem* after)
+{
+ QListViewItem* tmp = NULL;
+ QStringList urls(urlList);
+
+ QString ext;
+ QString subtitleURL;
+ QStringList subs;
+ KURL tmpKURL;
+ bool playlist;
+ MRL mrl;
+ QValueList<MRL> mrlList;
+ QString mediadevice="";
+
+ KProgressDialog* progress = NULL;
+ progress = new KProgressDialog(mainWidget, "importprogress", QString::null, i18n("Importing media resources..."));
+ progress->progressBar()->setTotalSteps(urls.count());
+ progress->show();
+
+ kdDebug() << "PlayList: add " << urls.count() << " items to playlist" << endl;
+
+ for (uint i = 0; i < urls.count(); i++)
+ {
+ mrl = MRL(urls[i]);
+ QString url(mrl.kurl().prettyURL());
+
+ if (mrl.kurl().protocol() == "media" || url.startsWith("system:/media/"))
+ {
+ QString mediaName;
+ if (url.startsWith("system:/media/"))
+ mediaName = url.mid(14);
+ else
+ mediaName = url.mid(7);
+ int slash = mediaName.find("/");
+ QString filePath(mediaName.mid(slash));
+ if (filePath == "/")
+ filePath = "";
+ mediaName = mediaName.left(slash);
+
+ DCOPRef mediamanager("kded","mediamanager");
+ DCOPReply reply = mediamanager.call("properties(QString)",mediaName);
+ if (reply.isValid())
+ {
+ QStringList properties = reply;
+ if (properties.isEmpty()) break;
+ url = properties[6] + filePath;
+ if (filePath.isEmpty())
+ {
+ if (properties[10] == "media/audiocd")
+ {
+ mediadevice = properties[5];
+ delete progress;
+ emit signalRequestForAudioCD(mediadevice);
+ return;
+ }
+ if (properties[10] == "media/dvdvideo")
+ {
+ mediadevice = properties[5];
+ delete progress;
+ emit signalRequestForDVD(mediadevice);
+ return;
+ }
+ if ((properties[10] == "media/vcd") || (properties[10] == "media/svcd"))
+ {
+ mediadevice = properties[5];
+ delete progress;
+ emit signalRequestForVCD(mediadevice);
+ return;
+ }
+ }
+ mrl = MRL(url);
+ }
+ }
+
+ if (mrl.kurl().isLocalFile())
+ {
+ if (!QFile::exists(mrl.kurl().path()))
+ continue;
+ mrl.setTitle(mrl.kurl().fileName());
+ mrl.setURL(mrl.kurl().path());
+ }
+ else
+ {
+ mrl.setTitle(mrl.url());
+ }
+
+ //kdDebug() << "PlayList: Check url " << mrl.url() << endl;
+ /*********** determine extension and mime type ************/
+
+ ext = mrl.kurl().fileName();
+ ext = ext.remove(0 , ext.findRev('.') +1).lower();
+ // kdDebug() << "Extension: " << ext << endl;
+
+ //kdDebug() << "PlayList: Try to determine mime of: " << mrl.url() << endl;
+ KMimeType::Ptr mime = KMimeType::findByURL(mrl.kurl().path()); /* works only with path() (without protocol)
+ e.g. http://www.somafm.com/indipop.pls
+ path: /indipop.pls */
+ //kdDebug() << "Mime: " << mime->name() << endl;
+ /*** check for kaffeine/noatun/pls/asx/m3u playlist ***/
+ mrl.setMime(mime->name());
+
+ /******** some special processing for local files! *******/
+ if (mrl.kurl().isLocalFile())
+ {
+ /* playlist ? */
+ if ((mime->name() == "text/plain") || (mime->name() == "text/xml") || (mime->name() == "application/x-kaffeine")
+ || (mime->name() == "audio/x-scpls") || (mime->name() == "audio/x-mpegurl" || (mime->name() == "audio/mpegurl")
+ || (ext == "asx") || (ext == "asf") || (ext == "wvx") || (ext == "wax"))) /* windows meta files */
+ {
+ kdDebug() << "PlayList: Check for kaffeine/noatun/m3u/pls/asx playlist\n";
+
+ mrlList.clear();
+ playlist = false;
+ QFile file(mrl.url());
+ file.open(IO_ReadOnly);
+
+ QTextStream stream(&file);
+ QString firstLine = stream.readLine();
+ QString secondLine = stream.readLine();
+ file.close();
+
+ if (secondLine.contains("kaffeine", false))
+ {
+ kdDebug() << "PlayList: Try loading kaffeine playlist\n";
+ playlist = PlaylistImport::kaffeine(mrl.url(), mrlList);
+ if (!playlist)
+ continue;
+ }
+ if (secondLine.contains("noatun", false))
+ {
+ kdDebug() << "PlayList: Try loading noatun playlist\n";
+ playlist = PlaylistImport::noatun(mrl.url(), mrlList);
+ }
+ if (firstLine.contains("asx", false))
+ {
+ kdDebug() << "PlayList: Try loading asx playlist\n";
+ playlist = PlaylistImport::asx(mrl.url(), mrlList);
+ }
+ if ( (firstLine.contains("[playlist]", false)) || (ext == "pls") )
+ {
+ kdDebug() << "PlayList: Try loading pls playlist\n";
+ playlist = PlaylistImport::pls(mrl.url(), mrlList);
+ }
+ if (ext == "m3u") //identify by extension
+ {
+ kdDebug() << "PlayList: Try loading m3u playlist\n";
+ playlist = PlaylistImport::m3u(mrl.url(), mrlList);
+ }
+ if (playlist)
+ {
+ QValueList<MRL>::ConstIterator end(mrlList.end());
+ for (QValueList<MRL>::ConstIterator it = mrlList.begin(); it != end; ++it)
+ after = insertItem(after, *it);
+ continue;
+ }
+
+ }
+
+ /* check for ram playlist */
+ if ( (ext == "ra") || (ext == "rm") || (ext == "ram") || (ext == "lsc") || (ext == "pl") )
+ {
+ mrlList.clear();
+ kdDebug() << "PlayList: Try loading ram playlist\n";
+ if (PlaylistImport::ram(mrl, mrlList, mainWidget->parentWidget()))
+ {
+ QValueList<MRL>::ConstIterator end(mrlList.end());
+ for (QValueList<MRL>::ConstIterator it = mrlList.begin(); it != end; ++it)
+ after = insertItem(after, *it);
+ continue;
+ }
+ }
+
+ /**** a directory ? ****/
+ if (mime->name() == "inode/directory")
+ {
+ kdDebug() << "PlayList: Add Directory: " << mrl.url() << endl;
+
+ QDir d(mrl.url());
+ uint x;
+
+ /* subdirs */
+ QStringList entryList = d.entryList(QDir::Dirs, QDir::Name);
+ for (x = 0; x < entryList.count(); x++)
+ {
+ if (entryList[x][0] != '.')
+ {
+ urls.append(mrl.url() + "/" + entryList[x]);
+ }
+ }
+
+ /* Media files */
+ /* Exclude subtitles because they are examined twice : */
+ /* Once for movie and once per subtitle - very annoying*/
+ QString fileFilter = m_fileFilter;
+ fileFilter.remove("*.srt",false);
+ fileFilter.remove("*.ssa",false);
+ fileFilter.remove("*.txt",false);
+ fileFilter.remove("*.asc",false);
+ fileFilter.remove("*.smi",false);
+ fileFilter.remove("*.sub",false);
+ entryList = d.entryList(fileFilter, QDir::Files, QDir::Name );
+ for (x = 0; x < entryList.count(); x++)
+ {
+ urls.append(mrl.url() + "/" + entryList[x]);
+ }
+
+ progress->progressBar()->setTotalSteps(urls.count());
+ continue; /* dont add directory to playlist */
+ }
+
+ /*** append subtitle files to the movie ***/
+ if ((ext == "srt") || (ext == "ssa") || (ext == "txt") ||
+ (ext == "asc") || (ext == "smi") || (ext == "sub"))
+ {
+ QStringList movies;
+ QString movieURL;
+ QListViewItemIterator it(m_list);
+ while (it.current())
+ {
+ if (dynamic_cast<PlaylistItem*>(*it)->mime().contains("video"))
+ movies << dynamic_cast<PlaylistItem*>(*it)->url();
+ ++it;
+ }
+ if (movies.count() == 1)
+ movieURL = movies[0];
+ else if (movies.count() >= 2)
+ {
+ MovieChooser *mc = new MovieChooser(movies, mrl.url(), mainWidget);
+ if(mc->exec() == QDialog::Accepted)
+ movieURL = mc->getSelection();
+ delete mc;
+ }
+ it = m_list;
+ while (it.current())
+ {
+ if (dynamic_cast<PlaylistItem*>(*it)->url() == movieURL)
+ {
+ kdDebug() << "PlayList: adding subtitle to movie " << dynamic_cast<PlaylistItem*>(*it)->url() << endl;
+ (dynamic_cast<PlaylistItem*>(*it))->addSubtitle(mrl.url());
+ break;
+ }
+ ++it;
+ }
+ continue;
+ }
+
+ /*** get meta tags ****/
+ if (m_metaOnLoading)
+ getMetaInfo(mrl, mime->name());
+
+ /* Get all suported subs in movie dir, clear out
+ * those starting with a different name than the movie,
+ * prompt the user to select a sub
+ */
+ if (mime->name().contains("video"))
+ {
+ kdDebug() << "PlayList: Check for subtitle files" << endl;
+ subtitleURL = QString::null;
+ QDir *d = new QDir(mrl.url().section('/',0,-2));
+ QString filename = mrl.url().section('/',-1,-1);
+ subs = QStringList();
+ //Do a case insensitive search for subs
+ QStringList dirListing = d->entryList(QDir::Files|QDir::NoSymLinks); //cache directory listing
+ bool matches = false;
+ QStringList::Iterator end(dirListing.end());
+ for(QStringList::Iterator it = dirListing.begin(); it != end; ++it )
+ {
+ if(startsWith(*it, filename.section('.',0,-2), false)) //If filenames (without extensions) match
+ {
+ if( endsWith(*it, ".srt", false) || endsWith(*it, ".ssa", false) ||
+ endsWith(*it, ".txt", false) || endsWith(*it, ".smi", false) ||
+ endsWith(*it, ".asc", false) || endsWith(*it, ".sub", false) )
+ matches = true;
+
+ if(matches) {
+ subs.append(*it); //This is a subtitle for our movie
+ }
+ matches = false;
+ }
+ }
+
+ if((subs.count() > 1)) {
+ subs.prepend(i18n("(no subtitles)"));
+ subs.append(i18n("Other subtitle..."));
+ subtitleURL = QString::null;
+ SubtitleChooser *sc = new SubtitleChooser(subs, filename, mainWidget);
+
+ THERE: if(sc->exec() == QDialog::Accepted)
+ {
+ if((sc->getSelection() != i18n("(no subtitles)")) && (sc->getSelection() != i18n("Other subtitle...")))
+ subtitleURL = d->path()+"/"+sc->getSelection();
+ if((sc->getSelection() == i18n("Other subtitle...")))
+ {
+ subtitleURL = KFileDialog::getOpenURL(d->path(), i18n("*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n*.*|All Files"), 0, i18n("Select Subtitle File")).path();
+ if(subtitleURL.isEmpty())
+ {
+ subtitleURL = QString::null;
+ goto THERE;
+ }
+ else //The user has selected another sub, so add this to the list
+ {
+ subs.clear();
+ subs.append(subtitleURL);
+ }
+ }
+ }
+ delete sc;
+ subs.remove(i18n("(no subtitles)"));
+ subs.remove(i18n("Other subtitle..."));
+ }
+
+ //Add the full path to the subtitle name
+ for (unsigned int i = 0; i < subs.size(); i++ )
+ if(!subs[i].startsWith(d->path()))
+ subs[i] = d->path()+"/"+subs[i];
+
+ mrl.setSubtitleFiles(subs);
+ if ( subs.count()==1 )
+ subtitleURL = subs[0]; // Use this one.
+ if (!subtitleURL.isNull())
+ {
+ kdDebug() << "PlayList: Use subtitle file: " << subtitleURL << " for: " << mrl.url() << endl;
+ mrl.setCurrentSubtitle(subs.findIndex(subtitleURL));
+ }
+ }
+ } /* if localFile() */
+
+ tmp = insertItem(after, mrl);
+ if (tmp)
+ after = tmp;
+
+ if ( progress->wasCancelled() )
+ break;
+ progress->progressBar()->setProgress(i+1);
+ progress->setLabel(QString::number(i+1) + " / " + QString::number(progress->progressBar()->totalSteps()) + " " + i18n("Files"));
+ KApplication::kApplication()->processEvents();
+ }
+
+ delete progress;
+ if (m_random) createRandomList();
+ updateStatus();
+}
+
+void PlayList::add(const QValueList<MRL>& mrlList, QListViewItem* after)
+{
+ QValueList<MRL>::ConstIterator end(mrlList.end());
+ for (QValueList<MRL>::ConstIterator it = mrlList.begin(); it != end; ++it)
+ after = insertItem(after, *it);
+ updateStatus();
+ if (m_random) createRandomList();
+}
+
+void PlayList::slotPlayDirect(QListViewItem* item)
+{
+ if (!item) return;
+
+ setCurrentEntry(item);
+ emit play(m_currentEntryMRL, this);
+}
+
+void PlayList::setEndless(bool e)
+{
+ m_endless = e;
+}
+
+void PlayList::setRandom(bool r)
+{
+ m_random = r;
+ if (m_random) createRandomList();
+}
+
+void PlayList::createRandomList()
+{
+ kdDebug() << "PlayList: Create a random playlist" << endl;
+ m_randomList.clear();
+ m_currentRandomListEntry = 0;
+
+ QListViewItem* tmpItem = NULL;
+ tmpItem = m_list->firstChild();
+ if ( (tmpItem) && (!tmpItem->isVisible()) )
+ tmpItem = tmpItem->itemBelow();
+
+ while (tmpItem)
+ {
+ m_randomList.append(tmpItem);
+ tmpItem = tmpItem->itemBelow();
+ }
+
+ if (!(m_randomList.count() > 0))
+ {
+ m_currentRandomListEntry = -1;
+ return;
+ }
+
+ KRandomSequence r(KApplication::random());
+ r.randomize(&m_randomList);
+}
+
+void PlayList::clearList()
+{
+ m_list->clear();
+ m_randomList.clear();
+ m_playTime = 0;
+ m_playTimeVisible = 0;
+ m_countVisible = 0;
+ if (m_searchSelection)
+ {
+ m_playlistFilter->clear();
+ m_searchSelection = false;
+ }
+ updateStatus();
+ m_currentEntry = NULL;
+ m_currentRandomListEntry = -1;
+}
+
+void PlayList::slotDropEvent(QDropEvent* dev, QListViewItem* after)
+{
+ QStringList urls ,newurls;
+
+ m_list->setSorting(-1);
+ if (QUriDrag::decodeLocalFiles(dev, urls))
+ {
+ if (urls.count())
+ {
+ for (uint i=0; i < urls.count() ;i++)
+ {
+ //KURL url(QUriDrag::unicodeUriToUri(urls[i]));
+ //newurls << url.path(-1);
+ //kdDebug() << "PlayList: Dropped " << url.path() << endl;
+ newurls << urls[i];
+ kdDebug() << "PlayList: Dropped " << urls[i] << endl;
+ }
+ add(newurls, after);
+ }
+ else
+ {
+ QUriDrag::decodeToUnicodeUris(dev, urls);
+ if (urls.count())
+ add(urls, after);
+ }
+ }
+ else
+ if (strcmp(dev->format(), "text/x-moz-url") == 0) /* for mozilla drops */
+ {
+ QByteArray data = dev->encodedData("text/plain");
+ QString md(data);
+ add(md, after);
+ }
+}
+
+void PlayList::slotPreDropEvent()
+{
+ m_list->setSorting(-1);
+}
+
+void PlayList::slotSetAlternateColor( const QColor& col )
+{
+ m_list->setAlternateBackground( col );
+ m_altCol = col;
+ m_list->triggerUpdate();
+}
+
+void PlayList::useAlternateEncoding(bool useEncoding)
+{
+ m_useAlternateEncoding = useEncoding;
+}
+
+void PlayList::setAlternateEncoding(const QString& encoding)
+{
+ m_alternateEncoding = encoding;
+}
+
+
+void PlayList::getMetaInfo(MRL& mrl, const QString& mimeName)
+{
+ KFileMetaInfo* metaInfo = NULL;
+ KFileMetaInfoGroup metaGroup;
+ uint m, n;
+
+ metaInfo = new KFileMetaInfo(mrl.url(), mimeName);
+ QStringList groups = metaInfo->groups();
+ QStringList keys;
+ QString title;
+ QString artist;
+ QString album;
+
+ QTextCodec *altCodec;
+ QTextCodec *CodecUtf8;
+
+ altCodec = QTextCodec::codecForName(m_alternateEncoding.ascii());
+ CodecUtf8 = QTextCodec::codecForName("UTF-8");
+ //kdDebug() << "playlist: locale " << Codec->name << " index: " << m_alternateEncoding << endl;
+
+ for (m = 0; m < groups.count(); m++)
+ {
+ //kdDebug() << "Metainfo-Group: " << groups[m] << endl;
+ metaGroup = metaInfo->group(groups[m]);
+ keys = metaGroup.keys();
+ for (n = 0; n < keys.count(); n++)
+ {
+ //kdDebug() << "Metainfo-Key: " << keys[n] << endl;
+ if (keys[n] == "Length")
+ {
+ mrl.setLength(QTime().addSecs(metaGroup.item(keys[n]).value().toUInt()));
+ }
+
+ if (keys[n] == "Title")
+ {
+ title = metaGroup.item(keys[n]).value().toString().simplifyWhiteSpace();
+ if ((!title.isEmpty()) && (title.contains(QRegExp("\\w")) > 2) && (title.left(5).lower() != "track"))
+ {
+ if ((m_useAlternateEncoding) && (CodecUtf8->heuristicContentMatch(title.ascii(), title.length()) < 0))
+ {
+ mrl.setTitle(altCodec->toUnicode(title.ascii()));
+ //kdDebug() << "playlist: Convert, locale name: " << altCodec->name() << title << endl;
+ }
+ else
+ {
+ mrl.setTitle(title);
+ //kdDebug() << "playlist: non Convert, locale name: " << CodecUtf8->name() << title << endl;
+ }
+ }
+ }
+
+ if (keys[n] == "Artist")
+ {
+ artist = (metaGroup.item(keys[n]).value().toString().simplifyWhiteSpace());
+ if (!artist.isEmpty())
+ {
+ if ((m_useAlternateEncoding) && (CodecUtf8->heuristicContentMatch(artist.ascii(),artist.length()) < 0 ))
+ {
+ mrl.setArtist(altCodec->toUnicode(artist.ascii()));
+ }
+ else
+ {
+ mrl.setArtist(artist);
+ }
+ }
+ }
+
+ if (keys[n] == "Album")
+ {
+ album = (metaGroup.item(keys[n]).value().toString().simplifyWhiteSpace());
+ if (!album.isEmpty())
+ {
+ if ((m_useAlternateEncoding) && (CodecUtf8->heuristicContentMatch(album.ascii(),album.length()) < 0 ))
+ {
+ mrl.setAlbum(altCodec->toUnicode(album.ascii()));
+ }
+ else
+ {
+ mrl.setAlbum(album);
+ }
+ }
+ }
+
+ if (keys[n] == "Tracknumber")
+ mrl.setTrack(metaGroup.item(keys[n]).value().toString().simplifyWhiteSpace());
+ if (keys[n] == "Date")
+ mrl.setYear(metaGroup.item(keys[n]).value().toString().simplifyWhiteSpace());
+ if (keys[n] == "Genre")
+ mrl.setGenre(metaGroup.item(keys[n]).value().toString().simplifyWhiteSpace());
+ }
+ }
+
+ delete metaInfo;
+}
+
+void PlayList::mergeMeta(const MRL& mrl)
+{
+ if (!m_currentEntry) return;
+ PlaylistItem* tmp = dynamic_cast<PlaylistItem*>(m_currentEntry);
+ bool addTime = (tmp->length() == QString("00:00:00"));
+ if ((tmp) && (tmp->url() == mrl.url()))
+ {
+ tmp->setTitle(mrl.title());
+ tmp->setArtist(mrl.artist());
+ tmp->setAlbum(mrl.album());
+ tmp->setTrack(mrl.track());
+ tmp->setYear(mrl.year());
+ tmp->setGenre(mrl.genre());
+ tmp->setLength(mrl.length().toString("h:mm:ss"));
+ tmp->setCurrentSubtitle(mrl.currentSubtitle());
+ tmp->setSubtitles(mrl.subtitleFiles());
+ }
+ if (addTime)
+ {
+ if (tmp->length().contains(':'));
+ {
+ m_playTime += timeStringToMs(tmp->length());
+ if (tmp->isVisible())
+ m_playTimeVisible += timeStringToMs(tmp->length());
+
+ updateStatus();
+ }
+ }
+
+ roller->setTitle( mrl );
+ setCover( mrl.artist().stripWhiteSpace(), mrl.album().stripWhiteSpace() );
+}
+
+GalleryDialog::GalleryDialog( QWidget *parent, GoogleFetcher *goog )
+ : KDialogBase( parent, QString(i18n("Gallery")).latin1(), true, QString::null, Ok, NoDefault, true )
+{
+ google = goog;
+ hbox = new QHBox(this);
+ imageFrame = new QFrame( hbox );
+ imageFrame->setFixedSize(500,500);
+ setMainWidget(hbox);
+ connect( &next, SIGNAL(timeout()), this, SLOT(slotNext()) );
+ next.start(1000,true);
+}
+
+void GalleryDialog::slotNext()
+{
+ QPixmap pix;
+ bool end;
+
+ actionButton(Ok)->setEnabled(false);
+loop:
+ QImage img = google->galleryNext( end );
+ if ( end ) {
+ slotOk();
+ return;
+ }
+ if ( !img.isNull() ) {
+ if ( img.width()>img.height() )
+ imageFrame->setFixedSize(500, 500*img.height()/img.width());
+ else
+ imageFrame->setFixedSize(500*img.width()/img.height(), 500);
+ img = img.smoothScale(imageFrame->width(),imageFrame->height());
+ pix.convertFromImage( img );
+ imageFrame->setPaletteBackgroundPixmap( pix );
+ }
+ else
+ goto loop;
+
+ actionButton(Ok)->setEnabled(true);
+ next.start(5000,true);
+}
+
+void GalleryDialog::slotOk()
+{
+ if ( next.isActive() )
+ next.stop();
+ hide();
+}
+
+void PlayList::showGallery()
+{
+ if ( google )
+ return;
+ QString s = getCurrent().artist().stripWhiteSpace();
+ if ( s.isEmpty() )
+ return;
+ google = new GoogleFetcher( s, "", true );
+ GalleryDialog dlg( 0, google );
+ dlg.exec();
+ delete google;
+ google = NULL;
+}
+
+void PlayList::setCover( QString s1, QString s2, bool forceFetch )
+{
+ if ( s1.isEmpty() || s2.isEmpty() ) {
+ coverFrame->setCoverPixmap( "" );
+ return;
+ }
+ QString s = locateLocal("appdata", "");
+ QImage img;
+ QPixmap pix;
+ QString fname = s1+"_"+s2;
+ fname = fname.replace( QChar( '/' ), "_" );
+ fname = fname.upper();
+ fname = s+"covers/"+fname;
+ if ( !forceFetch && QFile( fname ).exists() )
+ coverFrame->setCoverPixmap( fname );
+ else {
+ if ( !forceFetch )
+ coverFrame->setCoverPixmap( "" );
+ if ( google )
+ return;
+ if ( m_cover || forceFetch ) {
+ google = new GoogleFetcher( s1, s2 );
+ pix = google->pixmap( forceFetch );
+ delete google;
+ google = NULL;
+ }
+ if ( !QDir( s+"covers" ).exists() )
+ QDir().mkdir( s+"covers" );
+ if ( !pix.isNull() ) {
+ img = pix.convertToImage();
+ img.save( fname, coverImageFormat.latin1() );
+ MRL mrl = getCurrent();
+ if ( s1==mrl.artist().stripWhiteSpace() && s2==mrl.album().stripWhiteSpace() )
+ coverFrame->setCoverPixmap( fname );
+ }
+ else if ( !forceFetch && m_cover ) {
+ QString path = locate("appdata", "nocover.png");
+ if ( !path )
+ path = locate("data", "kaffeine/nocover.png");
+ KIO::file_copy( KURL::fromPathOrURL( path ), KURL::fromPathOrURL( fname ), -1, true );
+ }
+ }
+}
+
+void PlayList::chooseCurrentCover()
+{
+ MRL mrl = getCurrent();
+ setCover( mrl.artist().stripWhiteSpace(), mrl.album().stripWhiteSpace(), true );
+}
+
+/************ sort playlist ******************/
+
+void PlayList::slotSort(int section)
+{
+ m_list->setSorting(section, m_sortAscending);
+ m_list->sort();
+ m_sortAscending = !m_sortAscending;
+}
+
+
+/*** remove items ***/
+
+void PlayList::slotRemoveSelected()
+{
+ QPtrList<QListViewItem> selected;
+
+ if (m_currentEntry)
+ if (m_currentEntry->isSelected())
+ {
+ m_currentEntry = NULL;
+ m_currentRandomListEntry = -1;
+ }
+
+ selected = m_list->selectedItems();
+ PlaylistItem* item = NULL;
+
+ for(uint i = 0; i<selected.count(); i++)
+ {
+ // kdDebug() << "Remove " << selected.at(i)->text(TITLE_COLUMN) << "\n";
+ item = dynamic_cast<PlaylistItem *>(selected.at(i));
+ if (item->length().contains(':'))
+ {
+ m_playTime -= timeStringToMs(item->length());
+ m_playTimeVisible -= timeStringToMs(item->length());
+ }
+
+ m_countVisible--;
+ delete selected.at(i);
+ }
+
+ if (m_random) createRandomList();
+ updateStatus();
+}
+
+void PlayList::updateStatus()
+{
+ QString status;
+ if (isQueueMode())
+ {
+ QTime total;
+ QValueList<MRL>::ConstIterator end(m_queue.end());
+ for (QValueList<MRL>::ConstIterator it = m_queue.begin(); it != end; ++it)
+ total = total.addSecs(QTime().secsTo((*it).length()));
+ status = i18n("Queue: %1 Entries, Playtime: %2").arg(m_queue.count()).arg(total.toString("h:mm:ss"));
+ }
+ else
+ {
+ //status = i18n("Entries: %1, Playtime: %2 (Total: %3, %4)").arg(QString::number(m_countVisible)).arg(msToTimeString(m_playTimeVisible)).arg(QString::number(m_list->childCount())).arg(msToTimeString(m_playTime));
+
+
+ status = i18n("Entries: %1, Playtime: %2").arg(QString::number(m_countVisible)).arg(msToTimeString(m_playTimeVisible));
+ }
+ emit statusBarMessage(status);
+}
+
+void PlayList::slotNewList()
+{
+ m_list->setSorting(-1);
+ saveCurrentPlaylist();
+ m_playlistSelector->insertItem(i18n("Playlist") + QString::number(m_nextPlaylistNumber), 0);
+ m_nextPlaylistNumber++;
+ m_playlistSelector->setCurrentItem(0);
+ m_currentPlaylist = 0;
+ clearList();
+}
+
+void PlayList::setPlaylist(const QString& name, bool clear)
+{
+ saveCurrentPlaylist();
+ if (clear)
+ clearList();
+ int index = 0;
+ if (m_playlistSelector->listBox()->findItem(name))
+ index = m_playlistSelector->listBox()->index(m_playlistSelector->listBox()->findItem(name));
+ else
+ m_playlistSelector->insertItem(name, 0);
+ m_playlistSelector->setCurrentItem(index);
+ m_currentPlaylist = index;
+}
+
+void PlayList::nextPlaylist()
+{
+ int nextPlaylist = m_playlistSelector->currentItem();
+ QString pl = NULL;
+ do
+ {
+ nextPlaylist++;
+ if (nextPlaylist == m_playlistSelector->count())
+ nextPlaylist = 0;
+ pl = m_playlistSelector->text(nextPlaylist);
+ }
+ while (nextPlaylist != m_playlistSelector->currentItem());
+
+ saveCurrentPlaylist();
+ clearList();
+ m_playlistSelector->setCurrentItem(nextPlaylist);
+ m_currentPlaylist = nextPlaylist;
+ add(m_playlistDirectory + pl + ".kaffeine", NULL);
+ if (mainWidget->parentWidget())
+ mainWidget->parentWidget()->setFocus();
+}
+
+void PlayList::slotPlaylistActivated(int index)
+{
+ kdDebug() << "PlayList: Switch to playlist: " << m_playlistSelector->text(index) << endl;
+ QString pl = m_playlistSelector->text(index);
+
+ saveCurrentPlaylist();
+ clearList();
+ m_currentPlaylist = index;
+ add(m_playlistDirectory + pl + ".kaffeine", NULL);
+ if (mainWidget->parentWidget())
+ mainWidget->parentWidget()->setFocus();
+ /* if (!isQueueMode())
+ {
+ getCurrent();
+ emit signalPlay(m_currentEntryMRL);
+ } */
+}
+
+void PlayList::slotNewPlaylistName(const QString& text)
+{
+ if ((text.isEmpty()) || (text == m_playlistSelector->text(m_currentPlaylist)))
+ return;
+ if (m_playlistSelector->listBox()->findItem(text))
+ {
+ kdDebug() << "PlayList: Name still exists!" << endl;
+ return;
+ }
+ QString oldPl = m_playlistDirectory + m_playlistSelector->text(m_currentPlaylist) + ".kaffeine";
+ kdDebug() << "Playlist: removing file: " << oldPl << endl;
+ if (!KIO::NetAccess::del(oldPl, mainWidget))
+ kdError() << "Playlist: " << KIO::NetAccess::lastErrorString() << endl;
+
+ kdDebug() << "PlayList: Set playlist name to: " << text << endl;
+ m_playlistSelector->changeItem(text, m_currentPlaylist);
+ saveCurrentPlaylist();
+ if (mainWidget->parentWidget())
+ mainWidget->parentWidget()->setFocus();
+}
+
+QString PlayList::queryCurrentPlaylist()
+{
+ QString pl = m_playlistSelector->text(m_currentPlaylist);
+ return (m_playlistDirectory + pl + ".kaffeine");
+}
+
+void PlayList::saveCurrentPlaylist()
+{
+ QString pl = m_playlistSelector->text(m_currentPlaylist);
+ savePlaylist(m_playlistDirectory + pl + ".kaffeine");
+}
+
+void PlayList::removeCurrentPlaylist()
+{
+ int code = KMessageBox::warningContinueCancel(0, i18n("Remove '%1' from list and from disk?").arg(m_playlistSelector->text(m_currentPlaylist)),QString::null,KStdGuiItem::del());
+ if (code == KMessageBox::Continue)
+ {
+ QString pl = m_playlistDirectory + m_playlistSelector->text(m_currentPlaylist) + ".kaffeine";
+ if (!KIO::NetAccess::del(pl, mainWidget))
+ kdError() << "Playlist: " << KIO::NetAccess::lastErrorString() << endl;
+
+ m_playlistSelector->removeItem(m_currentPlaylist);
+ m_currentPlaylist = m_playlistSelector->currentItem();
+ clearList();
+ add(m_playlistDirectory + m_playlistSelector->text(m_currentPlaylist) + ".kaffeine", NULL);
+ }
+}
+
+void PlayList::loadPlaylist(const QString& pl)
+{
+ saveCurrentPlaylist();
+ QString plName = KURL(pl).fileName();
+ plName = plName.remove(".kaffeine", false);
+ if (m_playlistSelector->listBox()->findItem(plName))
+ {
+ QString plNewName = NULL;
+ while (true)
+ {
+ bool ok;
+ plNewName = QInputDialog::getText(i18n("Playlist Name Already Exists"),
+ i18n("Enter different playlist name:"), QLineEdit::Normal, plName, &ok);
+ if ((ok) && (!plNewName.isEmpty()))
+ {
+ if (m_playlistSelector->listBox()->findItem(plNewName))
+ continue;
+ else
+ break;
+ }
+ else
+ {
+ kdDebug() << "Playlist: Import aborted, playlist not added" << endl;
+ return;
+ }
+ }
+ plName = plNewName;
+ }
+ m_playlistSelector->insertItem(plName, 0);
+ m_playlistSelector->setCurrentItem(0);
+ m_currentPlaylist = 0;
+ clearList();
+ add(pl, NULL);
+}
+
+/******************************************
+ * save xml playlist
+ ******************************************/
+
+void PlayList::savePlaylist(const QString& pl)
+{
+ QDomDocument doc("playlist");
+ doc.setContent(QString("<!DOCTYPE XMLPlaylist>"));
+ QDomElement root = doc.createElement("playlist");
+ root.setAttribute("client", "kaffeine");
+ doc.appendChild(root);
+
+ QDomElement entry;
+ PlaylistItem * tmp = NULL;
+
+ QListViewItemIterator it(m_list);
+ while (it.current())
+ {
+ tmp = dynamic_cast<PlaylistItem *>(it.current());
+
+ entry = doc.createElement("entry");
+
+ entry.setAttribute("title", tmp->title());
+ entry.setAttribute("artist", tmp->artist());
+ entry.setAttribute("album", tmp->album());
+ entry.setAttribute("track", tmp->track());
+ entry.setAttribute("year", tmp->year());
+ entry.setAttribute("genre", tmp->genre());
+ entry.setAttribute("url", tmp->url());
+ entry.setAttribute("mime", tmp->mime());
+ entry.setAttribute("length", tmp->length());
+
+ if(!(tmp->subtitles().isEmpty()))
+ {
+ QString subList;
+ for(unsigned int i=0; i<tmp->subtitles().count(); i++)
+ subList += tmp->subtitles()[i] + "&";
+
+ entry.setAttribute("subs", subList);
+ }
+ entry.setAttribute("currentSub", QString::number(tmp->currentSubtitle()));
+ root.appendChild(entry);
+
+ ++it;
+ }
+
+ QFile file(pl);
+ if (!file.open(IO_WriteOnly)) return;
+ QTextStream stream(&file);
+ stream.setEncoding(QTextStream::UnicodeUTF8);
+
+ stream << doc.toString();
+
+ file.close();
+ m_list->setCleared(false);
+}
+
+/**********************/
+
+void PlayList::exportM3UPlaylist(const QString& pl)
+{
+ PlaylistItem * tmp = NULL;
+
+ QListViewItemIterator it(m_list);
+
+ int length = -1;
+ QString m3uList = "#EXTM3U\n";
+
+ while (it.current())
+ {
+ tmp = dynamic_cast<PlaylistItem *>(it.current());
+
+ length = timeStringToMs(tmp->length()) / 1000;
+ if ( length == 0 )
+ length = -1;
+
+ m3uList.append("#EXTINF:" + QString::number(length) + "," + tmp->title());
+ if (tmp->artist().isEmpty() )
+ m3uList.append("\n");
+ else
+ m3uList.append(" - " + tmp->artist() + "\n");
+ m3uList.append(tmp->url() + "\n");
+ ++it;
+ }
+
+ QFile file(pl);
+ if (!file.open(IO_WriteOnly)) return;
+ QTextStream stream(&file);
+ stream.setEncoding(QTextStream::UnicodeUTF8);
+
+ stream << m3uList;
+
+ file.close();
+}
+
+void PlayList::exportPLSPlaylist(const QString& pl)
+{
+ PlaylistItem * tmp = NULL;
+
+ QListViewItemIterator it(m_list);
+
+ int counter = 0;
+ int length = -1;
+
+ QString plsList = "[playlist]\n";
+
+ while (it.current())
+ {
+ tmp = dynamic_cast<PlaylistItem *>(it.current());
+ ++counter;
+
+ length = timeStringToMs(tmp->length()) / 1000;
+
+ if ( length == 0 ) {
+ length = -1;
+ }
+
+ plsList.append("File" + QString::number(counter) + "=" + tmp->url() + "\n");
+ plsList.append("Title" + QString::number(counter) + "=" + tmp->title());
+ if (tmp->artist().isEmpty() )
+ plsList.append("\n");
+ else
+ plsList.append(" - " + tmp->artist() + "\n");
+ plsList.append("Length" + QString::number(counter) + "=" + QString::number(length) + "\n");
+ ++it;
+
+ }
+
+ plsList.append("NumberOfEntries=" + QString::number(counter) + "\n");
+ plsList.append("Version=2");
+
+ QFile file(pl);
+ if (!file.open(IO_WriteOnly)) return;
+ QTextStream stream(&file);
+ stream.setEncoding(QTextStream::UnicodeUTF8);
+
+ stream << plsList;
+
+ file.close();
+}
+
+void PlayList::resetSearch()
+{
+ m_playlistFilter->clear();
+ slotFindText( "" );
+}
+
+void PlayList::slotFindText(const QString& text)
+{
+ if (text == i18n("Filter")) return;
+
+ QListViewItemIterator it(m_list);
+ m_playTimeVisible = 0;
+ m_countVisible = 0;
+ PlaylistItem* tmp = NULL;
+ while ( it.current() )
+ {
+ tmp = dynamic_cast<PlaylistItem *>(it.current());
+ if (text.isEmpty() || tmp->title().contains(text, false) || tmp->url().contains(text, false)
+ || tmp->artist().contains(text, false) || tmp->album().contains(text, false) )
+ {
+ tmp->setVisible(true);
+ if (tmp->length().contains(':'))
+ m_playTimeVisible += timeStringToMs(tmp->length());
+
+ m_countVisible++;
+ }
+ else
+ {
+ tmp->setVisible(false);
+ if (tmp == m_currentEntry)
+ {
+ tmp->setPixmap(TITLE_COLUMN, QPixmap());
+ m_currentEntry = NULL;
+ m_currentRandomListEntry = -1;
+ }
+ }
+ ++it;
+ }
+
+ if (text.isEmpty())
+ m_searchSelection = false;
+ else
+ m_searchSelection = true;
+
+ if (m_random) createRandomList();
+ updateStatus();
+}
+
+
+/***************** cut/copy/paste *************************/
+
+void PlayList::slotCut()
+{
+ slotCopy();
+ slotRemoveSelected();
+}
+
+void PlayList::slotPaste()
+{
+ QPtrList<QListViewItem> selected;
+ selected = m_list->selectedItems();
+ QListViewItem* lastSelected = NULL;
+ if (selected.count())
+ lastSelected = selected.at(selected.count() - 1);
+ else
+ lastSelected = m_list->lastItem();
+
+ QStrList list;
+
+ if (QUriDrag::decode(QApplication::clipboard()->data(), list))
+ {
+ QStringList urls;
+ for (QStrListIterator it(list); *it; ++it)
+ urls.append(QUriDrag::uriToUnicodeUri(*it));
+ add(urls, lastSelected);
+ return;
+ }
+ /** try to decode as text **/
+ QString text;
+ if (QTextDrag::decode(QApplication::clipboard()->data(), text))
+ {
+ add(text, lastSelected);
+ }
+}
+
+void PlayList::slotCopy()
+{
+ QPtrList<QListViewItem> selected;
+ selected = m_list->selectedItems();
+
+ QStrList urlList;
+
+ for (uint i=0; i<selected.count(); i++)
+ {
+ urlList.append(QUriDrag::unicodeUriToUri(dynamic_cast<PlaylistItem *>(selected.at(i))->url()));
+ }
+
+ QApplication::clipboard()->setData(new QUriDrag(urlList));
+}
+
+void PlayList::slotSelectAll()
+{
+ QListViewItemIterator it(m_list);
+ while (it.current())
+ {
+ if ((*it)->isVisible())
+ m_list->setSelected(*it, true);
+ ++it;
+ }
+}
+
+void PlayList::slotPlaylistFromSelected()
+{
+ QPtrList<QListViewItem> selected;
+ selected = m_list->selectedItems();
+
+ QValueList<MRL> mrlList;
+
+ for (uint i=0; i<selected.count(); i++)
+ {
+ mrlList.append(dynamic_cast<PlaylistItem *>(selected.at(i))->toMRL());
+ }
+
+ if (mrlList.count())
+ {
+ slotNewList();
+ add(mrlList, NULL);
+ }
+}
+
+void PlayList::slotAddToQueue(MRL mrl)
+{
+ m_queue.append(mrl);
+ updateStatus();
+}
+
+/**** helper ****/
+
+QString PlayList::msToTimeString(int msec)
+{
+ /*
+ QTime t;
+ t = t.addMSecs(msec);
+ return t.toString("h:mm:ss");
+ */
+ /* can be >24h */
+ int hours;
+ int min;
+ int sec;
+ int my_msec=msec;
+ QString tmp;
+ QString t;
+
+ msec = msec/1000; //sec
+ hours = msec/3600;
+ my_msec -= hours*3600*1000;
+ t = t.setNum(hours);
+ t.append(":");
+
+ msec = msec - (hours*3600);
+ min = msec / 60;
+ my_msec -= min*60*1000;
+ tmp = tmp.setNum(min);
+ tmp = tmp.rightJustify(2, '0');
+ t.append(tmp);
+ t.append(":");
+
+ sec = msec - (min*60);
+ my_msec -= sec*1000;
+ if(my_msec > 500)
+ sec++;
+ tmp = tmp.setNum(sec);
+ tmp = tmp.rightJustify(2, '0');
+ t.append(tmp);
+
+ return t;
+}
+
+int PlayList::timeStringToMs(const QString& timeString)
+{
+ int sec = 0;
+ QStringList tokens = QStringList::split(':',timeString);
+
+ bool ok = false;
+ sec += tokens[0].toInt(&ok)*3600; //hours
+ if (!ok)
+ return 0;
+ sec += tokens[1].toInt(&ok)*60; //minutes
+ if (!ok)
+ return 0;
+ sec += tokens[2].toInt(&ok); //secs
+
+ if (ok)
+ return sec*1000; //return millisecs
+ else
+ return 0;
+}
+
+bool PlayList::endsWith(QString s1, QString s2, bool caseSensitive )
+{
+ if ( s1.isNull() || s2.isNull() )
+ return false;
+ int startPos = s1.length() - s2.length();
+
+ for (unsigned int i = 0; i < s2.length(); i++ )
+ {
+ if(caseSensitive)
+ {
+ if ( s1[startPos + i] != s2[i] )
+ return false;
+ }
+ else
+ {
+ if ( s1[startPos + i].lower() != s2[i].lower() )
+ return false;
+ }
+ }
+
+ return true;
+}
+
+bool PlayList::startsWith(QString s1, QString s2, bool caseSensitive )
+{
+ if ( s1.isNull() || s2.isNull() )
+ return false;
+
+ if(s2.length() > s1.length())
+ return false;
+
+ for (unsigned int i = 0; i < s2.length(); i++ )
+ {
+ if(caseSensitive)
+ {
+ if ( s1[i] != s2[i] )
+ return false;
+ }
+ else
+ {
+ if ( s1[i].lower() != s2[i].lower() )
+ return false;
+ }
+ }
+
+ return true;
+}
+
+SubtitleChooser::SubtitleChooser(QStringList values, QString filename,QWidget *parent, const char * name) :
+ KDialogBase(parent,name,true,i18n("Select Subtitle"), Ok|Cancel, Ok, true)
+{
+ QVBox *page = makeVBoxMainWidget();
+ QLabel *label = new QLabel(page);
+ label->setText("<qt>" + i18n("Media file:") + " <b>" + filename + "</b></qt>");
+ table = new QListBox(page);
+ this->setMinimumSize(300,200);
+
+ table->setFocus();
+ table->insertStringList(values);
+ table->setSelected(0, true);
+}
+
+SubtitleChooser::~SubtitleChooser(){}
+
+QString SubtitleChooser::getSelection()
+{
+ return table->selectedItem()->text();
+}
+
+MovieChooser::MovieChooser(QStringList values, QString filename,QWidget *parent, const char * name) :
+ KDialogBase(parent,name,true,i18n("Select Movie"), Ok|Cancel, Ok, true)
+{
+ QVBox *page = makeVBoxMainWidget();
+ QLabel *label = new QLabel(page);
+ label->setText("<qt> " + i18n("Subtitle file:") + " <b>" + filename + "</b></qt>");
+ table = new QListBox(page);
+ this->setMinimumSize(450,200);
+
+ table->setFocus();
+ table->insertStringList(values);
+ table->setSelected(0, true);
+}
+
+MovieChooser::~MovieChooser(){}
+
+QString MovieChooser::getSelection()
+{
+ return table->selectedItem()->text();
+}
diff --git a/kaffeine/src/input/audiobrowser/playlist.h b/kaffeine/src/input/audiobrowser/playlist.h
new file mode 100644
index 0000000..41df120
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/playlist.h
@@ -0,0 +1,336 @@
+/*
+ * playlist.h
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2005-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef PLAYLIST_H
+#define PLAYLIST_H
+
+#include <kdialogbase.h>
+#include <kdiroperator.h>
+#include <kfileiconview.h>
+#include <kaction.h>
+#include <kstdaction.h>
+
+#include <qwidget.h>
+#include <qptrlist.h>
+#include <qvbox.h>
+#include <qsplitter.h>
+#include <qpainter.h>
+#include <qtoolbutton.h>
+
+#include "urllistview.h"
+#include "kaffeineinput.h"
+
+class UrlListView;
+class MRL;
+class KURL;
+class QListViewItem;
+class QString;
+class QLabel;
+class QColor;
+class QDropEvent;
+class QPixmap;
+class KLineEdit;
+class KComboBox;
+class KURLComboBox;
+class KConfig;
+class KPushButton;
+class GoogleFetcher;
+
+
+
+class GalleryDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ GalleryDialog( QWidget *parent, GoogleFetcher *goog );
+protected slots:
+ void slotOk();
+ void slotNext();
+private:
+ QFrame *imageFrame;
+ GoogleFetcher *google;
+ QTimer next;
+ QHBox *hbox;
+};
+
+
+
+class RollTitle : public QLabel
+{
+ Q_OBJECT
+
+public:
+ RollTitle( QWidget *parent );
+ void setTitle( MRL mrl );
+
+private:
+ void setTitle( QString t );
+ QTimer titleTimer;
+ QPixmap titlePix;
+ QColor back, fore;
+ int titleOffset;
+ QString title;
+
+protected:
+ void paintEvent ( QPaintEvent * );
+
+private slots:
+ void rollTitle();
+};
+
+
+
+class CoverFrame : public QFrame
+{
+ Q_OBJECT
+
+public:
+ CoverFrame( QWidget *parent );
+ ~CoverFrame();
+ void setCoverPixmap( const QString &path );
+
+protected:
+ void mousePressEvent( QMouseEvent *e );
+
+private:
+ void popup( const QPixmap &pix ) const;
+ QString imagePath;
+ QPixmap noCoverPix;
+
+signals:
+ void changeCurrentCover();
+ void gallery();
+};
+
+
+
+class PlayList : public KaffeineInput
+{
+ Q_OBJECT
+
+public:
+ PlayList(QWidget *parent, QObject *objParent, const char *name=0);
+ ~PlayList();
+
+ // Reimplemented from KaffeineInput
+public:
+ QWidget *wantPlayerWindow();
+ QWidget *inputMainWidget();
+ void mergeMeta(const MRL&);
+ bool nextTrack( MRL& );
+ bool previousTrack( MRL& );
+ bool currentTrack( MRL& );
+ bool trackNumber( int, MRL& );
+ bool playbackFinished( MRL& );
+ void getTargets( QStringList &uiNames, QStringList &iconNames, QStringList &targetNames );
+ void togglePanel();
+ bool execTarget( const QString& );
+ void saveConfig();
+ bool showPlayer() {return !m_showPlayer->isChecked();}
+ //***************************************
+
+public:
+ MRL getCurrent(); /* get current playlist entry */
+ MRL getNext();
+ MRL getEntryWithNumber(int number);
+ void setCurrentEntry(QListViewItem*, bool playIcon = true);
+
+ QListViewItem* getLast();
+ QListViewItem* getFirst();
+ QListViewItem* findByURL(const QString&);
+
+ /* insert a KURL(list) after a specific item */
+ void add(const QString& url, QListViewItem* after);
+ void add(const QStringList& urls, QListViewItem* after);
+ void add(const QValueList<MRL>&, QListViewItem* after);
+
+ bool isQueueMode() { return m_queue.count(); }
+
+ void setPlaylist(const QString& name, bool clear = false);
+ void nextPlaylist();
+ void removeCurrentPlaylist();
+ void saveCurrentPlaylist();
+ QString queryCurrentPlaylist();
+ void loadConfig(KConfig*);
+ void saveConfig(KConfig*);
+ void clearList();
+
+ void setEndless(bool);
+ void setRandom(bool);
+
+ void useAlternateEncoding(bool);
+ void setAlternateEncoding(const QString&);
+
+ void setFileFilter(const QString& filter);
+ void savePlaylist(const QString&);
+ void loadPlaylist(const QString&);
+
+ void exportM3UPlaylist(const QString&);
+ void exportPLSPlaylist(const QString&);
+
+ const bool getReadMetaOnLoading() const { return m_metaOnLoading; }
+
+ QVBox *mainWidget;
+ QVBox *playerBox;
+
+public slots:
+ void slotToggleShuffle();
+
+protected:
+ void closeEvent(QCloseEvent*);
+
+private slots:
+ void slotNewList();
+ void slotSetReadMetaOnLoading(bool read) { m_metaOnLoading = read; }
+ void slotSetAlternateColor(const QColor&);
+ void slotPlayDirect(QListViewItem* item); /* doubleclick */
+ void slotDropEvent(QDropEvent*, QListViewItem*);
+ void slotPreDropEvent();
+ void slotCut();
+ void slotPaste();
+ void slotCopy();
+ void slotSelectAll();
+ void slotPlaylistFromSelected();
+ void slotAddToQueue(MRL);
+ void slotRemoveSelected();
+ void slotFindText(const QString&);
+ void slotSort(int);
+ void slotPlaylistActivated(int);
+ void slotNewPlaylistName(const QString&);
+ void slotRepeat();
+ void slotShuffle();
+ void slotAutoCover();
+ void slotShowPlayer();
+ void slotPlaylistLoad();
+ void slotPlaylistSaveAs();
+ void slotPlaylistRemove();
+ void setCover( QString s1, QString s2, bool forceFetch=false );
+ void chooseCurrentCover();
+ void showGallery();
+ void startPlaylist();
+ void fileSelected( const KFileItem* );
+ void setBrowserURL( const QString& );
+ void setBrowserURL( const KURL& );
+ void browserURLChanged( const KURL& );
+ void slotClearList();
+ void resetSearch();
+
+private:
+ QListViewItem* insertItem(QListViewItem* after, const MRL&);
+ void updateStatus();
+ void createRandomList();
+ void getMetaInfo(MRL& mrl, const QString& mimeName);
+ void setupActions();
+ /* helpers */
+ static QString msToTimeString(int);
+ static int timeStringToMs(const QString&);
+ static bool endsWith(QString, QString, bool);
+ static bool startsWith(QString, QString, bool);
+
+private:
+ QColor m_altCol;
+ KComboBox* m_playlistSelector;
+ QToolButton *searchBtn;
+ KLineEdit* m_playlistFilter;
+ int m_nextPlaylistNumber;
+ QString m_playlistDirectory;
+ int m_currentPlaylist;
+ KURLComboBox *browserComb;
+
+ QSplitter *hSplit, *vSplit;
+ QVBox *panel;
+ QWidget *playlist;
+ KDirOperator *fileBrowser;
+ KFileIconView *view;
+ CoverFrame *coverFrame;
+ GoogleFetcher *google;
+ QString coverImageFormat;
+ RollTitle *roller;
+
+ KToggleAction *m_repeat, *m_shuffle, *m_autoCover, *m_showPlayer;
+
+ QValueList<MRL> m_queue;
+
+ uint m_playTime;
+ uint m_playTimeVisible;
+ uint m_countVisible;
+
+ bool m_searchSelection;
+ bool m_metaOnLoading;
+ bool m_sortAscending;
+
+ UrlListView* m_list;
+ QListViewItem* m_currentEntry;
+ MRL m_currentEntryMRL;
+
+ QString m_fileFilter;
+ QString m_metaInfoString;
+ QString m_lastPlaylist;
+
+ QPtrList<QListViewItem> m_randomList;
+ int m_currentRandomListEntry;
+
+ QPixmap m_isCurrentEntry;
+ QPixmap m_cdPixmap;
+
+ bool m_endless;
+ bool m_random;
+ bool m_cover;
+
+ bool m_useAlternateEncoding;
+ QString m_alternateEncoding;
+
+signals:
+ void signalRequestForAudioCD(const QString&);
+ void signalRequestForDVD(const QString&);
+ void signalRequestForVCD(const QString&);
+};
+
+class QListBox;
+class QStringList;
+
+class SubtitleChooser : public KDialogBase
+{
+ Q_OBJECT
+public:
+ SubtitleChooser(QStringList, QString, QWidget *parent=0, const char *name = 0);
+ virtual ~SubtitleChooser();
+
+ QString getSelection();
+
+private:
+ QListBox *table;
+};
+
+class MovieChooser : public KDialogBase
+{
+ Q_OBJECT
+public:
+ MovieChooser(QStringList, QString, QWidget *parent=0, const char *name = 0);
+ virtual ~MovieChooser();
+
+ QString getSelection();
+
+private:
+ QListBox *table;
+};
+
+#endif /* PLAYLIST_H */
diff --git a/kaffeine/src/input/audiobrowser/playlistitem.cpp b/kaffeine/src/input/audiobrowser/playlistitem.cpp
new file mode 100644
index 0000000..3b5fc05
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/playlistitem.cpp
@@ -0,0 +1,268 @@
+/*
+ * playlistitem.cpp - a self-displayable item for kaffeine's playlist
+ *
+ * Copyright (C) 2004-2005 Giorgos Gousios
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qstringlist.h>
+
+#include <kdebug.h>
+
+#include "mrl.h"
+#include "playlistitem.h"
+
+PlaylistItem::PlaylistItem(KListView *list, KListViewItem *after, const QString& url, const QString& mime, const QString& title,
+ const QString& length, const QString& artist, const QString& album, const QString& year, const QString& genre,
+ const QString& track, const QStringList& subtitles, int currentSubtitle) :
+ KListViewItem(list, after, mime, title, artist, album, track, length),
+ m_url(url), m_year(year), m_genre(genre), m_subtitles(subtitles), m_currentSubtitle(currentSubtitle), isCurrent(false)
+{}
+
+PlaylistItem::PlaylistItem(KListView* list, KListViewItem* after, const MRL& mrl) :
+ KListViewItem(list, after, mrl.mime(), mrl.title(), mrl.artist(), mrl.album(),
+ mrl.track(), mrl.length().toString("h:mm:ss")), m_url(mrl.url()),
+ m_year(mrl.year()), m_genre(mrl.genre()),
+ m_subtitles(mrl.subtitleFiles()), m_currentSubtitle(mrl.currentSubtitle()), isCurrent(false)
+{}
+
+PlaylistItem::~PlaylistItem() {}
+
+MRL PlaylistItem::toMRL() const
+{
+ return MRL(url(), title(), stringToTime(length()), mime(), artist(), album(), track(), year(), genre(), QString::null, subtitles(), currentSubtitle());
+}
+
+const QString& PlaylistItem::url() const
+{
+ return m_url;
+}
+
+QString PlaylistItem::mime() const
+{
+ return this->text(MIME_COLUMN);
+}
+
+QString PlaylistItem::title() const
+{
+ return this->text(TITLE_COLUMN);
+}
+
+QString PlaylistItem::artist() const
+{
+ return this->text(ARTIST_COLUMN);
+}
+
+QString PlaylistItem::album() const
+{
+ return this->text(ALBUM_COLUMN);
+}
+
+QString PlaylistItem::track() const
+{
+ return this->text(TRACK_COLUMN);
+}
+
+QString PlaylistItem::year() const
+{
+ return m_year;
+}
+
+QString PlaylistItem::genre() const
+{
+ return m_genre;
+}
+
+QString PlaylistItem::length() const
+{
+ return this->text(LENGTH_COLUMN);
+}
+
+const QStringList& PlaylistItem::subtitles() const
+{
+ return m_subtitles;
+}
+
+int PlaylistItem::currentSubtitle() const
+{
+ return m_currentSubtitle;
+}
+
+void PlaylistItem::setUrl(const QString& url)
+{
+ m_url = url;
+}
+
+void PlaylistItem::setMime(const QString& mime)
+{
+ this->setText(MIME_COLUMN, mime);
+}
+
+void PlaylistItem::setTitle(const QString& title)
+{
+ this->setText(TITLE_COLUMN, title);
+}
+
+void PlaylistItem::setArtist(const QString& artist)
+{
+ this->setText(ARTIST_COLUMN, artist);
+}
+
+void PlaylistItem::setAlbum(const QString& album)
+{
+ this->setText(ALBUM_COLUMN, album);
+}
+
+void PlaylistItem::setTrack(const QString& track)
+{
+ this->setText(TRACK_COLUMN, track);
+}
+
+void PlaylistItem::setYear(const QString& year)
+{
+ m_year = year;
+}
+
+void PlaylistItem::setGenre(const QString& genre)
+{
+ m_genre = genre;
+}
+
+void PlaylistItem::setLength(const QString& length)
+{
+ this->setText(LENGTH_COLUMN, length);
+}
+
+void PlaylistItem::setSubtitles(const QStringList& subs)
+{
+ m_subtitles = subs;
+}
+
+void PlaylistItem::addSubtitle(const QString& sub)
+{
+ /* This will add subtitle & set it to the current one */
+ for (uint i=0; i < m_subtitles.count(); i++) {
+ if (m_subtitles[i] == sub) {
+ m_currentSubtitle = i;
+ return;
+ }
+ }
+ m_subtitles.append(sub);
+ m_currentSubtitle = m_subtitles.count()-1;
+}
+
+void PlaylistItem::setCurrentSubtitle(int sub)
+{
+ m_currentSubtitle = sub;
+}
+
+QTime PlaylistItem::stringToTime(const QString& timeString)
+{
+ int sec = 0;
+ bool ok = false;
+ QStringList tokens = QStringList::split(':',timeString);
+
+ sec += tokens[0].toInt(&ok)*3600; //hours
+ sec += tokens[1].toInt(&ok)*60; //minutes
+ sec += tokens[2].toInt(&ok); //secs
+
+ if (ok)
+ return QTime().addSecs(sec);
+ else
+ return QTime();
+}
+
+int PlaylistItem::compare(QListViewItem *i, int col, bool ascending ) const
+{
+ PlaylistItem* p = dynamic_cast<PlaylistItem*>(i);
+ if (!p)
+ return QListViewItem::compare(i, col, ascending);
+
+ //if both strings are empty, sort by filename
+ if (text(col).isEmpty() && i->text(col).isEmpty())
+ return -url().compare(p->url());
+
+ bool ok;
+ int track1, track2 = 0;
+ track1 = track().toInt(&ok);
+ if (ok)
+ track2 = p->track().toInt(&ok);
+
+ if (col == TRACK_COLUMN)
+ {
+ if (ok)
+ return (track2 - track1);
+ else
+ return QListViewItem::compare(i, col, ascending);
+ }
+ else
+ {
+ int result = QListViewItem::compare(i, col, ascending);
+
+ //if artists are equal, compare albums
+ if ((col == ARTIST_COLUMN) && (result == 0))
+ {
+ result = QListViewItem::compare(i, ALBUM_COLUMN, ascending);
+ if (!ascending)
+ result = -result;
+ }
+
+ //if strings are equal, sort by track number or filename
+ if (result == 0)
+ {
+ int diff;
+ if (ok)
+ diff = track1 - track2;
+ else
+ diff = url().compare(p->url());
+
+ if (ascending)
+ return diff;
+ else
+ return -diff;
+ }
+ else
+ return result;
+ }
+}
+
+void PlaylistItem::setPlaying(bool playing)
+{
+ isCurrent = playing;
+}
+
+void PlaylistItem::paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int align)
+{
+ if (isCurrent)
+ {
+ QColorGroup colorGroup = cg;
+
+ QColor base = colorGroup.base();
+ QColor selection = colorGroup.highlight();
+
+ int r = (base.red() + selection.red()) / 2;
+ int b = (base.blue() + selection.blue()) / 2;
+ int g = (base.green() + selection.green()) / 2;
+
+ QColor c(r, g, b);
+
+ colorGroup.setColor(QColorGroup::Base, c);
+ QListViewItem::paintCell(p, colorGroup, column, width, align);
+ }
+ else
+ return KListViewItem::paintCell(p, cg, column, width, align);
+}
diff --git a/kaffeine/src/input/audiobrowser/playlistitem.h b/kaffeine/src/input/audiobrowser/playlistitem.h
new file mode 100644
index 0000000..9b1b9f5
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/playlistitem.h
@@ -0,0 +1,93 @@
+/*
+ * playlistitem.h - a self-displayable item for kaffeine's playlist
+ *
+ * Copyright (C) 2004-2005 Giorgos Gousios
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef PLAYLISTITEM_H
+#define PLAYLISTITEM_H
+
+#include <klistview.h>
+
+#define MIME_COLUMN 0
+#define TITLE_COLUMN 1
+#define ARTIST_COLUMN 2
+#define ALBUM_COLUMN 3
+#define TRACK_COLUMN 4
+#define LENGTH_COLUMN 5
+
+class QTime;
+class QString;
+class QStringList;
+class MRL;
+
+class PlaylistItem : public KListViewItem
+{
+
+public:
+ PlaylistItem(KListView *list, KListViewItem *after, const QString& url, const QString& mime, const QString& title,
+ const QString& length = QString::null, const QString& artist = QString::null, const QString& album = QString::null,
+ const QString& track = QString::null, const QString& year = QString::null, const QString& genre = QString::null,
+ const QStringList& subtitles = QStringList(), int currentSubtitle = -1);
+ PlaylistItem(KListView* list, KListViewItem* after, const MRL&);
+ virtual ~PlaylistItem();
+
+ MRL toMRL() const;
+
+ const QString& url() const;
+ QString mime() const;
+ QString title() const;
+ QString artist() const;
+ QString album() const;
+ QString track() const;
+ QString year() const;
+ QString genre() const;
+ QString length() const;
+ const QStringList& subtitles() const;
+ int currentSubtitle() const;
+
+ void setUrl(const QString&);
+ void setMime(const QString&);
+ void setTitle(const QString&);
+ void setArtist(const QString&);
+ void setAlbum(const QString&);
+ void setTrack(const QString&);
+ void setYear(const QString&);
+ void setGenre(const QString&);
+ void setLength(const QString&);
+ void setSubtitles(const QStringList&);
+ void addSubtitle(const QString&);
+ void setCurrentSubtitle(int);
+
+ //reimplement to fix track order
+ int compare( QListViewItem *i, int col, bool ascending ) const;
+
+ void setPlaying(bool playing);
+ virtual void paintCell(QPainter *p, const QColorGroup &cg, int column, int width, int align);
+
+private:
+ static QTime stringToTime(const QString&);
+ QString m_url;
+ QString m_year;
+ QString m_genre;
+ QStringList m_subtitles;
+ int m_currentSubtitle;
+ bool isCurrent;
+};
+
+#endif /* PLAYLISTITEM_H */
diff --git a/kaffeine/src/input/audiobrowser/urllistview.cpp b/kaffeine/src/input/audiobrowser/urllistview.cpp
new file mode 100644
index 0000000..49cfc3c
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/urllistview.cpp
@@ -0,0 +1,347 @@
+/*
+ * urllistview.cpp
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kdebug.h>
+#include <kurl.h>
+#include <kglobalsettings.h>
+#include <kfiledialog.h>
+#include <kpopupmenu.h>
+
+#include <qfontmetrics.h>
+#include <qdragobject.h>
+
+#include "mrl.h"
+#include "playlistitem.h"
+#include "urllistview.h"
+#include "urllistview.moc"
+
+
+UrlListView::UrlListView(QWidget *parent, const char *name ) : KListView(parent,name),
+ m_listCleared(true), m_itemOfContextMenu(NULL)
+{
+ m_contextMenu = new KPopupMenu(this);
+ m_contextMenu->insertItem(KGlobal::iconLoader()->loadIconSet("player_play", KIcon::Small), i18n("Play"), this, SLOT(slotPlayItem()));
+ m_contextMenu->insertItem(i18n("Play Next/Add to Queue"), this, SLOT(slotPlayNext()));
+ m_contextMenu->insertSeparator();
+
+ m_contextMenu->insertItem(KGlobal::iconLoader()->loadIconSet("editcut", KIcon::Small), i18n("C&ut"), this, SIGNAL(signalCut()), CTRL+Key_X);
+ m_contextMenu->insertItem(KGlobal::iconLoader()->loadIconSet("editcopy", KIcon::Small), i18n("&Copy"), this, SIGNAL(signalCopy()), CTRL+Key_C);
+ m_contextMenu->insertItem(KGlobal::iconLoader()->loadIconSet("editpaste", KIcon::Small), i18n("&Paste"), this, SIGNAL(signalPaste()), CTRL+Key_V);
+ m_contextMenu->insertItem(i18n("Select &All"), this, SIGNAL(signalSelectAll()), CTRL+Key_A);
+ m_contextMenu->insertItem(i18n("Create Playlist From Selected"), this, SIGNAL(signalPlaylistFromSelected()));
+ m_contextMenu->insertSeparator();
+ m_contextMenu->insertItem(KGlobal::iconLoader()->loadIconSet("indent", KIcon::Small), i18n("Add Sub&title..."), this, SLOT(slotAddSubtitle()),QKeySequence(),100 );
+ m_contextMenu->insertSeparator();
+ m_contextMenu->insertItem(KGlobal::iconLoader()->loadIconSet("edit", KIcon::Small), i18n("&Edit Title"), this, SLOT(slotEditTitle()));
+ m_contextMenu->insertItem(KGlobal::iconLoader()->loadIconSet("info", KIcon::Small), i18n("&Info"), this, SLOT(slotShowInfo()));
+
+/* width of the "length"-column */
+ QFontMetrics met(KGlobalSettings::generalFont());
+ int w1 = met.width(i18n("Length"));
+ int w2 = met.width("5:55:55") + 2;
+
+ m_column5Width = w1 > w2 ? w1 : w2;
+ m_column5Width += 30;
+
+/* width of the "track"-column */
+ w1 = met.width(i18n("Track"));
+ w2 = met.width("9999") + 2;
+
+ m_column4Track = w1 > w2 ? w1 : w2;
+ m_column4Track += 36;
+
+ connect(this, SIGNAL(contextMenuRequested(QListViewItem*, const QPoint&, int)),
+ this, SLOT(slotShowContextMenu(QListViewItem*, const QPoint&, int)));
+ connect(this, SIGNAL(currentChanged(QListViewItem*)),
+ this, SLOT(slotCurrentChanged(QListViewItem*)));
+ connect(this, SIGNAL(clicked( QListViewItem*, const QPoint&, int )),
+ this, SLOT(slotClicked( QListViewItem*, const QPoint&, int )));
+}
+
+UrlListView::~UrlListView()
+{
+}
+
+bool UrlListView::acceptDrag(QDropEvent* event) const
+{
+ return QUriDrag::canDecode(event) || QTextDrag::canDecode(event) || KListView::acceptDrag(event);
+}
+
+QDragObject* UrlListView::dragObject()
+{
+ // get selected items
+ QPtrList<QListViewItem> selected;
+ QStrList urlList;
+
+ selected = selectedItems();
+ for (uint i = 0; i<selected.count(); i++)
+ {
+ urlList.append(dynamic_cast<PlaylistItem*>(selected.at(i))->url().ascii());
+ }
+
+ return new QUriDrag(urlList, viewport());
+}
+
+void UrlListView::resizeEvent(QResizeEvent* rev)
+{
+ int width = contentsRect().width() - m_column5Width - m_column4Track - 69;
+ setColumnWidth(0, 20); /* mime */
+ setColumnWidth(1, ((width * 5 / 12) + 50)); /* title */
+ setColumnWidth(2, (width * 3 / 12)); /* artist */
+ setColumnWidth(3, (width * 4 / 12)); /* album */
+ setColumnWidth(4, m_column4Track); /* track */
+ setColumnWidth(5, m_column5Width); /* width of "length" column */
+
+ KListView::resizeEvent(rev);
+}
+
+void UrlListView::clear()
+{
+ m_listCleared = true;
+ m_itemOfContextMenu = NULL;
+ setSorting(-1);
+ KListView::clear();
+}
+
+void UrlListView::setCleared(bool cl)
+{
+ m_listCleared = cl;
+}
+
+bool UrlListView::getCleared() const /* was playlist cleared ? */
+{
+ return m_listCleared;
+}
+
+/********** context menu **********/
+
+void UrlListView::slotShowContextMenu(QListViewItem* item, const QPoint& pos, int)
+{
+ if (!item)
+ {
+ m_itemOfContextMenu = NULL;
+ disableSubEntry();
+ }
+ else
+ {
+ m_itemOfContextMenu = dynamic_cast<PlaylistItem *>(item);
+ if (m_itemOfContextMenu->mime().contains("video"))
+ enableSubEntry();
+ else
+ disableSubEntry();
+ }
+
+ m_contextMenu->popup(pos);
+}
+
+void UrlListView::slotPlayItem()
+{
+ if (m_itemOfContextMenu)
+ emit signalPlayItem(m_itemOfContextMenu);
+}
+
+void UrlListView::slotPlayNext()
+{
+ if (m_itemOfContextMenu)
+ emit signalAddToQueue(m_itemOfContextMenu->toMRL());
+}
+
+void UrlListView::slotEditTitle()
+{
+ if (m_itemOfContextMenu)
+ {
+ m_itemOfContextMenu->setRenameEnabled(1, true);
+ m_itemOfContextMenu->startRename(1);
+ m_itemOfContextMenu->setRenameEnabled(1, false);
+ }
+}
+
+//Pretty print item info
+void UrlListView::slotShowInfo()
+{
+ if (!m_itemOfContextMenu)
+ return;
+
+ QString num;
+ num = num.setNum(childCount());
+ QString info = "<qt><table width=\"90%\">";
+ info = info + "<tr><td colspan=\"2\"><center><b>" + m_itemOfContextMenu->title() + "</b></center></td></tr>";
+ info = info + "<tr><td><b>" + i18n("URL")+ ":</b></td><td>" + m_itemOfContextMenu->url() + "</td></tr>";
+ info = info + "<tr><td><b>" + i18n("Artist") + ":</b></td><td>" + m_itemOfContextMenu->artist() + "</td></td>";
+ info = info + "<tr><td><b>" + i18n("Album") + ":</b></td><td>" + m_itemOfContextMenu->album() + "</td></td>";
+ info = info + "<tr><td><b>" + i18n("Track") + ":</b></td><td>" + m_itemOfContextMenu->track() + "</td></td>";
+ info = info + "<tr><td><b>" + i18n("Year") + ":</b></td><td>" + m_itemOfContextMenu->year() + "</td></td>";
+ info = info + "<tr><td><b>" + i18n("Genre") + ":</b></td><td>" + m_itemOfContextMenu->genre() + "</td></td>";
+ info = info + "<tr><td><b>" + i18n("Length") + ":</b></td><td>" + m_itemOfContextMenu->length() + "</td></tr>";
+ if(!m_itemOfContextMenu->subtitles().isEmpty())
+ {
+ info = info + "<tr><td><b>" + i18n("Subtitles") + ":</b></td><td>";
+
+ for(uint i = 0; i < m_itemOfContextMenu->subtitles().count(); i++ )
+ {
+ info = info + ""+m_itemOfContextMenu->subtitles()[i];
+ if(m_itemOfContextMenu->currentSubtitle() == (int)i)
+ info = info + "<small> ("+i18n("in use")+")</small>";
+ info = info + "<br>";
+ }
+ info = info + "</ul></td></tr></table></qt>";
+ }
+
+ KMessageBox::information(this, info);
+}
+
+void UrlListView::slotClicked(QListViewItem*, const QPoint&, int)
+{
+ /*if ( (item) && (col == 3) )
+ {
+ m_itemOfContextMenu = dynamic_cast<PlaylistItem *>(item);
+ if (!m_itemOfContextMenu) return;
+ slotShowInfo();
+ } */
+}
+
+#include <qdom.h>
+#include <kio/job.h>
+
+void UrlListView::slotAddSubtitle()
+{
+ /*QDomDocument reqdoc;
+
+ QDomElement methodCall = reqdoc.createElement( "methodCall" );
+ QDomElement methodName = reqdoc.createElement( "methodName" );
+ QDomText methodNameValue = reqdoc.createTextNode( "LogIn" );
+ methodName.appendChild( methodNameValue );
+ methodCall.appendChild( methodName );
+ reqdoc.appendChild( methodCall );
+
+ QDomElement params = reqdoc.createElement( "params" );
+
+ QDomElement param1 = reqdoc.createElement( "param" );
+ QDomElement value1 = reqdoc.createElement( "value" );
+ QDomElement type1 = reqdoc.createElement( "string" );
+ QDomText param1Value = reqdoc.createTextNode( "" );
+ type1.appendChild( param1Value );
+ value1.appendChild( type1 );
+ param1.appendChild( value1 );
+ params.appendChild( param1 );
+
+ QDomElement param2 = reqdoc.createElement( "param" );
+ QDomElement value2 = reqdoc.createElement( "value" );
+ QDomElement type2 = reqdoc.createElement( "string" );
+ QDomText param2Value = reqdoc.createTextNode( "" );
+ type2.appendChild( param2Value );
+ value2.appendChild( type2 );
+ param2.appendChild( value2 );
+ params.appendChild( param2 );
+
+ QDomElement param3 = reqdoc.createElement( "param" );
+ QDomElement value3 = reqdoc.createElement( "value" );
+ QDomElement type3 = reqdoc.createElement( "string" );
+ QDomText param3Value = reqdoc.createTextNode( "en" );
+ type3.appendChild( param3Value );
+ value3.appendChild( type3 );
+ param3.appendChild( value3 );
+ params.appendChild( param3 );
+
+ methodCall.appendChild( params );
+
+ const QString xmlRequest = "<?xml version=\"1.0\"?>\n" + reqdoc.toString();
+
+ QByteArray postData;
+ QDataStream stream( postData, IO_WriteOnly );
+ stream.writeRawBytes( xmlRequest.utf8(), xmlRequest.utf8().length() );
+
+ openSubJobBuf = QByteArray();
+
+ openSubJob = KIO::http_post( "http://test.opensubtitles.org/xml-rpc", postData, false );
+ openSubJob->addMetaData( "content-type", "Content-Type: text/xml" );
+
+ connect( openSubJob, SIGNAL(result(KIO::Job*)), this, SLOT(openSubResult(KIO::Job*)) );
+ connect( openSubJob, SIGNAL(data(KIO::Job*,const QByteArray&) ), this, SLOT(openSubData(KIO::Job*,
+ const QByteArray&)) );
+
+ kdDebug() << "\n\n" << xmlRequest << "\n\n" << endl;*/
+
+
+ if (!m_itemOfContextMenu)
+ return;
+
+ QString openURL = m_itemOfContextMenu->url();
+ QString subtitleURL = KFileDialog::getOpenURL(openURL,
+ i18n("*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n*.*|All Files"),
+ 0, i18n("Select Subtitle File")).path();
+ if(!(subtitleURL.isEmpty()) && !(m_itemOfContextMenu->subtitles().contains(subtitleURL)) && QFile::exists(subtitleURL))
+ {
+ m_itemOfContextMenu->addSubtitle(subtitleURL);
+ emit signalPlayItem(m_itemOfContextMenu);
+ }
+
+}
+
+void UrlListView::openSubResult( KIO::Job* job )
+{
+ if ( openSubJob!=job )
+ return;
+ if ( job->error() ) {
+ kdDebug() << "OpenSubtiltes error : " << job->error() << endl;
+ return;
+ }
+
+ QDomDocument document;
+ if ( !document.setContent( openSubJobBuf ) ) {
+ kdDebug() << "Couldn't read similar artists response" << endl;
+ return;
+ }
+ kdDebug() << "\n\n" << document.toString() << "\n\n" << endl;
+ openSubJob = 0;
+}
+
+void UrlListView::openSubData( KIO::Job* job, const QByteArray& data )
+{
+ if ( openSubJob != job )
+ return;
+
+ unsigned int bufsize = openSubJobBuf.size();
+ openSubJobBuf.resize( bufsize + data.size() );
+ memcpy( openSubJobBuf.data()+bufsize, data.data(), data.size() );
+}
+
+
+void UrlListView::slotCurrentChanged(QListViewItem * item)
+{
+ if(item == 0) //All items deleted
+ m_itemOfContextMenu = NULL;
+ else
+ m_itemOfContextMenu = dynamic_cast<PlaylistItem *>(item);
+}
+
+void UrlListView::enableSubEntry()
+{
+ m_contextMenu->setItemEnabled(100, true);
+}
+
+void UrlListView::disableSubEntry()
+{
+ m_contextMenu->setItemEnabled(100, false);
+}
diff --git a/kaffeine/src/input/audiobrowser/urllistview.h b/kaffeine/src/input/audiobrowser/urllistview.h
new file mode 100644
index 0000000..964b743
--- /dev/null
+++ b/kaffeine/src/input/audiobrowser/urllistview.h
@@ -0,0 +1,92 @@
+/*
+ * urllistview.h
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef URLLISTVIEW_H
+#define URLLISTVIEW_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <klistview.h>
+
+class KPopupMenu;
+class QWidget;
+class QDragObject;
+class PlaylistItem;
+class MRL;
+class KIO::Job;
+
+class UrlListView : public KListView
+{
+ Q_OBJECT
+public:
+ UrlListView(QWidget *parent=0, const char *name=0);
+ ~UrlListView();
+
+ void setCleared(bool);
+ bool getCleared() const; /* was the playlist cleared or should we save it? */
+
+public slots:
+ virtual void clear(); /* reimplement slot */
+
+signals:
+ void signalPlayItem(QListViewItem* ); /* play selected in context menu */
+ void signalCut();
+ void signalCopy();
+ void signalPaste();
+ void signalSelectAll();
+ void signalAddToQueue(MRL);
+ void signalPlaylistFromSelected();
+
+private slots:
+ void slotShowContextMenu(QListViewItem*, const QPoint&, int);
+ void slotCurrentChanged(QListViewItem *);
+ void slotAddSubtitle();
+ void slotShowInfo();
+ void slotEditTitle();
+ void slotPlayItem();
+ void slotClicked(QListViewItem*, const QPoint&, int);
+ void slotPlayNext();
+ void openSubResult( KIO::Job* );
+ void openSubData( KIO::Job*, const QByteArray& );
+
+protected:
+ virtual bool acceptDrag(QDropEvent* event) const;
+ virtual void resizeEvent(QResizeEvent*);
+ virtual QDragObject* dragObject();
+
+private:
+ void enableSubEntry();
+ void disableSubEntry();
+
+private:
+ bool m_listCleared;
+ int m_column5Width; /* width of the fifth column */
+ int m_column4Track; /* width of the fourth column */
+
+ PlaylistItem* m_itemOfContextMenu;
+ KPopupMenu* m_contextMenu;
+ KIO::Job *openSubJob;
+ QByteArray openSubJobBuf;
+
+};
+
+#endif /* URLLISTVIEW_H */
diff --git a/kaffeine/src/input/disc/Makefile.am b/kaffeine/src/input/disc/Makefile.am
new file mode 100644
index 0000000..b9827cc
--- /dev/null
+++ b/kaffeine/src/input/disc/Makefile.am
@@ -0,0 +1,36 @@
+METASOURCES = AUTO
+
+SUBDIRS = plugins .
+
+noinst_LTLIBRARIES = libkaffeinedisc.la
+
+noinst_HEADERS = cddb.h \
+ disc.h \
+ paranoia.h
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/ \
+ -I$(top_builddir)/kaffeine/src/input/ \
+ -I$(top_srcdir)/kaffeine/src/ \
+ -I$(top_srcdir)/kaffeine/src/player-parts/kaffeine-part \
+ -I$(top_srcdir)/kaffeine/src/input/disc/plugins \
+ $(all_includes)
+
+libkaffeinedisc_la_SOURCES = disc.cpp \
+ cddb.cpp \
+ paranoia.cpp \
+ paranoiasettings.ui
+
+libkaffeinedisc_la_LDFLAGS = $(KDE_RPATH) \
+ $(all_libraries) \
+ -L$(top_srcdir)/kaffeine/src/input \
+ -L$(top_srcdir)/kaffeine/src/input/disc/plugins
+
+libkaffeinedisc_la_LIBADD = $(top_builddir)/kaffeine/src/input/libkaffeineinput.la \
+ $(top_builddir)/kaffeine/src/player-parts/kaffeine-part/libkaffeinepart.la \
+ $(top_builddir)/kaffeine/src/input/disc/plugins/libkaffeineaudioencoder.la \
+ -lcdda_interface -lcdda_paranoia
+
+# this is where the XML-GUI resource file goes
+shellrcdir = $(kde_datadir)/kaffeine
+shellrc_DATA = kaffeinedisc.rc
+
diff --git a/kaffeine/src/input/disc/cddb.cpp b/kaffeine/src/input/disc/cddb.cpp
new file mode 100644
index 0000000..407fbbc
--- /dev/null
+++ b/kaffeine/src/input/disc/cddb.cpp
@@ -0,0 +1,572 @@
+/*
+ * cddb.cpp
+ *
+ * Copyright (C) 2000 Michael Matz <matz@kde.org>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <errno.h>
+#include <unistd.h>
+#include <qdir.h>
+#include <qtextstream.h>
+#include <qregexp.h>
+#include <qapplication.h>
+#include <qstring.h>
+#include <qcursor.h>
+#include <kdebug.h>
+#include <ksock.h>
+#include <kextsock.h>
+#include <klocale.h>
+#include <kinputdialog.h>
+
+#include "cddb.h"
+#include "cddb.moc"
+
+CDDB::CDDB() : ks(0), port(80), remote(false), save_local(false)
+{
+ QString s = QDir::homeDirPath()+"/.cddb";
+ cddb_dirs +=s;
+}
+
+CDDB::~CDDB()
+{
+ deinit();
+}
+
+bool CDDB::set_server(const char *hostname, unsigned short int _port)
+{
+ if (ks)
+ {
+ if (h_name == hostname && port == _port)
+ return true;
+ deinit();
+ }
+ remote = (hostname != 0) && (*hostname != 0);
+ kdDebug(7101) << "CDDB: set_server, host=" << hostname << "port=" << _port << endl;
+ if (remote)
+ {
+ ks = new KExtendedSocket(hostname, _port);
+ if (ks->connect() < 0)
+ {
+ kdDebug(7101) << "CDDB: Can't connect!" << endl;
+ delete ks;
+ ks = 0;
+ return false;
+ }
+
+ h_name = hostname;
+ port = _port;
+ QCString r;
+ readLine(r); // the server greeting
+ writeLine("cddb hello kde-user blubb kio_audiocd 0.4");
+ readLine(r);
+ }
+ return true;
+}
+
+bool CDDB::deinit()
+{
+ if (ks)
+ {
+ writeLine("quit");
+ QCString r;
+ readLine(r);
+ ks->close();
+ }
+ h_name.resize(0);
+ port = 0;
+ remote = false;
+ ks = 0;
+ return true;
+}
+
+bool CDDB::readLine(QCString& ret)
+{
+ int read_length = 0;
+ char small_b[128];
+ //fd_set set;
+
+ ret.resize(0);
+ while (read_length < 40000)
+ {
+ // Look for a \n in buf
+ int ni = buf.find('\n');
+ if (ni >= 0)
+ {
+ // Nice, so return this substring (without the \n),
+ // and truncate buf accordingly
+ ret = buf.left(ni);
+ if (ret.length() && ret[ret.length()-1] == '\r')
+ ret.resize(ret.length());
+ buf.remove(0, ni+1);
+ kdDebug(7101) << "CDDB: got `" << ret << "'" << endl;
+ return true;
+ }
+
+ // Try to refill the buffer
+ ks->waitForMore(60 * 1000);
+ ssize_t l = ks->readBlock(small_b, sizeof(small_b)-1);
+ if (l <= 0)
+ {
+ // l==0 normally means fd got closed, but we really need a lineend
+ return false;
+ }
+ small_b[l] = 0;
+ read_length += l;
+ buf += small_b;
+ }
+ return false;
+}
+
+bool CDDB::writeLine(const QCString& line)
+{
+ const char *b = line.data();
+ int l = line.length();
+ kdDebug(7101) << "CDDB: send `" << line << "'" << endl;
+ while (l)
+ {
+ ssize_t wl = ks->writeBlock(b, l);
+ if (wl < 0 && errno != EINTR)
+ return false;
+ if (wl < 0)
+ wl = 0;
+ l -= wl;
+ b += wl;
+ }
+ l = line.length();
+ if (l && line.data()[l-1] != '\n')
+ {
+ char c = '\n';
+ ssize_t wl;
+ do {
+ wl = ks->writeBlock(&c, 1);
+ } while (wl <= 0 && errno == EINTR);
+ if (wl<=0 && errno != EINTR)
+ return false;
+ }
+ return true;
+}
+
+unsigned int CDDB::get_discid(QValueList<int>& track_ofs)
+{
+ unsigned int id = 0;
+ int num_tracks = track_ofs.count() - 2;
+
+ // the last two track_ofs[] are disc begin and disc end
+
+ for (int i = num_tracks - 1; i >= 0; i--)
+ {
+ int n = track_ofs[i];
+ n /= 75;
+ while (n > 0)
+ {
+ id += n % 10;
+ n /= 10;
+ }
+ }
+ unsigned int l = track_ofs[num_tracks + 1];
+ l -= track_ofs[num_tracks];
+ l /= 75;
+ id = ((id % 255) << 24) | (l << 8) | num_tracks;
+ return id;
+}
+
+static int get_code (const QCString &s)
+{
+ bool ok;
+ int code = s.left(3).toInt(&ok);
+ if (!ok)
+ code = -1;
+ return code;
+}
+
+static void parse_query_resp (const QCString& _r, QCString& catg, QCString& d_id, QCString& title)
+{
+ QCString r = _r.stripWhiteSpace();
+ int i = r.find(' ');
+ if (i)
+ {
+ catg = r.left(i).stripWhiteSpace();
+ r.remove(0, i+1);
+ r = r.stripWhiteSpace();
+ }
+ i = r.find(' ');
+ if (i)
+ {
+ d_id = r.left(i).stripWhiteSpace();
+ r.remove(0, i+1);
+ r = r.stripWhiteSpace();
+ }
+ title = r;
+}
+
+QString CDDB::track(int i) const
+{
+ if (i < 0 || i >= int(m_names.count()))
+ return QString();
+ return m_names[i].utf8();
+}
+
+bool CDDB::parse_read_resp(QTextStream *stream, QTextStream *write_stream)
+{
+ /* Note, that m_names and m_title should be empty */
+ QCString end = ".";
+
+ /* Fill table, so we can index it below. */
+ for (int i = 0; i < m_tracks; i++)
+ {
+ m_names.append("");
+ }
+ while (1)
+ {
+ QCString r;
+ if (stream)
+ {
+ if (stream->atEnd())
+ break;
+ r = stream->readLine().latin1();
+ }
+ else
+ {
+ if (!readLine(r))
+ return false;
+ }
+ /* Normally the "." is not saved into the local files, but be
+ tolerant about this. */
+ if (r == end)
+ break;
+ if (write_stream)
+ *write_stream << r << endl;
+ r = r.stripWhiteSpace();
+ if (r.isEmpty() || r[0] == '#')
+ continue;
+ if (r.left(7) == "DTITLE=")
+ {
+ r.remove(0, 7);
+ m_title += QString::fromLocal8Bit(r.stripWhiteSpace());
+ }
+ else if (r.left(6) == "TTITLE")
+ {
+ r.remove(0, 6);
+ int e = r.find('=');
+ if (e)
+ {
+ bool ok;
+ int i = r.left(e).toInt(&ok);
+ if (ok && i >= 0 && i < m_tracks)
+ {
+ r.remove(0, e+1);
+ m_names[i] += QString::fromLocal8Bit(r);
+ }
+ }
+ }
+ }
+
+ /* XXX We should canonicalize the strings ("\n" --> '\n' e.g.) */
+
+ int si = m_title.find(" / ");
+ if (si > 0)
+ {
+ m_artist = m_title.left(si).stripWhiteSpace();
+ m_title.remove(0, si+3);
+ m_title = m_title.stripWhiteSpace();
+ }
+
+ if (m_title.isEmpty())
+ m_title = i18n("No Title");
+ /*else
+ m_title.replace(QRegExp("/"), "%2f");*/
+ if (m_artist.isEmpty())
+ m_artist = i18n("Unknown");
+ /*else
+ m_artist.replace(QRegExp("/"), "%2f");*/
+
+ kdDebug(7101) << "CDDB: found Title: `" << m_title << "'" << endl;
+ for (int i = 0; i < m_tracks; i++)
+ {
+ if (m_names[i].isEmpty())
+ m_names[i] += i18n("Track %1").arg(i);
+ m_names[i].replace(QRegExp("/"), "%2f");
+ kdDebug(7101) << "CDDB: found Track " << i+1 << ": `" << m_names[i]
+ << "'" << endl;
+ }
+ return true;
+}
+
+void CDDB::add_cddb_dirs(const QStringList& list)
+{
+ QString s = QDir::homeDirPath()+"/.cddb";
+
+ cddb_dirs = list;
+ if (cddb_dirs.isEmpty())
+ cddb_dirs += s;
+}
+
+/* Locates and opens the local file corresponding to that discid.
+ Returns TRUE, if file is found and ready for reading.
+ Returns FALSE, if file isn't found. In this case ret_file is initialized
+ with a QFile which resides in the first cddb_dir, and has a temp name
+ (the ID + getpid()). You can open it for writing. */
+bool CDDB::searchLocal(unsigned int id, QFile *ret_file)
+{
+ QDir dir;
+ QString filename;
+ filename = QString("%1").arg(id, 0, 16).rightJustify(8, '0');
+ QStringList::ConstIterator it;
+ for (it = cddb_dirs.begin(); it != cddb_dirs.end(); ++it)
+ {
+ dir.setPath(*it);
+ if (!dir.exists())
+ continue;
+ /* First look in dir directly. */
+ ret_file->setName (*it + "/" + filename);
+ if (ret_file->exists() && ret_file->open(IO_ReadOnly))
+ return true;
+ /* And then in the subdirs of dir (representing the categories normally).
+ */
+ const QFileInfoList *subdirs = dir.entryInfoList (QDir::Dirs);
+ QFileInfoListIterator fiit(*subdirs);
+ QFileInfo *fi;
+ while ((fi = fiit.current()) != 0)
+ {
+ ret_file->setName (*it + "/" + fi->fileName() + "/" + filename);
+ if (ret_file->exists() && ret_file->open(IO_ReadOnly))
+ return true;
+ ++fiit;
+ }
+ }
+ QString pid;
+ pid.setNum(::getpid());
+ ret_file->setName (cddb_dirs[0] + "/" + filename + "." + pid);
+ /* Try to create the save location. */
+ dir.setPath(cddb_dirs[0]);
+ if (save_local && !dir.exists())
+ {
+ //dir = QDir::current();
+ dir.mkdir(cddb_dirs[0]);
+ }
+ return false;
+}
+
+bool CDDB::queryCD(QValueList<int>& track_ofs)
+{
+ int num_tracks = track_ofs.count() - 2;
+ if (num_tracks < 1)
+ return false;
+ unsigned int id = get_discid(track_ofs);
+ QFile file;
+ bool local;
+
+ /* Already read this ID. */
+ if (id == m_discid)
+ return true;
+
+ emit cddbMessage(i18n("Searching local cddb entry ..."));
+ qApp->processEvents();
+
+ /* First look for a local file. */
+ local = searchLocal (id, &file);
+ /* If we have no local file, and no remote connection, barf. */
+ if (!local && (!remote || ks == 0))
+ return false;
+
+ m_tracks = num_tracks;
+ m_title = "";
+ m_artist = "";
+ m_names.clear();
+ m_discid = id;
+ if (local)
+ {
+ QTextStream stream(&file);
+ /* XXX Hmm, what encoding is used by CDDB files? local? Unicode?
+ Nothing? */
+ //stream.setEncoding(QTextStream::Locale);
+ parse_read_resp(&stream, 0);
+ file.close();
+ return true;
+ }
+
+ emit cddbMessage(i18n("Searching remote cddb entry ..."));
+ qApp->processEvents();
+
+ /* Remote CDDB query. */
+ unsigned int length = track_ofs[num_tracks+1] - track_ofs[num_tracks];
+ QCString q;
+ q.sprintf("cddb query %08x %d", id, num_tracks);
+ QCString num;
+ for (int i = 0; i < num_tracks; i++)
+ q += " " + num.setNum(track_ofs[i]);
+ q += " " + num.setNum(length / 75);
+ if (!writeLine(q))
+ return false;
+ QCString r;
+ if (!readLine(r))
+ return false;
+ r = r.stripWhiteSpace();
+ int code = get_code(r);
+ if (code == 200)
+ {
+ QCString catg, d_id, title;
+ QDir dir;
+ QCString s, pid;
+
+ emit cddbMessage(i18n("Found exact match cddb entry ..."));
+ qApp->processEvents();
+
+ /* an exact match */
+ r.remove(0, 3);
+ parse_query_resp(r, catg, d_id, title);
+ kdDebug(7101) << "CDDB: found exact CD: category=" << catg << " DiscId="
+ << d_id << " Title=`" << title << "'" << endl;
+ q = "cddb read " + catg + " " + d_id;
+ if (!writeLine(q))
+ return false;
+ if (!readLine(r))
+ return false;
+ r = r.stripWhiteSpace();
+ code = get_code(r);
+ if (code != 210)
+ return false;
+
+ pid.setNum(::getpid());
+ s = cddb_dirs[0].latin1();
+ //s = s + "/" +catg; // xine seems to not search in local subdirs
+ dir.setPath( s );
+ if ( !dir.exists() ) dir.mkdir( s );
+ s = s+"/"+ d_id;
+ file.setName( s );
+
+ if (save_local && file.open(IO_WriteOnly))
+ {
+ kdDebug(7101) << "CDDB: file name to save =" << file.name() << endl;
+ QTextStream stream(&file);
+ if (!parse_read_resp(0, &stream))
+ {
+ file.remove();
+ return false;
+ }
+ file.close();
+ /*QString newname (file.name());
+ newname.truncate(newname.findRev('.'));
+ if (QDir::current().rename(file.name(), newname)) {
+ kdDebug(7101) << "CDDB: rename failed" << endl;
+ file.remove();
+ } */
+ }
+ else if (!parse_read_resp(0, 0))
+ return false;
+ }
+ else if (code == 211)
+ {
+ // Found some close matches. We'll read the query response and ask the user
+ // which one should be fetched from the server.
+ QCString end = ".";
+ QCString catg, d_id, title;
+ QDir dir;
+ QCString s, pid, first_match;
+ QStringList disc_ids;
+
+ /* some close matches */
+ //XXX may be try to find marker based on r
+ emit cddbMessage(i18n("Found close cddb entry ..."));
+ qApp->processEvents();
+
+ int i=0;
+ while (1)
+ {
+ if (!readLine(r))
+ return false;
+ r = r.stripWhiteSpace();
+ if (r == end)
+ break;
+ disc_ids.append(r);
+ if (i == 0)
+ first_match = r;
+ i++;
+ }
+
+ bool ok = false;
+
+ // We don't want to be thinking too much, do we?
+ QApplication::restoreOverrideCursor();
+
+ // Oh, mylord, which match should I serve you?
+ QString _answer = KInputDialog::getItem(i18n("CDDB Matches"), i18n("Several close CDDB entries found. Choose one:"),
+ disc_ids, 0, false, &ok );
+ QCString answer = _answer.utf8();
+
+ if (ok){ // Get user selected match
+ parse_query_resp(answer, catg, d_id, title);
+ }
+ else{ // Get first match
+ parse_query_resp(first_match, catg, d_id, title);
+ }
+
+ // Now we can continue thinking...
+ QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
+
+ kdDebug(7101) << "CDDB: found close CD: category=" << catg << " DiscId="
+ << d_id << " Title=`" << title << "'" << endl;
+
+ // ... and forth we go as usual
+
+ q = "cddb read " + catg + " " + d_id;
+ if (!writeLine(q))
+ return false;
+ if (!readLine(r))
+ return false;
+ r = r.stripWhiteSpace();
+ code = get_code(r);
+ if (code != 210)
+ return false;
+
+ pid.setNum(::getpid());
+ s = cddb_dirs[0].latin1();
+ dir.setPath( s );
+ if ( !dir.exists() ) dir.mkdir( s );
+ s = s+"/"+ d_id;
+ file.setName( s );
+
+ if (save_local && file.open(IO_WriteOnly))
+ {
+ kdDebug(7101) << "CDDB: file name to save =" << file.name() << endl;
+ QTextStream stream(&file);
+ if (!parse_read_resp(0, &stream))
+ {
+ file.remove();
+ return false;
+ }
+ file.close();
+ }
+ else if (!parse_read_resp(0, 0))
+ return false;
+
+ }
+ else
+ {
+ /* 202 - no match found
+ 403 - Database entry corrupt
+ 409 - no handshake */
+ kdDebug(7101) << "CDDB: query returned code " << code << endl;
+ return false;
+ }
+
+ return true;
+}
diff --git a/kaffeine/src/input/disc/cddb.h b/kaffeine/src/input/disc/cddb.h
new file mode 100644
index 0000000..e75eb2d
--- /dev/null
+++ b/kaffeine/src/input/disc/cddb.h
@@ -0,0 +1,77 @@
+/*
+ * cddb.h
+ *
+ * Copyright (C) 2000 Michael Matz <matz@kde.org>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CDDB_H
+#define CDDB_H
+
+#include <qcstring.h>
+#include <qvaluelist.h>
+#include <qstringlist.h>
+#include <qobject.h>
+
+class QFile;
+class QTextStream;
+class KExtendedSocket;
+
+class CDDB : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ CDDB();
+ ~CDDB();
+ bool set_server(const char *hostname = 0, unsigned short int port = 0);
+ void add_cddb_dirs(const QStringList& list);
+ void save_cddb (bool save) { save_local = save; }
+ unsigned int get_discid(QValueList<int>& track_ofs);
+ bool queryCD(QValueList<int>& track_ofs);
+ QString title() const { return m_title.utf8(); }
+ QString artist() const { return m_artist.utf8(); }
+ int trackCount() const { return m_tracks; }
+ QString track(int i) const;
+
+private:
+
+ bool readLine(QCString& s);
+ bool writeLine(const QCString& s);
+ bool deinit();
+ bool parse_read_resp(QTextStream*, QTextStream*);
+ bool searchLocal(unsigned int id, QFile *ret_file);
+ KExtendedSocket *ks;
+ QCString h_name;
+ unsigned short int port;
+ bool remote;
+ bool save_local;
+ QStringList cddb_dirs;
+ QCString buf;
+ unsigned int m_discid;
+
+ int m_tracks;
+ QString m_title;
+ QString m_artist;
+ QStringList m_names;
+
+signals:
+
+ void cddbMessage( QString );
+};
+
+#endif /* CDDB_H */
diff --git a/kaffeine/src/input/disc/disc.cpp b/kaffeine/src/input/disc/disc.cpp
new file mode 100644
index 0000000..224a270
--- /dev/null
+++ b/kaffeine/src/input/disc/disc.cpp
@@ -0,0 +1,767 @@
+/*
+ * disc.cpp
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qstringlist.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qvaluelist.h>
+#include <qcursor.h>
+#include <qtimer.h>
+#include <qfile.h>
+#include <qpopupmenu.h>
+#include <qapplication.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kaction.h>
+#include <kstdaction.h>
+#include <kdebug.h>
+#include <kinputdialog.h>
+#include <dcopref.h>
+
+#include "cddb.h"
+#include "mrl.h"
+#include "disc.h"
+#include "disc.moc"
+
+MLabel::MLabel( QWidget *parent ) : QLabel( parent )
+{
+ setText("<center><font size=\"6\"><b>"+i18n("Audio CD")+"</b></font></center>");
+}
+
+void MLabel::paintEvent( QPaintEvent *pe )
+{
+ QLabel::paintEvent( pe );
+ QColorGroup cg = parentWidget()->colorGroup();
+ QColor base = cg.base();
+ QColor selection = cg.highlight();
+ int r = (base.red() + selection.red()) / 2;
+ int b = (base.blue() + selection.blue()) / 2;
+ int g = (base.green() + selection.green()) / 2;
+ setPaletteBackgroundColor( QColor(r, g, b) );
+}
+
+MListView::MListView( QWidget *parent ) : KListView( parent )
+{
+}
+
+void MListView::resizeEvent( QResizeEvent *rev )
+{
+ int width = contentsRect().width();
+ setColumnWidth(0, 40); /* Track */
+ setColumnWidth(1, width-90); /* title */
+ setColumnWidth(2, 50); /* duration */
+
+ KListView::resizeEvent(rev);
+}
+
+Disc::Disc( QWidget* parent, QObject *objParent, const char *name ) : KaffeineInput(objParent , name)
+{
+ mainWidget = new QVBox( parent );
+ mainWidget->setSizePolicy( QSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred) );
+ split = new QSplitter( mainWidget );
+ split->setOpaqueResize( true );
+ widg = new QWidget( split );
+ widg->setMinimumWidth( 200 );
+ widg->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::MinimumExpanding ) );
+ QVBoxLayout *wb = new QVBoxLayout( widg, 0, 0 );
+ discLab = new MLabel( widg );
+ wb->addWidget( discLab );
+ playerBox = new QVBox( widg );
+ wb->addWidget( playerBox );
+ playerBox->setMinimumWidth( 200 );
+ playerBox->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::MinimumExpanding ) );
+ panel = new QFrame( split );
+ split->moveToFirst( panel );
+ panel->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::MinimumExpanding ) );
+ split->setResizeMode( panel, QSplitter::KeepSize );
+
+ QVBoxLayout *vb = new QVBoxLayout( panel, 3, 3 );
+ cdBtn = new QToolButton( panel );
+ cdBtn->setTextLabel( i18n("Play CD") );
+ cdBtn->setTextPosition( QToolButton::Under );
+ cdBtn->setUsesTextLabel( true );
+ cdBtn->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) );
+ QToolTip::add( cdBtn, i18n("Play CD"));
+ ripBtn = new QToolButton( panel );
+ ripBtn->setTextLabel( i18n("Rip CD") );
+ ripBtn->setTextPosition( QToolButton::Under );
+ ripBtn->setUsesTextLabel( true );
+ ripBtn->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed ) );
+ QToolTip::add( ripBtn, i18n("Rip CD"));
+
+ QHBoxLayout *h1 = new QHBoxLayout();
+ h1->addWidget( cdBtn );
+ h1->addWidget( ripBtn );
+ vb->addLayout( h1 );
+
+ cdBtn->setIconSet( KGlobal::iconLoader()->loadIconSet("cdaudio_unmount", KIcon::Toolbar) );
+ ripBtn->setIconSet( KGlobal::iconLoader()->loadIconSet("kilogram", KIcon::Toolbar) );
+
+ connect( cdBtn, SIGNAL(clicked()), this, SLOT(startCD()) );
+ connect( ripBtn, SIGNAL(clicked()), this, SLOT(startRIP()) );
+
+ h1 = new QHBoxLayout();
+ h1->addWidget( new QLabel( i18n("Artist:"), panel ) );
+ artistLab = new QLabel( "", panel );
+ artistLab->setLineWidth(1);
+ artistLab->setFrameStyle(QFrame::Panel|QFrame::Sunken);
+ artistLab->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+ h1->addWidget( artistLab );
+ vb->addLayout( h1 );
+ h1 = new QHBoxLayout();
+ h1->addWidget( new QLabel( i18n("Album:"), panel ) );
+ albumLab = new QLabel( "", panel );
+ albumLab->setLineWidth(1);
+ albumLab->setFrameStyle(QFrame::Panel|QFrame::Sunken);
+ albumLab->setSizePolicy( QSizePolicy( QSizePolicy::Expanding, QSizePolicy::Preferred ) );
+ h1->addWidget( albumLab );
+ vb->addLayout( h1 );
+
+ list = new MListView( panel );
+ list->setHScrollBarMode( QListView::AlwaysOff );
+ connect( list, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(trackSelected(QListViewItem*)) );
+ list->addColumn( i18n("Track") );
+ list->addColumn( i18n("Title") );
+ list->addColumn( i18n("Duration") );
+ //list->setSortColumn( -1 );
+ list->setAllColumnsShowFocus( true );
+ list->setSelectionMode(QListView::Extended);
+ list->setColumnWidthMode( 0, QListView::Manual );
+ list->setColumnWidthMode( 1, QListView::Manual );
+ list->setColumnWidthMode( 2, QListView::Manual );
+ list->setResizeMode( QListView::NoColumn );
+ vb->addWidget( list );
+
+ encodeWidget = new QWidget( panel );
+ QGridLayout *grid = new QGridLayout( encodeWidget, 2, 2, 0, 3 );
+ QLabel *lab = new QLabel( i18n("Select the tracks you want to rip and click the <b>Encode</b> button."), encodeWidget );
+ grid->addMultiCellWidget( lab, 0, 1, 0, 0);
+ enc = new QToolButton( encodeWidget );
+ grid->addMultiCellWidget( enc, 0, 0, 1, 1);
+ enc->setTextLabel( i18n("Encode...") );
+ enc->setTextPosition( QToolButton::Under );
+ enc->setUsesTextLabel( true );
+ enc->setIconSet( KGlobal::iconLoader()->loadIconSet("kilogram", KIcon::Small) );
+ enc->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+ connect( enc, SIGNAL(clicked()), this, SLOT(encode()) );
+ vb->addWidget( encodeWidget );
+ encodeWidget->hide();
+
+ progressBar = new QProgressBar( 100, panel );
+ vb->addWidget( progressBar );
+ progressBar->hide();
+
+ vb->addItem( new QSpacerItem( 1, 1, QSizePolicy::Preferred, QSizePolicy::Preferred ) );
+
+ artistLab->setPaletteBackgroundColor( list->paletteBackgroundColor() );
+ albumLab->setPaletteBackgroundColor( list->paletteBackgroundColor() );
+
+ connect( &encodeTimer, SIGNAL(timeout()), this, SLOT(encodeProgress()) );
+
+ setXMLFile("kaffeinedisc.rc");
+ setupActions();
+
+ loadConfig( KGlobal::config() );
+
+ para = NULL;
+ trackCurrent = 0;
+ currentPixmap = UserIcon("playing");
+}
+
+Disc::~Disc()
+{
+}
+
+void Disc::togglePanel()
+{
+ if ( panel->isHidden() )
+ panel->show();
+ else
+ panel->hide();
+}
+
+void Disc::getTargets( QStringList &uiNames, QStringList &iconNames, QStringList &targetNames )
+{
+ uiNames.append( i18n("Audio CD encoding") );
+ iconNames.append( "kilogram" );
+ targetNames.append( "DISC_RIP" );
+ uiNames.append( i18n("Play Audio CD") );
+ iconNames.append( "cdaudio_unmount" );
+ targetNames.append( "DISC_CDDA" );
+ uiNames.append( i18n("Play DVD") );
+ iconNames.append( "dvd_unmount" );
+ targetNames.append( "DISC_DVD" );
+ uiNames.append( i18n("Play VCD") );
+ iconNames.append( "cdrom_unmount" );
+ targetNames.append( "DISC_VCD" );
+}
+
+bool Disc::execTarget( const QString &target )
+{
+ if ( target=="DISC_CDDA" ) {
+ //emit showMe( this );
+ QTimer::singleShot( 100, this, SLOT(startCD()) );
+ return true;
+ }
+ else if ( target=="DISC_RIP" ) {
+ QTimer::singleShot( 100, this, SLOT(startRIP()) );
+ return true;
+ }
+ else if ( target=="DISC_DVD" ) {
+ QTimer::singleShot( 100, this, SLOT(startDVD()) );
+ return true;
+ }
+ else if ( target=="DISC_VCD" ) {
+ QTimer::singleShot( 100, this, SLOT(startVCD()) );
+ return true;
+ }
+ return false;
+}
+
+void Disc::loadConfig( KConfig* config )
+{
+ QValueList<int> sl;
+
+ config->setGroup("Disc");
+ sl = config->readIntListEntry("SplitSizes");
+ split->setSizes( sl );
+}
+
+void Disc::saveConfig()
+{
+ KConfig* config = KGlobal::config();
+
+ config->setGroup("Disc");
+ config->writeEntry( "SplitSizes", split->sizes() );
+}
+
+QWidget* Disc::wantPlayerWindow()
+{
+ return playerBox;
+}
+
+QWidget* Disc::inputMainWidget()
+{
+ return mainWidget;
+}
+
+void Disc::setupActions()
+{
+ new KAction(i18n("Open &DVD"), "dvd_unmount", 0, this, SLOT(startDVD()), actionCollection(), "file_open_dvd");
+ new KAction(i18n("Open &VCD"), "cdrom_unmount", 0, this, SLOT(startVCD()), actionCollection(), "file_open_vcd");
+ new KAction(i18n("Open &Audio-CD"), "cdaudio_unmount", 0, this, SLOT(startCD()), actionCollection(), "file_open_audiocd");
+}
+
+void Disc::playerStopped()
+{
+ trackCurrent = 0;
+ if ( !list->isEnabled() )
+ return;
+ list->clear();
+ artistLab->setText( "" );
+ albumLab->setText( "" );
+ encodeWidget->hide();
+}
+
+void Disc::setEncoding( bool b )
+{
+ list->setEnabled( !b );
+ artistLab->setEnabled( !b );
+ albumLab->setEnabled( !b );
+ cdBtn->setEnabled( !b );
+ ripBtn->setEnabled( !b );
+ enc->setEnabled( !b );
+ if ( b ) {
+ progressBar->setProgress( 0 );
+ progressBar->show();
+ }
+ else
+ progressBar->hide();
+}
+
+void Disc::encode()
+{
+ QListViewItem *it;
+ QStringList tracklist;
+
+ it = list->firstChild();
+ if ( !it )
+ return;
+ tracklist.append( artistLab->text() );
+ tracklist.append( albumLab->text() );
+ while ( it!=0 ) {
+ if ( it->isSelected() )
+ tracklist.append( it->text(0)+"-"+it->text(1) );
+ it = it->nextSibling();
+ }
+ if ( (int)tracklist.count()<3 ) {
+ KMessageBox::information( mainWidget, i18n("You must select the tracks to rip."), i18n("Warning") );
+ return;
+ }
+ setEncoding( true );
+ if ( trackCurrent )
+ emit stop();
+ para = new Paranoia();
+ if ( !para->init( currentDevice ) ) {
+ KMessageBox::information( mainWidget, i18n("Unable to initialize cdparanoia."), i18n("Warning") );
+ delete para;
+ para = NULL;
+ setEncoding( false );
+ return;
+ }
+
+ if ( para->encode( tracklist, mainWidget ) )
+ encodeTimer.start( 1000 );
+ else {
+ delete para;
+ para = NULL;
+ setEncoding( false );
+ }
+}
+
+void Disc::encodeProgress()
+{
+ if ( para->running() )
+ progressBar->setProgress( para->getProgress() );
+ else {
+ encodeTimer.stop();
+ delete para;
+ para = NULL;
+ setEncoding( false );
+ }
+
+}
+
+void Disc::setCurrent( int n )
+{
+ QListViewItem *it;
+
+ it = list->firstChild();
+ while ( it!=0 ) {
+ if ( it->text(0).toInt()==n )
+ it->setPixmap( 1, currentPixmap );
+ else
+ it->setPixmap( 1, QPixmap() );
+ it = it->nextSibling();
+ }
+}
+
+void Disc::trackSelected( QListViewItem *it )
+{
+ if ( !it )
+ return;
+
+ MRL mrl( QString("cdda://%1/%2").arg( currentDevice ).arg( it->text(0).toInt() ) );
+ mrl.setTitle( it->text(1) );
+ mrl.setArtist( artistLab->text() );
+ mrl.setAlbum( albumLab->text() );
+ mrl.setTrack( it->text(0) );
+ mrl.setMime( QString("audio/cdda") );
+ trackCurrent = it->text(0).toInt();
+ setCurrent( trackCurrent );
+ emit play( mrl, this );
+}
+
+void Disc::startRIP()
+{
+ startCD( "", true );
+}
+
+void Disc::startCD( const QString &device, bool rip )
+{
+ QStringList s;
+ bool init=false;
+ QValueList<int> qvl;
+ int i;
+ KListViewItem *it;
+ MRL mrl;
+ QStringList dcopList, devList;
+ bool ok=false;
+
+ if ( !cdBtn->isEnabled() ) {
+ emit showMe( this );
+ return;
+ }
+
+
+ if ( !device.isEmpty() )
+ s.append( device );
+ else {
+ DCOPRef mediamanager("kded","mediamanager");
+ DCOPReply reply = mediamanager.call("fullList()");
+ if ( reply.isValid() ) {
+ dcopList = reply;
+ i=0;
+ while ( i<(int)dcopList.count() ) {
+ //kdDebug() << dcopList[i+5] << " * " << dcopList[i+6] << " * " << dcopList[i+10] << endl;
+ if ( dcopList[i+10]=="media/audiocd" ) {
+ devList.append( dcopList[i+5] );
+ }
+ i+=13;
+ }
+ if ( devList.count()>1 ) {
+ QString choice = KInputDialog::getItem( i18n("Audio CD"), i18n("Several Audio CD found. Choose one:"),
+ devList, 0, false, &ok );
+ if ( ok )
+ s.append( choice );
+ else
+ return;
+ }
+ else if ( devList.count()==1 )
+ s.append( devList[0] );
+ else {
+ s.append( "/dev/cdrom" );
+ s.append( "/dev/dvd" );
+ }
+ }
+ else {
+ s.append( "/dev/cdrom" );
+ s.append( "/dev/dvd" );
+ }
+ }
+
+ QApplication::setOverrideCursor( QCursor(Qt::WaitCursor) );
+ qApp->processEvents();
+
+ para = new Paranoia();
+ for ( i=0; i<(int)s.count(); i++ ) {
+ if ( (init = para->init( s[i] )) ) {
+ currentDevice = s[i];
+ break;
+ }
+ }
+ if ( init ) {
+ list->clear();
+ artistLab->setText( "" );
+ albumLab->setText( "" );
+ for ( i=0; i<para->getTracks(); i++)
+ qvl.append( para->trackFirstSector(i+1) + 150 );
+ qvl.append( para->discFirstSector() );
+ qvl.append( para->discLastSector() );
+ CDDB *cddb = new CDDB();
+ cddb->save_cddb( true );
+ if ( cddb->queryCD(qvl) ) {
+ artistLab->setText( cddb->artist() );
+ albumLab->setText( cddb->title() );
+ for ( i=0; i<para->getTracks(); i++ ) {
+ it = new KListViewItem( list, QString().sprintf("%02d", i+1), cddb->track( i ), para->trackTime(i) );
+ if ( i==0 ) {
+ mrl.setURL( QString("cdda://%1/1").arg( currentDevice ) );
+ mrl.setTitle( cddb->track(i) );
+ mrl.setArtist( artistLab->text() );
+ mrl.setAlbum( albumLab->text() );
+ mrl.setTrack( QString().sprintf("%02d", i+1) );
+ }
+ }
+ }
+ else {
+ cddb->set_server( "freedb.freedb.org", 8880 );
+ if ( cddb->queryCD(qvl) ) {
+ artistLab->setText( cddb->artist() );
+ albumLab->setText( cddb->title() );
+ for ( i=0; i<para->getTracks(); i++ ) {
+ it = new KListViewItem( list, QString().sprintf("%02d", i+1), cddb->track( i ), para->trackTime(i) );
+ if ( i==0 ) {
+ mrl.setURL( QString("cdda://%1/1").arg( currentDevice ) );
+ mrl.setTitle( cddb->track(i) );
+ mrl.setArtist( artistLab->text() );
+ mrl.setAlbum( albumLab->text() );
+ mrl.setTrack( QString().sprintf("%02d", i+1) );
+ }
+ }
+ }
+ else {
+ artistLab->setText( i18n("Unknown") );
+ albumLab->setText( i18n("Unknown") );
+ for ( i=0; i<para->getTracks(); i++ ) {
+ it = new KListViewItem( list, QString().sprintf("%02d", i+1), i18n("Track")+QString().sprintf("%02d", i+1), para->trackTime(i) );
+ if ( i==0 ) {
+ mrl.setURL( QString("cdda://%1/1").arg( currentDevice ) );
+ mrl.setTitle( i18n("Track")+QString().sprintf("%02d", i+1) );
+ mrl.setArtist( artistLab->text() );
+ mrl.setAlbum( albumLab->text() );
+ mrl.setTrack( QString().sprintf("%02d", i+1) );
+ }
+ }
+ }
+ }
+ delete cddb;
+ QApplication::restoreOverrideCursor();
+ encodeWidget->show();
+ emit showMe( this );
+ if ( !rip && !mrl.isEmpty() ) {
+ mrl.setMime( QString("audio/cdda") );
+ trackCurrent = mrl.track().toInt();
+ setCurrent( trackCurrent );
+ emit play( mrl, this );
+ }
+ }
+ else {
+ QApplication::restoreOverrideCursor();
+ KMessageBox::information( 0, i18n("No audio CD found."), i18n("Warning") );
+ }
+ delete para;
+ para = NULL;
+}
+
+void Disc::startDVD( const QString &device )
+{
+ MRL mrl;
+ QStringList dcopList, devList;
+ int i;
+ bool ok=false;
+
+ if ( !device.isEmpty() )
+ mrl.setURL( QString("dvd://%1").arg(device) );
+ else {
+ DCOPRef mediamanager("kded","mediamanager");
+ DCOPReply reply = mediamanager.call("fullList()");
+ if ( reply.isValid() ) {
+ dcopList = reply;
+ i=0;
+ while ( i<(int)dcopList.count() ) {
+ //kdDebug() << dcopList[i+5] << " * " << dcopList[i+6] << " * " << dcopList[i+10] << endl;
+ if ( dcopList[i+10]=="media/dvdvideo" ) {
+ devList.append( dcopList[i+5] );
+ }
+ else if ( dcopList[i+10]=="media/cdrom_mounted"
+ || dcopList[i+10]=="media/cdwriter_mounted"
+ || dcopList[i+10]=="media/dvd_mounted" ) {
+ if ( QFile::exists(dcopList[i+6]+"/video_ts") || QFile::exists(dcopList[i+6]+"/VIDEO_TS") )
+ devList.append( dcopList[i+5] );
+ }
+ i+=13;
+ }
+ if ( devList.count()>1 ) {
+ QString choice = KInputDialog::getItem( i18n("DVD Video"), i18n("Several DVD Video found. Choose one:"),
+ devList, 0, false, &ok );
+ if ( ok )
+ mrl.setURL( QString("dvd://%1").arg(choice) );
+ else
+ return;
+ }
+ else if ( devList.count()==1 )
+ mrl.setURL( QString("dvd://%1").arg(devList[0]) );
+ else {
+ //KMessageBox::information( 0, i18n("No DVD Video found."), i18n("Warning") );
+ //return;
+ mrl.setURL( QString("dvd://") );
+ }
+ }
+ else
+ mrl.setURL( QString("dvd://") );
+ }
+
+ mrl.setMime( QString("video/dvd") );
+
+ if ( !progressBar->isVisible() ) {
+ list->clear();
+ artistLab->setText( "" );
+ albumLab->setText( "" );
+ encodeWidget->hide();
+ }
+ trackCurrent = 0;
+ emit play( mrl, this );
+}
+
+void Disc::startVCD( const QString &device )
+{
+ MRL mrl;
+ QStringList dcopList, devList;
+ int i;
+ bool ok=false;
+
+ if ( !device.isEmpty() )
+ mrl.setURL( QString("vcd://%1").arg(device) );
+ else {
+ DCOPRef mediamanager("kded","mediamanager");
+ DCOPReply reply = mediamanager.call("fullList()");
+ if ( reply.isValid() ) {
+ dcopList = reply;
+ i=0;
+ while ( i<(int)dcopList.count() ) {
+ //kdDebug() << dcopList[i+5] << " * " << dcopList[i+6] << " * " << dcopList[i+10] << endl;
+ if ( dcopList[i+10]=="media/vcd" || dcopList[i+10]=="media/svcd" ) {
+ devList.append( dcopList[i+5] );
+ }
+ i+=13;
+ }
+ if ( devList.count()>1 ) {
+ QString choice = KInputDialog::getItem( i18n("VCD-SVCD"), i18n("Several (S)VCD found. Choose one:"),
+ devList, 0, false, &ok );
+ if ( ok )
+ mrl.setURL( QString("vcd://%1").arg(choice) );
+ else
+ return;
+ }
+ else if ( devList.count()==1 )
+ mrl.setURL( QString("vcd://%1").arg(devList[0]) );
+ else {
+ //KMessageBox::information( 0, i18n("No (S)VCD found."), i18n("Warning") );
+ //return;
+ mrl.setURL( QString("vcd://") );
+ }
+ }
+ else
+ mrl.setURL( QString("vcd://") );
+ }
+
+ mrl.setMime( QString("video/vcd") );
+
+ if ( !progressBar->isVisible() ) {
+ list->clear();
+ artistLab->setText( "" );
+ albumLab->setText( "" );
+ encodeWidget->hide();
+ }
+ trackCurrent = 0;
+ emit play( mrl, this );
+}
+
+bool Disc::currentTrack( MRL &mrl )
+{
+ QListViewItem *it;
+
+ if ( !trackCurrent )
+ return false;
+
+ it = list->firstChild();
+ if ( !it )
+ return false;
+ while ( it!=0 ) {
+ if ( it->text(0).toInt()==trackCurrent ) {
+ mrl.setURL( QString("cdda://%1/%2").arg( currentDevice ).arg( it->text(0).toInt() ) );
+ mrl.setTitle( it->text(1) );
+ mrl.setArtist( artistLab->text() );
+ mrl.setAlbum( albumLab->text() );
+ mrl.setTrack( it->text(0) );
+ mrl.setMime( QString("audio/cdda") );
+ setCurrent( trackCurrent );
+ return true;
+ }
+ it = it->nextSibling();
+ }
+
+ return false;
+}
+
+bool Disc::playbackFinished( MRL &mrl )
+{
+ return nextTrack( mrl );
+}
+
+bool Disc::nextTrack( MRL &mrl )
+{
+ QListViewItem *it;
+
+ if ( !trackCurrent )
+ return false;
+
+ it = list->firstChild();
+ if ( !it )
+ return false;
+ while ( it!=0 ) {
+ if ( it->text(0).toInt()==trackCurrent+1 ) {
+ mrl.setURL( QString("cdda://%1/%2").arg( currentDevice ).arg( it->text(0).toInt() ) );
+ mrl.setTitle( it->text(1) );
+ mrl.setArtist( artistLab->text() );
+ mrl.setAlbum( albumLab->text() );
+ mrl.setTrack( it->text(0) );
+ mrl.setMime( QString("audio/cdda") );
+ ++trackCurrent;
+ setCurrent( trackCurrent );
+ return true;
+ }
+ it = it->nextSibling();
+ }
+
+ it = list->firstChild();
+ mrl.setURL( QString("cdda://%1/%2").arg( currentDevice ).arg( it->text(0).toInt() ) );
+ mrl.setTitle( it->text(1) );
+ mrl.setArtist( artistLab->text() );
+ mrl.setAlbum( albumLab->text() );
+ mrl.setTrack( it->text(0) );
+ mrl.setMime( QString("audio/cdda") );
+ trackCurrent = 1;
+ setCurrent( trackCurrent );
+ return true;
+}
+
+bool Disc::previousTrack( MRL &mrl )
+{
+ QListViewItem *it;
+
+ if ( !trackCurrent )
+ return false;
+
+ it = list->firstChild();
+ if ( !it )
+ return false;
+ while ( it!=0 ) {
+ if ( it->text(0).toInt()==trackCurrent-1 ) {
+ mrl.setURL( QString("cdda://%1/%2").arg( currentDevice ).arg( it->text(0).toInt() ) );
+ mrl.setTitle( it->text(1) );
+ mrl.setArtist( artistLab->text() );
+ mrl.setAlbum( albumLab->text() );
+ mrl.setTrack( it->text(0) );
+ mrl.setMime( QString("audio/cdda") );
+ --trackCurrent;
+ setCurrent( trackCurrent );
+ return true;
+ }
+ it = it->nextSibling();
+ }
+
+ return false;
+}
+
+bool Disc::trackNumber( int number, MRL &mrl )
+{
+ QListViewItem *it;
+
+ if ( !trackCurrent )
+ return false;
+
+ it = list->firstChild();
+ if ( !it )
+ return false;
+ while ( it!=0 ) {
+ if ( it->text(0).toInt()==number ) {
+ mrl.setURL( QString("cdda://%1/%2").arg( currentDevice ).arg( it->text(0).toInt() ) );
+ mrl.setTitle( it->text(1) );
+ mrl.setArtist( artistLab->text() );
+ mrl.setAlbum( albumLab->text() );
+ mrl.setTrack( it->text(0) );
+ mrl.setMime( QString("audio/cdda") );
+ trackCurrent=number;
+ setCurrent( trackCurrent );
+ return true;
+ }
+ it = it->nextSibling();
+ }
+
+ return false;
+}
+
+void Disc::mergeMeta( const MRL& )
+{
+}
diff --git a/kaffeine/src/input/disc/disc.h b/kaffeine/src/input/disc/disc.h
new file mode 100644
index 0000000..c62c905
--- /dev/null
+++ b/kaffeine/src/input/disc/disc.h
@@ -0,0 +1,140 @@
+/*
+ * disc.h
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DISC_H
+#define DISC_H
+
+#include <kaction.h>
+#include <kstdaction.h>
+#include <kconfig.h>
+#include <klistview.h>
+
+#include <qframe.h>
+#include <qvbox.h>
+#include <qsplitter.h>
+#include <qtoolbutton.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qprogressbar.h>
+#include <qguardedptr.h>
+
+#include "kaffeineinput.h"
+#include "paranoia.h"
+
+class MRL;
+
+class MLabel : public QLabel
+{
+ Q_OBJECT
+
+public:
+ MLabel( QWidget *parent );
+ ~MLabel() {}
+
+protected:
+ void paintEvent( QPaintEvent * );
+};
+
+
+
+class MListView : public KListView
+{
+ Q_OBJECT
+
+public:
+ MListView( QWidget *parent );
+ ~MListView() {}
+
+protected:
+ virtual void resizeEvent(QResizeEvent*);
+};
+
+
+
+class Disc : public KaffeineInput
+{
+ Q_OBJECT
+
+public:
+ Disc(QWidget *parent, QObject *objParent, const char *name=0);
+ ~Disc();
+
+ // Reimplemented from KaffeineInput
+public:
+ QWidget *wantPlayerWindow();
+ QWidget *inputMainWidget();
+ void mergeMeta(const MRL&);
+ bool nextTrack( MRL& );
+ bool previousTrack( MRL& );
+ bool currentTrack( MRL& );
+ bool trackNumber( int, MRL& );
+ bool playbackFinished( MRL& );
+ void toggleLayout( bool );
+ void playerStopped();
+ void getTargets( QStringList &uiNames, QStringList &iconNames, QStringList &targetNames );
+ void togglePanel();
+ bool execTarget( const QString& );
+ void saveConfig();
+ //***************************************
+
+public slots:
+ void startCD( const QString &device="", bool rip=false );
+ void startDVD( const QString &device="" );
+ void startVCD( const QString &device="" );
+ void startRIP();
+
+public:
+ QVBox *mainWidget;
+ QVBox *playerBox;
+
+private:
+ void loadConfig( KConfig* config );
+ void saveConfig( KConfig* config );
+ void setCurrent( int n );
+ void setupActions();
+
+ QLabel *artistLab, *albumLab;
+ QGuardedPtr<QWidget> widg;
+ QToolButton *ripBtn, *cdBtn;
+ QToolButton *enc;
+ QSplitter *split;
+ QGuardedPtr<QFrame> panel;
+ MLabel *discLab;
+ Paranoia *para;
+ MListView *list;
+ int trackCurrent;
+ QString currentDevice;
+ QPixmap currentPixmap;
+ QWidget *encodeWidget;
+ QTimer encodeTimer;
+ QProgressBar *progressBar;
+
+private slots:
+ void trackSelected( QListViewItem* );
+ void encode();
+ void encodeProgress();
+ void setEncoding( bool );
+
+signals:
+ void signalRequestForDVD();
+ void signalRequestForVCD();
+};
+
+#endif /* DISC_H */
diff --git a/kaffeine/src/input/disc/kaffeinedisc.rc b/kaffeine/src/input/disc/kaffeinedisc.rc
new file mode 100644
index 0000000..326daee
--- /dev/null
+++ b/kaffeine/src/input/disc/kaffeinedisc.rc
@@ -0,0 +1,24 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="kaffeineplaylist" version="9">
+<MenuBar>
+ <Menu name="file">
+ <Separator/>
+ <Action name="file_open_dvd"/>
+ <Action name="file_open_vcd"/>
+ <Action name="file_open_audiocd"/>
+ <Separator/>
+ </Menu>
+</MenuBar>
+<ToolBar name="discToolBar" hidden="true"><text>CD Toolbar</text>
+ <Action name="file_open_dvd"/>
+ <Action name="file_open_vcd"/>
+ <Action name="file_open_audiocd"/>
+</ToolBar>
+<State name="no_media_part">
+<disable>
+ <Action name="file_open_dvd"/>
+ <Action name="file_open_vcd"/>
+ <Action name="file_open_audiocd"/>
+</disable>
+</State>
+</kpartgui>
diff --git a/kaffeine/src/input/disc/paranoia.cpp b/kaffeine/src/input/disc/paranoia.cpp
new file mode 100644
index 0000000..60e2092
--- /dev/null
+++ b/kaffeine/src/input/disc/paranoia.cpp
@@ -0,0 +1,553 @@
+/*
+ * paranoia.cpp
+ *
+ * Copyright (C) 2002-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <unistd.h>
+#include <math.h>
+
+#include <qfile.h>
+#include <qslider.h>
+#include <qlcdnumber.h>
+#include <qdir.h>
+#include <qlineedit.h>
+#include <qbuttongroup.h>
+#include <qtoolbutton.h>
+#include <qcheckbox.h>
+
+#include <qcombobox.h>
+
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <ktrader.h>
+#include <kpushbutton.h>
+#include <kiconloader.h>
+#include <kfiledialog.h>
+#include <kparts/componentfactory.h>
+
+#include "paranoia.h"
+#include "paranoia.moc"
+
+#define DEFAULT_DRIVE "/dev/cdrom"
+
+KiloConfig::KiloConfig( QWidget *parent, KConfig *confile, const QStringList &encoders ) : ParanoiaSettings( parent )
+{
+ int i;
+
+ KIconLoader *icon = new KIconLoader();
+ okBtn->setGuiItem( KGuiItem(i18n("OK"), icon->loadIconSet("ok", KIcon::Small) ) );
+ cancelBtn->setGuiItem( KGuiItem(i18n("Cancel"), icon->loadIconSet("cancel", KIcon::Small) ) );
+ baseDirBtn->setIconSet( icon->loadIconSet("fileopen", KIcon::Small) );
+ delete icon;
+ connect( baseDirBtn, SIGNAL( clicked() ), this, SLOT( setBaseDir() ) );
+ Conf = confile;
+ Conf->setGroup( "Paranoia" );
+ baseDirLineEdit->setText( Conf->readEntry( "Basedir", QDir::homeDirPath() ) );
+ paranoiaGroup->setButton( Conf->readNumEntry( "Mode", 0 ) );
+ normCb->setChecked( Conf->readBoolEntry( "Normalize", false ) );
+ encoderComb->insertStringList( encoders );
+ QString s = Conf->readEntry( "CurrentEncoder", "" );
+ if ( !s.isEmpty() ) {
+ for ( i=0; i<(int)encoders.count(); i++ ) {
+ if ( encoders[i]==s ) {
+ encoderComb->setCurrentText( s );
+ }
+ }
+ }
+}
+
+void KiloConfig::setBaseDir()
+{
+ Conf->setGroup( "Paranoia" );
+ QString d = Conf->readEntry( "Basedir", QDir::homeDirPath() );
+ QString u = KFileDialog::getExistingDirectory( d );
+ if ( u!="" ) {
+ baseDirLineEdit->setText( u );
+ Conf->writeEntry( "Basedir", u );
+ }
+}
+
+QString KiloConfig::getEncoder()
+{
+ return encoderComb->currentText();
+}
+
+bool KiloConfig::getNormalize()
+{
+ return normCb->isChecked();
+}
+
+QString KiloConfig::getBaseDir()
+{
+ return baseDirLineEdit->text().stripWhiteSpace();
+}
+
+int KiloConfig::getParanoiaMode()
+{
+ return paranoiaGroup->selectedId();
+}
+
+void KiloConfig::accept()
+{
+ Conf->setGroup( "Paranoia" );
+ Conf->writeEntry( "Mode", paranoiaGroup->id( paranoiaGroup->selected() ) );
+ Conf->writeEntry( "CurrentEncoder", encoderComb->currentText() );
+ Conf->writeEntry( "Normalize", normCb->isChecked() );
+ done(Accepted);
+}
+
+KiloConfig::~KiloConfig()
+{
+}
+
+void paranoiaCallback( long, int )
+{
+}
+
+Paranoia::Paranoia()
+{
+ d = 0;
+ p = 0;
+ isRunning = false;
+}
+
+bool Paranoia::init( QString dev )
+{
+ QString s;
+ QFile f;
+
+ if ( p!=0 ) paranoia_free( p );
+ if (d!=0 ) cdda_close( d );
+ nTracks = 0;
+
+ dev = dev.stripWhiteSpace();
+ f.setName( dev );
+ if ( !f.exists() ) {
+ /*if ( !findCdrom() ) {
+ d = cdda_find_a_cdrom( CDDA_MESSAGE_PRINTIT, 0 );
+ if ( cdda_open( d )!=0 )
+ return false;
+ }*/
+ return false;
+ }
+ else {
+ d = cdda_identify( dev.ascii(), CDDA_MESSAGE_PRINTIT, 0 );
+ if ( cdda_open( d )!=0 )
+ return false;
+ }
+ p = paranoia_init( d );
+ nTracks = cdda_tracks( d );
+ return true;
+}
+
+bool Paranoia::findCdrom()
+{
+ QFile *f;
+ QString c;
+ QString s="";
+ int pos, i;
+ bool stop=false;
+ char dev[4][4]={"","","",""};
+
+ f = new QFile( "/proc/sys/dev/cdrom/info" );
+ if ( !f->open(IO_ReadOnly) )
+ return false;
+
+ QTextStream t( f );
+ while ( !t.eof() && !stop ) {
+ s = t.readLine();
+ if ( s.contains("drive name:") )
+ stop = true;
+ }
+ if ( !stop )
+ return false;
+
+ pos = s.find(":");
+ c = s.right( s.length()-pos-1 );
+ sscanf( c.latin1(), "%s %s %s %s", dev[0], dev[1], dev[2], dev[3] );
+
+ for ( i=0; i<4; i++ )
+ if ( procCdrom( dev[i] ) )
+ return true;
+
+ f->close();
+ return false;
+}
+
+bool Paranoia::procCdrom( QString name )
+{
+ int pos;
+
+ if ( name.contains("sr") ) {
+ pos = name.find("r");
+ name = name.right( name.length()-pos-1 );
+ name = "/dev/scd"+name;
+ d = cdda_identify( name.ascii(), CDDA_MESSAGE_PRINTIT, 0 );
+ if ( cdda_open( d )==0 )
+ return true;
+ }
+ else if ( name.contains("hd") ) {
+ name = "/dev/"+name;
+ d = cdda_identify( name.ascii(), CDDA_MESSAGE_PRINTIT, 0 );
+ if ( cdda_open( d )==0 )
+ return true;
+ }
+ return false;
+}
+
+void Paranoia::setMode( int mode )
+{
+ switch ( mode ) {
+ case 0 : mode = PARANOIA_MODE_DISABLE;
+ break;
+ case 1 : mode = PARANOIA_MODE_FULL^PARANOIA_MODE_NEVERSKIP;
+ break;
+ case 2 : mode = PARANOIA_MODE_FULL;
+ }
+ paranoia_modeset( p, mode );
+}
+
+bool Paranoia::encode( const QStringList &list, QWidget *parent )
+{
+ QStringList desktop;
+ QStringList encoderName;
+
+ encodingList.clear();
+ encodingList = list;
+ myParent = parent;
+
+ // check for encoders
+ KTrader::OfferList offers = KTrader::self()->query("KaffeineAudioEncoder");
+ KTrader::OfferList::Iterator end(offers.end());
+ for(KTrader::OfferList::Iterator it = offers.begin(); it != end; ++it) {
+ KService::Ptr ptr = (*it);
+ desktop.append( ptr->desktopEntryName() );
+ encoderName.append( ptr->name() );
+ }
+
+ if ( !encoderName.count() ) {
+ KMessageBox::error( myParent, i18n("No audio encoders could be found."), i18n("Warning") );
+ return false;
+ }
+
+ KiloConfig dlg( myParent, KGlobal::config(), encoderName );
+ int ret = dlg.exec();
+ if ( ret!=QDialog::Accepted )
+ return false;
+ normalize = dlg.getNormalize();
+ baseDir = dlg.getBaseDir();
+ paraMode = dlg.getParanoiaMode();
+
+ QString s = dlg.getEncoder();
+ for ( ret=0; ret<(int)encoderName.count(); ++ret ) {
+ if ( encoderName[ret]==s ) {
+ encoderDesktop = desktop[ret];
+ break;
+ }
+ }
+
+ if ( !loadEncoder( myParent ) )
+ return false;
+
+ if ( !currentEncoder->options( myParent, KGlobal::config() ) ) {
+ unloadEncoder();
+ return false;
+ }
+
+ if ( !setPath( baseDir, QString(encodingList[0]).replace("/","_"), QString(encodingList[1]).replace("/","_") ) ) {
+ return false;
+ }
+ isRunning = true;
+ start();
+ return true;
+}
+
+bool Paranoia::loadEncoder( QWidget *parent )
+{
+ int error = 0;
+
+ KService::Ptr service = KService::serviceByDesktopName( encoderDesktop );
+ if (!service) {
+ KMessageBox::error( parent, i18n("Loading of encoder '%1' failed.").arg(encoderDesktop) );
+ return false;
+ }
+
+ if ( service->serviceTypes().contains("KaffeineAudioEncoder") ) {
+ currentEncoder = KParts::ComponentFactory::createPartInstanceFromService<KaffeineAudioEncoder>(service, 0, service->name().ascii(), 0, 0, 0, &error);
+ if (error > 0) {
+ KMessageBox::error( parent, i18n("Loading of encoder '%1' failed.").arg(encoderDesktop) );
+ return false;
+ }
+ else
+ return true;
+ }
+ else
+ return false;
+}
+
+void Paranoia::unloadEncoder()
+{
+ //kdDebug()<<"Unload encoder ..."<<endl;
+ KService::Ptr service = KService::serviceByDesktopName( encoderDesktop );
+ KLibLoader::self()->unloadLibrary( service->library().ascii() );
+ //kdDebug()<<"... encoder unloaded."<<endl;
+}
+
+bool Paranoia::validPath( QString path )
+{
+ QDir dir;
+
+ dir.setPath( path );
+ if ( !dir.exists() ) {
+ if ( !dir.mkdir( path ) ) {
+ KMessageBox::error( 0, i18n("Unable to create folder: ")+path );
+ return false;
+ }
+ }
+ return true;
+}
+
+bool Paranoia::setPath( QString &path, const QString &artist, const QString &album )
+{
+ QString s;
+
+ if ( !path.endsWith("/") )
+ path = path+"/";
+ if ( !validPath( path ) )
+ return false;
+
+ s = artist;
+ if ( s!="" )
+ path = path+s+"/";
+ if ( !validPath( path ) )
+ return false;
+
+ s = album;
+ if ( s!="" )
+ path = path+s+"/";
+ if ( !validPath( path ) )
+ return false;
+ return true;
+}
+
+bool Paranoia::initTrack( int t )
+{
+ currentSector = cdda_track_firstsector( d, t );
+ endOfTrack = cdda_track_lastsector( d, t );
+ paranoia_seek( p, currentSector, SEEK_SET );
+ return true;
+}
+
+static inline signed short paraSwap16( signed short x ) {
+ return ((((unsigned short)x & 0x00ffU) << 8) |
+ (((unsigned short )x & 0xff00U) >> 8));
+}
+
+void Paranoia::run()
+{
+ signed short *buf;
+ int i, n, len, retlen;
+ long curpos, endpos;
+ QFile f, fn;
+ float max;
+ float factor;
+ QString s;
+ char *encoded;
+ int overallSectors=0;
+ int sectorCount=0;
+
+ progress = 0;
+ sleep(2); // give some time for the player to be stopped
+
+ setMode( paraMode );
+ for ( i=2; i<(int)encodingList.count(); ++i ) {
+ n = encodingList[i].left(2).toInt();
+ overallSectors+= trackSectorSize( n );
+ }
+
+ fn.setName( baseDir+".temp" );
+
+ for ( i=2; i<(int)encodingList.count(); ++i ) {
+ n = encodingList[i].left(2).toInt();
+ s = QString(encodingList[i]).replace("/","_")+currentEncoder->getExtension();
+ f.setName( baseDir+s );
+ initTrack( n );
+ max = 0;
+ curpos = currentSector;
+ endpos = endOfTrack;
+ if ( normalize ) {
+ len = CD_FRAMESIZE_RAW;
+ fn.open( IO_ReadWrite | IO_Truncate );
+ do {
+ buf = paranoia_read_limited( p, paranoiaCallback, 3 );
+ if ( Q_BYTE_ORDER == Q_BIG_ENDIAN ) {
+ for ( i=0; i<len/2; i++)
+ buf[i] = paraSwap16(buf[i]);
+ }
+ ++curpos;
+ if ( len>0 ) {
+ for ( n=0; n<len/2; ++n )
+ if ( fabs(buf[n])>max )
+ max = fabs(buf[n]);
+ fn.writeBlock( (char*)buf, len );
+ ++sectorCount;
+ progress = sectorCount*50/overallSectors;
+ }
+ if ( !isRunning )
+ len=0;
+ }
+ while ( curpos<endpos && len!=0 );
+
+ factor = 32767.0/max;
+ buf = new signed short[CD_FRAMESIZE_RAW];
+ fn.at( 0 );
+ f.open( IO_ReadWrite | IO_Truncate );
+ currentEncoder->start( encodingList[i].remove(0,3), encodingList[0], encodingList[1], encodingList[i].left(2) );
+ encoded = currentEncoder->getHeader( len );
+ if ( encoded )
+ f.writeBlock( encoded, len );
+
+ do {
+ len = fn.readBlock( (char*)buf, CD_FRAMESIZE_RAW );
+ if ( len>0 ) {
+ if ( max<32760 )
+ for ( n=0; n<len/2; ++n )
+ buf[n] = (float)buf[n]*factor;
+ encoded = currentEncoder->encode( (char*)buf, len, retlen );
+ if ( encoded )
+ f.writeBlock( encoded, retlen );
+ ++sectorCount;
+ progress = sectorCount*50/overallSectors;
+ if ( !isRunning )
+ len=0;
+ }
+ }
+ while ( len>0 );
+ encoded = currentEncoder->stop( len );
+ if ( encoded )
+ f.writeBlock( encoded, len );
+ delete [] buf;
+ fn.remove();
+ }
+ else {
+ f.open( IO_ReadWrite | IO_Truncate );
+ currentEncoder->start( encodingList[i].remove(0,3), encodingList[0], encodingList[1], encodingList[i].left(2) );
+ encoded = currentEncoder->getHeader( len );
+ if ( encoded )
+ f.writeBlock( encoded, len );
+ len = CD_FRAMESIZE_RAW;
+ do {
+ buf = paranoia_read_limited( p, paranoiaCallback, 3 );
+ if ( Q_BYTE_ORDER == Q_BIG_ENDIAN ) {
+ for ( i=0; i<len/2; i++) {
+ buf[i] = paraSwap16(buf[i]);
+ }
+ }
+ ++curpos;
+ if ( len>0 ) {
+ encoded = currentEncoder->encode( (char*)buf, len, retlen );
+ if ( encoded )
+ f.writeBlock( encoded, retlen );
+ ++sectorCount;
+ progress = sectorCount*100/overallSectors;
+ }
+ if ( !isRunning )
+ len=0;
+ }
+ while ( curpos<endpos && len!=0 );
+ encoded = currentEncoder->stop( len );
+ if ( encoded )
+ f.writeBlock( encoded, len );
+ sleep(1); // cdparanoia seems to like that.
+ }
+ f.flush();
+ f.close();
+ }
+
+ unloadEncoder();
+ isRunning = false;
+}
+
+int Paranoia::trackFirstSector( int t )
+{
+ return cdda_track_firstsector( d, t );
+}
+
+int Paranoia::discFirstSector()
+{
+ return cdda_disc_firstsector( d );
+}
+
+int Paranoia::discLastSector()
+{
+ return cdda_disc_lastsector( d );
+}
+
+bool Paranoia::isAudio( int t )
+{
+ if ( cdda_track_audiop( d, t+1 ) ) return true;
+ else return false;
+}
+
+QString Paranoia::trackSize( int t )
+{
+ QString s, c;
+ long total;
+
+ total = CD_FRAMESIZE_RAW * (cdda_track_lastsector( d, t+1 )-cdda_track_firstsector( d, t+1 ) );
+ if ( total>(1048576 ) ) s = c.setNum(total/1048576.0, 'f', 2)+" "+i18n("MB");
+ else if ( total>1024 ) s = c.setNum(total/1024.0, 'f', 2)+" "+i18n("KB");
+ else s = c.setNum(total*1.0, 'f', 2)+" "+i18n("Bytes");
+ return s;
+}
+
+long Paranoia::trackSectorSize( int t )
+{
+ return cdda_track_lastsector( d, t )-cdda_track_firstsector( d, t );
+}
+
+QString Paranoia::trackTime( int t )
+{
+ QString c;
+ long total, time;
+ int m, s;
+
+ if ( t<0 ) total = CD_FRAMESIZE_RAW * (cdda_disc_lastsector( d )-cdda_disc_firstsector( d ) );
+ else total = CD_FRAMESIZE_RAW * (cdda_track_lastsector( d, t+1 )-cdda_track_firstsector( d, t+1 ) );
+ time = (8 * total) / (44100 * 2 * 16);
+ m = time/60;
+ s = time%60;
+ c.sprintf( "%.2i:%.2i", m, s );
+ return c;
+}
+
+Paranoia::~Paranoia()
+{
+ if ( p!=0 ) paranoia_free( p );
+ if (d!=0 ) cdda_close( d );
+}
+
+long Paranoia::getTracks()
+{
+ return nTracks;
+}
diff --git a/kaffeine/src/input/disc/paranoia.h b/kaffeine/src/input/disc/paranoia.h
new file mode 100644
index 0000000..4864b06
--- /dev/null
+++ b/kaffeine/src/input/disc/paranoia.h
@@ -0,0 +1,108 @@
+/*
+ * paranoia.h
+ *
+ * Copyright (C) 2002-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef PARANOIA_H
+#define PARANOIA_H
+
+#include <qstringlist.h>
+#include <qthread.h>
+#include <qwidget.h>
+
+#include <kconfig.h>
+
+#include "kaffeineaudioencoder.h"
+#include "paranoiasettings.h"
+
+extern "C"
+{
+#include <cdda_interface.h>
+#include <cdda_paranoia.h>
+}
+
+class KiloConfig : public ParanoiaSettings
+{
+ Q_OBJECT
+
+public:
+
+ KiloConfig( QWidget *parent, KConfig *confile, const QStringList &encoders );
+ ~KiloConfig();
+
+ QString getEncoder();
+ bool getNormalize();
+ QString getBaseDir();
+ int getParanoiaMode();
+
+public slots:
+
+ virtual void accept();
+ void setBaseDir();
+
+private:
+
+ KConfig *Conf;
+};
+
+class Paranoia : public QThread
+{
+public:
+ Paranoia();
+ bool init( QString dev );
+ ~Paranoia();
+ bool encode( const QStringList&, QWidget* );
+ long getTracks();
+ QString trackTime( int t );
+ int trackFirstSector( int t );
+ int discFirstSector();
+ int discLastSector();
+ virtual void run();
+ bool running() {return isRunning;}
+ int getProgress() {return progress;}
+
+private:
+
+ bool findCdrom();
+ bool procCdrom( QString name );
+ bool initTrack( int t );
+ void setMode( int mode );
+ bool isAudio( int t );
+ QString trackSize( int t );
+ long trackSectorSize( int t );
+ bool loadEncoder( QWidget* );
+ void unloadEncoder();
+ bool validPath( QString path );
+ bool setPath( QString &path, const QString &artist, const QString &album );
+
+ long nTracks;
+ cdrom_drive *d;
+ cdrom_paranoia *p;
+ long currentSector, endOfTrack;
+ bool isRunning;
+ QStringList encodingList;
+ QWidget *myParent;
+ KaffeineAudioEncoder *currentEncoder;
+ QString encoderDesktop;
+ bool normalize;
+ QString baseDir;
+ int paraMode;
+ int progress;
+};
+
+#endif /* PARANOIA_H */
diff --git a/kaffeine/src/input/disc/paranoiasettings.ui b/kaffeine/src/input/disc/paranoiasettings.ui
new file mode 100644
index 0000000..487899c
--- /dev/null
+++ b/kaffeine/src/input/disc/paranoiasettings.ui
@@ -0,0 +1,252 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ParanoiaSettings</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ParanoiaSettings</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>295</width>
+ <height>338</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Encoding Preferences</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>false</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>encoderGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Encoder:</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="0">
+ <property name="name">
+ <cstring>encoderComb</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>basedirGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Base directory:</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QToolButton" row="0" column="1">
+ <property name="name">
+ <cstring>baseDirBtn</cstring>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="0" column="0">
+ <property name="name">
+ <cstring>baseDirLineEdit</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>paranoiaGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Paranoia:</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>paranoiaRb0</cstring>
+ </property>
+ <property name="text">
+ <string>Disable all checking</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="1" column="0">
+ <property name="name">
+ <cstring>paranoiaRb1</cstring>
+ </property>
+ <property name="text">
+ <string>Normal mode</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="2" column="0">
+ <property name="name">
+ <cstring>paranoiaRb2</cstring>
+ </property>
+ <property name="text">
+ <string>Paranoia mode</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox3</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0">
+ <property name="name">
+ <cstring>normCb</cstring>
+ </property>
+ <property name="text">
+ <string>Normalize</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>152</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>cancelBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>okBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>ParanoiaSettings</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>ParanoiaSettings</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kaffeine/src/input/disc/plugins/Makefile.am b/kaffeine/src/input/disc/plugins/Makefile.am
new file mode 100644
index 0000000..ee42503
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/Makefile.am
@@ -0,0 +1,24 @@
+if with_lame
+ LAME_SUBDIR = mp3lame
+endif
+
+if with_oggvorbis
+ OGGVORBIS_SUBDIR = oggvorbis
+endif
+
+lib_LTLIBRARIES = libkaffeineaudioencoder.la
+
+METASOURCES = AUTO
+
+SUBDIRS = . $(LAME_SUBDIR) $(OGGVORBIS_SUBDIR)
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src $(all_includes)
+
+kaffeineincludedir = $(includedir)/kaffeine
+kaffeineinclude_HEADERS = kaffeineaudioencoder.h
+
+libkaffeineaudioencoder_la_SOURCES = kaffeineaudioencoder.cpp
+libkaffeineaudioencoder_la_LIBADD = $(LIB_KPARTS)
+libkaffeineaudioencoder_la_LDFLAGS = $(all_libraries) -version-info 0:1:0 -no-undefined
+
+kde_servicetypes_DATA = kaffeineaudioencoder.desktop
diff --git a/kaffeine/src/input/disc/plugins/kaffeineaudioencoder.cpp b/kaffeine/src/input/disc/plugins/kaffeineaudioencoder.cpp
new file mode 100644
index 0000000..5198e43
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/kaffeineaudioencoder.cpp
@@ -0,0 +1,30 @@
+/*
+ * kaffeineaudioencoder.cpp
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "kaffeineaudioencoder.h"
+#include "kaffeineaudioencoder.moc"
+
+KaffeineAudioEncoder::KaffeineAudioEncoder(QObject* parent, const char* name) : KParts::Part( parent, name )
+{
+}
+
+KaffeineAudioEncoder::~KaffeineAudioEncoder()
+{
+}
diff --git a/kaffeine/src/input/disc/plugins/kaffeineaudioencoder.desktop b/kaffeine/src/input/disc/plugins/kaffeineaudioencoder.desktop
new file mode 100644
index 0000000..821cabb
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/kaffeineaudioencoder.desktop
@@ -0,0 +1,4 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=ServiceType
+X-KDE-ServiceType=KaffeineAudioEncoder
diff --git a/kaffeine/src/input/disc/plugins/kaffeineaudioencoder.h b/kaffeine/src/input/disc/plugins/kaffeineaudioencoder.h
new file mode 100644
index 0000000..1dc3616
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/kaffeineaudioencoder.h
@@ -0,0 +1,53 @@
+/*
+ * kaffeineaudioencoder.h
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KAFFEINEAUDIOENCODER_H
+#define KAFFEINEAUDIOENCODER_H
+
+#include <kparts/part.h>
+#include <kconfig.h>
+
+#include <qstring.h>
+#include <qwidget.h>
+
+/*
+ * Base-Class for Kaffeine audio encoder plugins.
+ */
+
+class KDE_EXPORT KaffeineAudioEncoder : public KParts::Part
+{
+ Q_OBJECT
+public:
+ KaffeineAudioEncoder(QObject* parent, const char* name);
+ virtual ~KaffeineAudioEncoder();
+
+ // return false if the user's canceled.
+ virtual bool options( QWidget*, KConfig* ) {return false;}
+
+ // your file extension, e.g. ".ogg"
+ virtual QString getExtension() {return QString();}
+
+ virtual void start( QString/*title*/=0, QString/*artist*/=0, QString/*album*/=0, QString/*tracknumber*/=0, QString/*genre*/=0 ) {}
+ virtual char* getHeader( int&/*len*/ ) {return NULL;}
+ virtual char* encode( char*/*data*/, int /*datalen*/, int&/*len*/ ) {return NULL;}
+ virtual char* stop( int& /*len*/) {return NULL;}
+};
+
+#endif /* KAFFEINEAUDIOENCODER_H */
diff --git a/kaffeine/src/input/disc/plugins/mp3lame/Makefile.am b/kaffeine/src/input/disc/plugins/mp3lame/Makefile.am
new file mode 100644
index 0000000..6a58eb9
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/mp3lame/Makefile.am
@@ -0,0 +1,17 @@
+kde_module_LTLIBRARIES = libkaffeinemp3lame.la
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/ -I$(top_srcdir)/kaffeine/src/input/disc/plugins/ $(all_includes)
+
+METASOURCES = AUTO
+
+kaffeineincludedir = $(includedir)/kaffeine
+
+noinst_HEADERS = klameenc.h
+
+libkaffeinemp3lame_la_SOURCES = klameenc.cpp lameconfig.ui
+libkaffeinemp3lame_la_LIBADD = ../libkaffeineaudioencoder.la $(LIB_LAME)
+libkaffeinemp3lame_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) -avoid-version -no-undefined
+
+# this is where the desktop file will go
+partdesktopdir = $(kde_servicesdir)
+partdesktop_DATA = kaffeinemp3lame.desktop
diff --git a/kaffeine/src/input/disc/plugins/mp3lame/kaffeinemp3lame.desktop b/kaffeine/src/input/disc/plugins/mp3lame/kaffeinemp3lame.desktop
new file mode 100644
index 0000000..df941d8
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/mp3lame/kaffeinemp3lame.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Lame mp3
+Name[af]=LAME MP3
+Name[hu]=LAME MP3
+Name[ka]=Lame-ის mp3
+Name[nb]=LAME MP3
+Name[pt]=MP3 do LAME
+Name[xx]=xxLame mp3xx
+ServiceTypes=KaffeineAudioEncoder
+Type=Service
+X-KDE-Library=libkaffeinemp3lame
diff --git a/kaffeine/src/input/disc/plugins/mp3lame/klameenc.cpp b/kaffeine/src/input/disc/plugins/mp3lame/klameenc.cpp
new file mode 100644
index 0000000..ddfc5c2
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/mp3lame/klameenc.cpp
@@ -0,0 +1,176 @@
+/*
+ * klameenc.cpp
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qcombobox.h>
+#include <qcheckbox.h>
+
+#include <kparts/genericfactory.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kpushbutton.h>
+
+#include "klameenc.h"
+#include "klameenc.moc"
+
+LameSettings::LameSettings( QWidget *parent, KConfig *confile ) : LameConfig( parent )
+{
+ KIconLoader *icon = new KIconLoader();
+ okBtn->setGuiItem( KGuiItem(i18n("OK"), icon->loadIconSet("ok", KIcon::Small) ) );
+ cancelBtn->setGuiItem( KGuiItem(i18n("Cancel"), icon->loadIconSet("cancel", KIcon::Small) ) );
+ delete icon;
+ brateComb->insertItem( "32" );
+ brateComb->insertItem( "40" );
+ brateComb->insertItem( "48" );
+ brateComb->insertItem( "56" );
+ brateComb->insertItem( "64" );
+ brateComb->insertItem( "80" );
+ brateComb->insertItem( "96" );
+ brateComb->insertItem( "112" );
+ brateComb->insertItem( "128" );
+ brateComb->insertItem( "160" );
+ brateComb->insertItem( "192" );
+ brateComb->insertItem( "224" );
+ brateComb->insertItem( "256" );
+ brateComb->insertItem( "320" );
+ Conf = confile;
+ Conf->setGroup("LameMp3");
+ brateComb->setCurrentText( Conf->readEntry( "BitRate", "128" ) );
+ vbrCb->setChecked( Conf->readBoolEntry( "VBR", false ) );
+}
+
+LameSettings::~LameSettings()
+{
+}
+
+void LameSettings::accept()
+{
+ Conf->setGroup("LameMp3");
+ Conf->writeEntry( "BitRate", brateComb->currentText() );
+ Conf->writeEntry( "VBR", vbrCb->isChecked() );
+ done( Accepted );
+}
+
+int LameSettings::getBitrate()
+{
+ return brateComb->currentText().toInt();
+}
+
+bool LameSettings::isVBR()
+{
+ return vbrCb->isChecked();
+}
+
+K_EXPORT_COMPONENT_FACTORY (libkaffeinemp3lame, KParts::GenericFactory<KLameEnc>)
+
+KLameEnc::KLameEnc( QWidget*, const char*, QObject* parent, const char* name, const QStringList& )
+ : KaffeineAudioEncoder(parent,name)
+{
+ setInstance(KParts::GenericFactory<KLameEnc>::instance());
+}
+
+KAboutData *KLameEnc::createAboutData()
+{
+ KAboutData* aboutData = new KAboutData( "kaffeinemp3lame", I18N_NOOP("KaffeineMp3Lame"),
+ "0.1", I18N_NOOP("A Lame mp3 encoder plugin for Kaffeine."),
+ KAboutData::License_GPL,
+ "(c) 2006, Christophe Thommeret.", 0, "http://kaffeine.sourceforge.net");
+ aboutData->addAuthor("Christophe Thommeret.",0, "hftom@free.fr");
+
+ return aboutData;
+}
+
+QString KLameEnc::getExtension()
+{
+ return QString(".mp3");
+}
+
+bool KLameEnc::options( QWidget *parent, KConfig *conf )
+{
+ LameSettings dlg( parent, conf );
+ int ret = dlg.exec();
+ if ( ret!=QDialog::Accepted )
+ return false;
+ bitrate = dlg.getBitrate();
+ vbr = dlg.isVBR();
+ return true;
+}
+
+void KLameEnc::start( QString title, QString artist, QString album, QString tracknumber, QString genre )
+{
+ flags = lame_init();
+ lame_set_mode( flags, STEREO );
+ if ( vbr ) {
+ lame_set_VBR( flags, vbr_abr );
+ lame_set_VBR_mean_bitrate_kbps( flags, bitrate );
+ }
+ else {
+ lame_set_VBR( flags, vbr_off );
+ lame_set_brate( flags, bitrate );
+ }
+ lame_init_params( flags );
+
+ id3tag_init( flags );
+ id3tag_v2_only( flags );
+ if ( !title.isNull() )
+ id3tag_set_title( flags, title.latin1() );
+ if ( !artist.isNull() )
+ id3tag_set_artist( flags, artist.latin1() );
+ if ( !album.isNull() )
+ id3tag_set_album( flags, album.latin1() );
+ if ( !tracknumber.isNull() )
+ id3tag_set_track( flags, tracknumber.latin1() );
+ if ( !genre.isNull() )
+ id3tag_set_genre( flags, genre.latin1() );
+ id3tag_set_comment( flags, "Encoded by Kaffeine" );
+ lame_init_params( flags );
+}
+
+char* KLameEnc::getHeader( int &len )
+{
+ len = 0;
+ return NULL;
+}
+
+char* KLameEnc::encode( char *data, int datalen, int &len )
+{
+ len = lame_encode_buffer_interleaved( flags, (short int*)data, datalen/4, (unsigned char*)bufEncode, 8000 );
+
+ if ( len>0 )
+ return bufEncode;
+ else
+ return NULL;
+}
+
+char* KLameEnc::stop( int &len )
+{
+ len = lame_encode_flush( flags, (unsigned char*)bufEncode, 8000 );
+
+ lame_close( flags );
+ flags = 0;
+
+ if ( len>0 )
+ return bufEncode;
+ else
+ return NULL;
+}
+
+KLameEnc::~KLameEnc()
+{
+}
diff --git a/kaffeine/src/input/disc/plugins/mp3lame/klameenc.h b/kaffeine/src/input/disc/plugins/mp3lame/klameenc.h
new file mode 100644
index 0000000..0550149
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/mp3lame/klameenc.h
@@ -0,0 +1,76 @@
+/*
+ * klameenc.h
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KLAMEENC_H
+#define KLAMEENC_H
+
+#include <lame/lame.h>
+
+#include <kconfig.h>
+
+#include "kaffeineaudioencoder.h"
+#include "lameconfig.h"
+
+class LameSettings : public LameConfig
+{
+ Q_OBJECT
+public:
+ LameSettings( QWidget *parent, KConfig *confile );
+ ~LameSettings();
+
+ int getBitrate();
+ bool isVBR();
+
+public slots:
+ virtual void accept();
+
+private:
+ KConfig *Conf;
+};
+
+class KLameEnc : public KaffeineAudioEncoder
+{
+ Q_OBJECT
+
+public:
+
+ KLameEnc( QWidget*, const char*, QObject*, const char*, const QStringList& );
+ ~KLameEnc();
+
+ // Reimplemented from KaffeineAudioEncoder
+ bool options( QWidget*, KConfig* );
+ QString getExtension();
+ void start( QString title=0, QString artist=0, QString album=0, QString tracknumber=0, QString genre=0 );
+ char* getHeader( int &len );
+ char* encode( char *data, int datalen, int &len );
+ char* stop( int &len );
+ //****************************
+
+ static KAboutData* createAboutData();
+
+private:
+
+ char bufEncode[8000];
+ lame_global_flags *flags;
+ int bitrate;
+ bool vbr;
+};
+
+#endif /* KLAMEENC_H */
diff --git a/kaffeine/src/input/disc/plugins/mp3lame/lameconfig.ui b/kaffeine/src/input/disc/plugins/mp3lame/lameconfig.ui
new file mode 100644
index 0000000..202040a
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/mp3lame/lameconfig.ui
@@ -0,0 +1,195 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>LameConfig</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>LameConfig</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>232</width>
+ <height>142</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Lame mp3 options</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>false</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox1</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="1" column="0">
+ <property name="name">
+ <cstring>vbrCb</cstring>
+ </property>
+ <property name="text">
+ <string>VBR</string>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Bitrate:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>brateComb</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Kb/s</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>16</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>107</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>cancelBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>okBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>LameConfig</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>LameConfig</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kaffeine/src/input/disc/plugins/oggvorbis/Makefile.am b/kaffeine/src/input/disc/plugins/oggvorbis/Makefile.am
new file mode 100644
index 0000000..7ac8f45
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/oggvorbis/Makefile.am
@@ -0,0 +1,17 @@
+kde_module_LTLIBRARIES = libkaffeineoggvorbis.la
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/ -I$(top_srcdir)/kaffeine/src/input/disc/plugins/ $(all_includes) $(CFLAGS_OGGVORBIS)
+
+METASOURCES = AUTO
+
+kaffeineincludedir = $(includedir)/kaffeine
+
+noinst_HEADERS = koggenc.h
+
+libkaffeineoggvorbis_la_SOURCES = koggenc.cpp oggconfig.ui
+libkaffeineoggvorbis_la_LIBADD = ../libkaffeineaudioencoder.la $(LIB_OGGVORBIS)
+libkaffeineoggvorbis_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) -avoid-version -no-undefined
+
+# this is where the desktop file will go
+partdesktopdir = $(kde_servicesdir)
+partdesktop_DATA = kaffeineoggvorbis.desktop
diff --git a/kaffeine/src/input/disc/plugins/oggvorbis/kaffeineoggvorbis.desktop b/kaffeine/src/input/disc/plugins/oggvorbis/kaffeineoggvorbis.desktop
new file mode 100644
index 0000000..cf51bf8
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/oggvorbis/kaffeineoggvorbis.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Encoding=UTF-8
+Name=Ogg Vorbis
+Name[nb]=OGG Vorbis
+Name[pa]=Ogg ਵੋਰਬਿਸ
+Name[xx]=xxOgg Vorbisxx
+ServiceTypes=KaffeineAudioEncoder
+Type=Service
+X-KDE-Library=libkaffeineoggvorbis
diff --git a/kaffeine/src/input/disc/plugins/oggvorbis/koggenc.cpp b/kaffeine/src/input/disc/plugins/oggvorbis/koggenc.cpp
new file mode 100644
index 0000000..f5352b8
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/oggvorbis/koggenc.cpp
@@ -0,0 +1,236 @@
+/*
+ * koggenc.cpp
+ *
+ * Copyright (C) 2002-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qslider.h>
+
+#include <kparts/genericfactory.h>
+#include <kiconloader.h>
+#include <kpushbutton.h>
+
+#include "koggenc.h"
+#include "koggenc.moc"
+
+OggSettings::OggSettings( QWidget *parent, KConfig *confile ) : OggConfig( parent )
+{
+ KIconLoader *icon = new KIconLoader();
+ okBtn->setGuiItem( KGuiItem(i18n("OK"), icon->loadIconSet("ok", KIcon::Small) ) );
+ cancelBtn->setGuiItem( KGuiItem(i18n("Cancel"), icon->loadIconSet("cancel", KIcon::Small) ) );
+ delete icon;
+ Conf = confile;
+ Conf->setGroup("OggVorbis");
+ oggSlid->setValue( Conf->readNumEntry( "Quality", 4 ) );
+}
+
+OggSettings::~OggSettings()
+{
+}
+
+void OggSettings::accept()
+{
+ Conf->setGroup("OggVorbis");
+ Conf->writeEntry( "Quality", oggSlid->value() );
+ done( Accepted );
+}
+
+int OggSettings::getQuality()
+{
+ return oggSlid->value();
+}
+
+K_EXPORT_COMPONENT_FACTORY (libkaffeineoggvorbis, KParts::GenericFactory<KOggEnc>)
+
+KOggEnc::KOggEnc( QWidget*, const char*, QObject* parent, const char* name, const QStringList& )
+ : KaffeineAudioEncoder(parent,name)
+{
+ setInstance(KParts::GenericFactory<KOggEnc>::instance());
+ encodingQuality = 0.4;
+ bufEncode = new char[1];
+ tmpBuf = new char[1];
+}
+
+KAboutData *KOggEnc::createAboutData()
+{
+ KAboutData* aboutData = new KAboutData( "kaffeineoggvorbis", I18N_NOOP("KaffeineOggVorbis"),
+ "0.1", I18N_NOOP("A Ogg Vorbis encoder plugin for Kaffeine."),
+ KAboutData::License_GPL,
+ "(c) 2006, Christophe Thommeret.", 0, "http://kaffeine.sourceforge.net");
+ aboutData->addAuthor("Christophe Thommeret.",0, "hftom@free.fr");
+
+ return aboutData;
+}
+
+QString KOggEnc::getExtension()
+{
+ return QString(".ogg");
+}
+
+bool KOggEnc::options( QWidget *parent, KConfig *conf )
+{
+ OggSettings dlg( parent, conf );
+ int ret = dlg.exec();
+ if ( ret!=QDialog::Accepted )
+ return false;
+ encodingQuality = dlg.getQuality()/10.0;
+ return true;
+}
+
+void KOggEnc::start( QString title, QString artist, QString album, QString tracknumber, QString genre )
+{
+ char* tag;
+
+ vorbis_info_init( &vi );
+ vorbis_encode_init_vbr( &vi, 2, 44100, encodingQuality );
+ /* add a comment */
+ vorbis_comment_init( &vc );
+ vorbis_comment_add_tag( &vc, "description", "Encoded by Kaffeine" );
+ //vorbis_comment_add_tag( &vc, "vendor", "KOggEnc (Kilogram)" );
+ /* set up the analysis state and auxiliary encoding storage */
+ vorbis_analysis_init( &vd, &vi );
+ vorbis_block_init( &vd, &vb );
+ /* set up our packet->stream encoder */
+ /* pick a random serial number; that way we can more likely build
+ chained streams just by concatenation */
+ srand( time(NULL) );
+ ogg_stream_init( &os, rand() );
+ if ( !title.isNull() ) {
+ tag = qstrdup( title.utf8() );
+ vorbis_comment_add_tag( &vc, "title", tag );
+ delete [] tag;
+ }
+ if ( !artist.isNull() ) {
+ tag = qstrdup( artist.utf8() );
+ vorbis_comment_add_tag( &vc, "artist", tag );
+ delete [] tag;
+ }
+ if ( !album.isNull() ) {
+ tag = qstrdup( album.utf8() );
+ vorbis_comment_add_tag( &vc, "album", tag );
+ delete [] tag;
+ }
+ if ( !tracknumber.isNull() ) {
+ tag = qstrdup( tracknumber.utf8() );
+ vorbis_comment_add_tag( &vc, "tracknumber", tag );
+ delete [] tag;
+ }
+ if ( !genre.isNull() ) {
+ tag = qstrdup( genre.utf8() );
+ vorbis_comment_add_tag( &vc, "genre", tag );
+ delete [] tag;
+ }
+}
+
+char* KOggEnc::getHeader( int &len )
+{
+ int buflen=0;
+
+ vorbis_analysis_headerout( &vd, &vc, &header, &header_comm, &header_code );
+ ogg_stream_packetin( &os, &header ); /* automatically placed in its own page */
+ ogg_stream_packetin( &os, &header_comm );
+ ogg_stream_packetin( &os, &header_code );
+
+ while( ogg_stream_flush( &os, &og ) ){
+ delete [] bufEncode;
+ bufEncode = new char[ og.header_len+og.body_len+buflen ];
+ //memcpy( mempcpy( mempcpy( bufEncode, tmpBuf, buflen ), og.header, og.header_len ), og.body, og.body_len );
+ memcpy( (char*)memcpy( (char*)memcpy( bufEncode, tmpBuf, buflen )+buflen, og.header, og.header_len )+og.header_len, og.body, og.body_len );
+ buflen+= og.header_len;
+ buflen+= og.body_len;
+ delete [] tmpBuf;
+ tmpBuf = new char[ buflen ];
+ memcpy( tmpBuf, bufEncode, buflen );
+ }
+ len = buflen;
+ return bufEncode;
+}
+
+char* KOggEnc::encode( char *data, int datalen, int &len )
+{
+ int buflen=0;
+ int i;
+ float **buffer=vorbis_analysis_buffer( &vd, datalen/4 );
+
+ for( i=0; i<datalen/4; i++ ){
+ buffer[0][i] = ((data[i*4+1]<<8) | (0x00ff&(int)data[i*4]))/32768.f;
+ buffer[1][i] = ((data[i*4+3]<<8) | (0x00ff&(int)data[i*4+2]))/32768.f;
+ }
+ vorbis_analysis_wrote( &vd, i );
+
+ while( vorbis_analysis_blockout( &vd, &vb)==1 ) {
+ vorbis_analysis( &vb, NULL );
+ vorbis_bitrate_addblock( &vb );
+ while( vorbis_bitrate_flushpacket( &vd, &op ) ) {
+ ogg_stream_packetin( &os, &op );
+ while( ogg_stream_pageout( &os, &og ) ) {
+ delete [] bufEncode;
+ bufEncode = new char[ og.header_len+og.body_len+buflen ];
+ //memcpy( mempcpy( mempcpy( bufEncode, tmpBuf, buflen ), og.header, og.header_len ), og.body, og.body_len );
+ memcpy( (char*)memcpy( (char*)memcpy( bufEncode, tmpBuf, buflen )+buflen, og.header, og.header_len )+og.header_len, og.body, og.body_len );
+ buflen+= og.header_len;
+ buflen+= og.body_len;
+ delete [] tmpBuf;
+ tmpBuf = new char[ buflen ];
+ memcpy( tmpBuf, bufEncode, buflen );
+ }
+ }
+ }
+ len = buflen;
+ return bufEncode;
+}
+
+char* KOggEnc::stop( int &len )
+{
+ int buflen=0;
+
+ vorbis_analysis_wrote( &vd, 0 );
+ while( vorbis_analysis_blockout( &vd, &vb)==1 ) {
+ vorbis_analysis( &vb, NULL );
+ vorbis_bitrate_addblock( &vb );
+ while( vorbis_bitrate_flushpacket( &vd, &op ) ) {
+ ogg_stream_packetin( &os, &op );
+ while( ogg_stream_pageout( &os, &og ) ) {
+ delete [] bufEncode;
+ bufEncode = new char[ og.header_len+og.body_len+buflen ];
+ //memcpy( mempcpy( mempcpy( bufEncode, tmpBuf, buflen ), og.header, og.header_len ), og.body, og.body_len );
+ memcpy( (char*)memcpy( (char*)memcpy( bufEncode, tmpBuf, buflen )+buflen, og.header, og.header_len )+og.header_len, og.body, og.body_len );
+ buflen+= og.header_len;
+ buflen+= og.body_len;
+ delete [] tmpBuf;
+ tmpBuf = new char[ buflen ];
+ memcpy( tmpBuf, bufEncode, buflen );
+ }
+ }
+ }
+ ogg_stream_clear( &os );
+ vorbis_block_clear( &vb );
+ vorbis_dsp_clear( &vd );
+ vorbis_comment_clear( &vc );
+ vorbis_info_clear( &vi );
+ len = buflen;
+ if ( len>0 )
+ return bufEncode;
+ else
+ return NULL;
+}
+
+KOggEnc::~KOggEnc()
+{
+ delete [] bufEncode;
+ delete [] tmpBuf;
+}
diff --git a/kaffeine/src/input/disc/plugins/oggvorbis/koggenc.h b/kaffeine/src/input/disc/plugins/oggvorbis/koggenc.h
new file mode 100644
index 0000000..9560a53
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/oggvorbis/koggenc.h
@@ -0,0 +1,92 @@
+/*
+ * koggenc.h
+ *
+ * Copyright (C) 2002-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KOGGENC_H
+#define KOGGENC_H
+
+extern "C"
+{
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <math.h>
+#include <vorbis/vorbisenc.h>
+}
+
+#include <kconfig.h>
+
+#include "kaffeineaudioencoder.h"
+#include "oggconfig.h"
+
+class OggSettings : public OggConfig
+{
+ Q_OBJECT
+public:
+ OggSettings( QWidget *parent, KConfig *confile );
+ ~OggSettings();
+
+ int getQuality();
+
+public slots:
+ virtual void accept();
+
+private:
+ KConfig *Conf;
+};
+
+class KOggEnc : public KaffeineAudioEncoder
+{
+ Q_OBJECT
+
+public:
+
+ KOggEnc( QWidget*, const char*, QObject*, const char*, const QStringList& );
+ ~KOggEnc();
+
+ // Reimplemented from KaffeineAudioEncoder
+ bool options( QWidget*, KConfig* );
+ QString getExtension();
+ void start( QString title=0, QString artist=0, QString album=0, QString tracknumber=0, QString genre=0 );
+ char* getHeader( int &len );
+ char* encode( char *data, int datalen, int &len );
+ char* stop( int &len );
+ //****************************
+
+ static KAboutData* createAboutData();
+
+private:
+
+ ogg_stream_state os; /* take physical pages, weld into a logical stream of packets */
+ ogg_page og; /* one Ogg bitstream page. Vorbis packets are inside */
+ ogg_packet op; /* one raw packet of data for decode */
+ vorbis_info vi; /* struct that stores all the static vorbis bitstream settings */
+ vorbis_comment vc; /* struct that stores all the user comments */
+ vorbis_dsp_state vd; /* central working state for the packet->PCM decoder */
+ vorbis_block vb; /* local working space for packet->PCM decode */
+ ogg_packet header;
+ ogg_packet header_comm;
+ ogg_packet header_code;
+ char *bufEncode;
+ char *tmpBuf;
+ float encodingQuality;
+};
+
+#endif /* KOGGENC_H */
diff --git a/kaffeine/src/input/disc/plugins/oggvorbis/oggconfig.ui b/kaffeine/src/input/disc/plugins/oggvorbis/oggconfig.ui
new file mode 100644
index 0000000..178e938
--- /dev/null
+++ b/kaffeine/src/input/disc/plugins/oggvorbis/oggconfig.ui
@@ -0,0 +1,191 @@
+<!DOCTYPE UI><UI version="3.2" stdsetdef="1">
+<class>OggConfig</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>OggConfig</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>327</width>
+ <height>131</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Ogg Vorbis Options</string>
+ </property>
+ <property name="sizeGripEnabled">
+ <bool>false</bool>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>GroupBox1</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLCDNumber" row="1" column="1">
+ <property name="name">
+ <cstring>oggLCD</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>Box</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Raised</enum>
+ </property>
+ <property name="numDigits">
+ <number>3</number>
+ </property>
+ <property name="value" stdset="0">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="QSlider" row="1" column="0">
+ <property name="name">
+ <cstring>oggSlid</cstring>
+ </property>
+ <property name="minValue">
+ <number>-1</number>
+ </property>
+ <property name="maxValue">
+ <number>10</number>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Quality :</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>81</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Horizontal Spacing2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>157</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>cancelBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>okBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ <property name="accel">
+ <string></string>
+ </property>
+ <property name="autoDefault">
+ <bool>true</bool>
+ </property>
+ <property name="default">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>OggConfig</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>OggConfig</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>oggSlid</sender>
+ <signal>valueChanged(int)</signal>
+ <receiver>oggLCD</receiver>
+ <slot>display(int)</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kaffeine/src/input/dvb/Makefile.am b/kaffeine/src/input/dvb/Makefile.am
new file mode 100644
index 0000000..7b6c866
--- /dev/null
+++ b/kaffeine/src/input/dvb/Makefile.am
@@ -0,0 +1,81 @@
+SUBDIRS = lib plugins .
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/ \
+ -I$(top_srcdir)/kaffeine/src/input/dvb/lib \
+ -I$(top_srcdir)/kaffeine/src/input/dvb/plugins/stream \
+ -I$(top_srcdir)/kaffeine/src/input/dvb/plugins/epg \
+ -I$(top_srcdir)/kaffeine/src \
+ $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_LTLIBRARIES = libkaffeinedvb.la
+
+libkaffeinedvb_la_SOURCES = audioeditor.cpp \
+ audioeditor.h \
+ audioeditorui.ui \
+ channeldesc.cpp \
+ channeldesc.h \
+ channeleditor.cpp \
+ channeleditor.h \
+ channeleditorui.ui \
+ dvbconfig.cpp \
+ dvbconfig.h \
+ dvbevents.cpp \
+ dvbevents.h \
+ dvbout.cpp \
+ dvbout.h \
+ dvbpanel.cpp \
+ dvbpanel.h \
+ dvbsection.h \
+ dvbsi.cpp \
+ dvbsi.h \
+ dvbstream.cpp \
+ dvbstream.h \
+ gdvb.h \
+ kevents.cpp \
+ kevents.h \
+ kgradprogress.cpp \
+ kgradprogress.h \
+ krecord.cpp \
+ krecord.h \
+ ktimereditor.cpp \
+ ktimereditor.h \
+ scandialog.cpp \
+ scandialog.h \
+ scandialogui.ui \
+ sender.cpp \
+ sender.h \
+ ts2rtp.cpp \
+ ts2rtp.h \
+ subeditorui.ui \
+ subeditor.cpp \
+ subeditor.h \
+ broadcasteditorui.ui \
+ broadcasteditor.cpp \
+ broadcasteditor.h \
+ cleaner.cpp \
+ cleaner.h \
+ crontimerui.ui \
+ crontimer.cpp \
+ crontimer.h \
+ dvbcam.cpp \
+ dvbcam.h
+
+libkaffeinedvb_la_LDFLAGS = $(KDE_RPATH) $(all_libraries) \
+ -L$(top_srcdir)/kaffeine/src/input \
+ -L$(top_srcdir)/kaffeine/src/input/dvb/plugins/stream \
+ -L$(top_srcdir)/kaffeine/src/input/dvb/plugins/epg \
+ ./lib/libdvbapi \
+ ./lib/libdvben50221 \
+ ./lib/libucsi
+
+libkaffeinedvb_la_LIBADD = \
+ $(top_builddir)/kaffeine/src/input/dvb/plugins/stream/libkaffeinedvbplugin.la \
+ $(top_builddir)/kaffeine/src/input/dvb/plugins/epg/libkaffeineepgplugin.la \
+ $(top_builddir)/kaffeine/src/input/libkaffeineinput.la \
+ ./lib/libdvbapi/libdvbapi.la ./lib/libdvben50221/libdvben50221.la ./lib/libucsi/libucsi.la
+
+# this is where the XML-GUI resource file goes
+shellrcdir = $(kde_datadir)/kaffeine
+shellrc_DATA = kaffeinedvb.rc
diff --git a/kaffeine/src/input/dvb/audioeditor.cpp b/kaffeine/src/input/dvb/audioeditor.cpp
new file mode 100644
index 0000000..a8d8a5f
--- /dev/null
+++ b/kaffeine/src/input/dvb/audioeditor.cpp
@@ -0,0 +1,160 @@
+/*
+ * audioeditor.cpp
+ *
+ * Copyright (C) 2004-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qlistbox.h>
+#include <qspinbox.h>
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include "audioeditor.h"
+
+AudioEditor::AudioEditor( ChannelDesc *chan, QWidget *parent ) : AudioEditorUI( parent )
+{
+ QString s, t;
+ int i;
+
+ channel = chan;
+ pidList->clear();
+
+ for ( i=0; i<channel->napid; i++ ) insertItem( i );
+
+ if ( channel->napid==channel->maxapid ) newBtn->setEnabled( false );
+
+ connect( pidList, SIGNAL(highlighted(int)), this, SLOT(showProp(int)) );
+ connect( upBtn, SIGNAL(clicked()), this, SLOT(itemUp()) );
+ connect( downBtn, SIGNAL(clicked()), this, SLOT(itemDown()) );
+ connect( delBtn, SIGNAL(clicked()), this, SLOT(itemDelete()) );
+ connect( updateBtn, SIGNAL(clicked()), this, SLOT(itemUpdate()) );
+ connect( newBtn, SIGNAL(clicked()), this, SLOT(itemNew()) );
+}
+
+void AudioEditor::insertItem( int index, bool updt )
+{
+ QString s, t;
+
+ s = t.setNum( channel->apid[index].pid );
+ if ( !channel->apid[index].lang.isEmpty() ) s = s+"("+channel->apid[index].lang+")";
+ if ( channel->apid[index].ac3 ) s = s+"(ac3)";
+ if ( updt ) pidList->changeItem( s, index );
+ else pidList->insertItem( s, index );
+}
+
+void AudioEditor::showProp( int index )
+{
+ if ( index<0 ) {
+ pidSpin->setValue( 0 );
+ langLe->setText( "" );
+ ac3Cb->setChecked( false );
+ }
+ else {
+ pidSpin->setValue( channel->apid[index].pid );
+ langLe->setText( channel->apid[index].lang );
+ ac3Cb->setChecked( channel->apid[index].ac3 );
+ }
+}
+
+void AudioEditor::itemUp()
+{
+ AudioPid a;
+
+ int n = pidList->currentItem();
+
+ if ( n<1 ) return;
+
+ a = channel->apid[n-1];
+ channel->apid[n-1] = channel->apid[n];
+ channel->apid[n] = a;
+
+ insertItem( n, true );
+ insertItem( n-1, true );
+}
+
+void AudioEditor::itemDown()
+{
+ AudioPid a;
+
+ int n = pidList->currentItem();
+
+ if ( (n<0) || (n>(channel->napid-2)) ) return;
+
+ a = channel->apid[n+1];
+ channel->apid[n+1] = channel->apid[n];
+ channel->apid[n] = a;
+
+ insertItem( n, true );
+ insertItem( n+1, true );
+}
+
+void AudioEditor::itemDelete()
+{
+ int n = pidList->currentItem();
+
+ if ( channel->napid==0 || (n<0) ) return; //for sure
+
+ for ( int i=n; i<channel->napid-1; i++ ) channel->apid[i] = channel->apid[i+1];
+ channel->napid--;
+ pidList->removeItem( n );
+
+ newBtn->setEnabled( true );
+}
+
+void AudioEditor::itemUpdate()
+{
+ int n = pidList->currentItem();
+
+ if ( n<0 ) return;
+
+ channel->apid[n].pid = pidSpin->value();
+ channel->apid[n].lang = langLe->text().stripWhiteSpace();
+ if ( ac3Cb->isChecked() ) channel->apid[n].ac3 = 1;
+ else channel->apid[n].ac3 = 0;
+
+ insertItem( n, true );
+}
+
+void AudioEditor::itemNew()
+{
+ if ( channel->napid==channel->maxapid ) { //for sure
+ newBtn->setEnabled( false );
+ return;
+ }
+
+ if ( !pidSpin->value() ) {
+ KMessageBox::sorry( this, i18n("Pid must be non zero!") );
+ return;
+ }
+ channel->napid++;
+ channel->apid[channel->napid-1].pid = pidSpin->value();
+ channel->apid[channel->napid-1].lang = langLe->text().stripWhiteSpace();
+ if ( ac3Cb->isChecked() ) channel->apid[channel->napid-1].ac3 = 1;
+ else channel->apid[channel->napid-1].ac3 = 0;
+ insertItem( channel->napid-1 );
+ if ( channel->napid==channel->maxapid ) newBtn->setEnabled( false );
+}
+
+AudioEditor::~AudioEditor()
+{
+}
+
+#include "audioeditor.moc"
diff --git a/kaffeine/src/input/dvb/audioeditor.h b/kaffeine/src/input/dvb/audioeditor.h
new file mode 100644
index 0000000..8751505
--- /dev/null
+++ b/kaffeine/src/input/dvb/audioeditor.h
@@ -0,0 +1,53 @@
+/*
+ * audioeditor.h
+ *
+ * Copyright (C) 2004-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef AUDIOEDITOR_H
+#define AUDIOEDITOR_H
+
+#include "channeldesc.h"
+#include "audioeditorui.h"
+
+class AudioEditor : public AudioEditorUI
+{
+ Q_OBJECT
+
+public:
+
+ AudioEditor( ChannelDesc *chan, QWidget *parent );
+ ~AudioEditor();
+
+private slots:
+
+ void showProp( int index );
+ void itemUp();
+ void itemDown();
+ void itemDelete();
+ void itemUpdate();
+ void itemNew();
+
+private:
+
+ void insertItem( int index, bool updt=false );
+
+ ChannelDesc *channel;
+
+};
+
+#endif /* AUDIOEDITOR_H */
diff --git a/kaffeine/src/input/dvb/audioeditorui.ui b/kaffeine/src/input/dvb/audioeditorui.ui
new file mode 100644
index 0000000..20b07ef
--- /dev/null
+++ b/kaffeine/src/input/dvb/audioeditorui.ui
@@ -0,0 +1,319 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>AudioEditorUI</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>AudioEditorUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>439</width>
+ <height>284</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Audio PIDs editor</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout24</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout23</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox10</cstring>
+ </property>
+ <property name="title">
+ <string>Audio PIDs</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox" row="0" column="0">
+ <item>
+ <property name="text">
+ <string>New Item</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>pidList</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout21</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout16</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>upBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Move Up</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>downBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Move Down</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>delBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer10</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>updateBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;&lt; Update Selected</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>newBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;&lt; New</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox9</cstring>
+ </property>
+ <property name="title">
+ <string>Properties</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>pidSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>8192</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Pid:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Lang:</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0">
+ <property name="name">
+ <cstring>ac3Cb</cstring>
+ </property>
+ <property name="text">
+ <string>AC3</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit" row="1" column="1">
+ <property name="name">
+ <cstring>langLe</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>2</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line3</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout19</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>AudioEditorUI</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>okBtn</tabstop>
+ <tabstop>pidList</tabstop>
+ <tabstop>upBtn</tabstop>
+ <tabstop>downBtn</tabstop>
+ <tabstop>delBtn</tabstop>
+ <tabstop>updateBtn</tabstop>
+ <tabstop>newBtn</tabstop>
+ <tabstop>pidSpin</tabstop>
+ <tabstop>langLe</tabstop>
+ <tabstop>ac3Cb</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kaffeine/src/input/dvb/broadcasteditor.cpp b/kaffeine/src/input/dvb/broadcasteditor.cpp
new file mode 100644
index 0000000..0e6c8a6
--- /dev/null
+++ b/kaffeine/src/input/dvb/broadcasteditor.cpp
@@ -0,0 +1,132 @@
+/*
+ * broadcasteditor.cpp
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qdir.h>
+#include <qvaluelist.h>
+
+#include <kpushbutton.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include "broadcasteditor.h"
+
+BroadcastEditor::BroadcastEditor( QWidget *parent, QPtrList<ChannelDesc> *ch, QPtrList<ChannelDesc> *ret ) : BroadcastEditorUI( parent )
+{
+ KIconLoader *icon = new KIconLoader();
+
+ tvPix = icon->loadIcon( "kdvbtv", KIcon::Small );
+ tvcPix = icon->loadIcon( "kdvbtvc", KIcon::Small );
+ raPix = icon->loadIcon( "kdvbra", KIcon::Small );
+ racPix = icon->loadIcon( "kdvbrac", KIcon::Small );
+ addBtn->setGuiItem( KGuiItem(i18n("Add"), icon->loadIconSet("forward", KIcon::Small) ) );
+ resetBtn->setGuiItem( KGuiItem(i18n("Reset"), icon->loadIconSet("reload", KIcon::Small) ) );
+ cancelBtn->setGuiItem( KGuiItem(i18n("Cancel"), icon->loadIconSet("cancel", KIcon::Small) ) );
+ okBtn->setGuiItem( KGuiItem(i18n("OK"), icon->loadIconSet("ok", KIcon::Small) ) );
+
+ connect( channelLb, SIGNAL(doubleClicked(QListBoxItem*)), this, SLOT(slotAddChannel(QListBoxItem*)) );
+
+ chan = ch;
+ list = ret;
+
+ resetList();
+ delete icon;
+}
+
+BroadcastEditor::~BroadcastEditor()
+{
+}
+
+ChannelDesc* BroadcastEditor::getChannel( const QString &name )
+{
+ int i;
+
+ for ( i=0; i<(int)chan->count(); i++ ) {
+ if ( chan->at(i)->name==name ) return chan->at(i);
+ }
+ return 0;
+}
+
+void BroadcastEditor::slotAddChannel(QListBoxItem*)
+{
+ addToList();
+}
+
+void BroadcastEditor::addToList()
+{
+ int i;
+ QString curName;
+ QValueList<QListBoxItem*> qvl;
+ ChannelDesc *c=0, *d=0;
+
+ for ( i=0; i<(int)channelLb->count(); i++ ) {
+ if ( channelLb->isSelected(i) ) {
+ curName = channelLb->text(i);
+ c = getChannel( curName );
+ if ( !c ) continue;
+ broadcastLb->insertItem( *channelLb->pixmap(i), channelLb->text(i) );
+ list->append( c );
+ qvl.append(channelLb->item(i));
+ }
+ }
+ if ( !c ) return;
+ for ( i=0; i<(int)qvl.count(); i++ ) channelLb->takeItem( qvl[i] );
+
+ qvl.clear();
+ for ( i=0; i<(int)channelLb->count(); i++ ) {
+ d = getChannel( channelLb->text(i) );
+ if ( !d ) continue;
+ if ( d->tp!=c->tp ) qvl.append(channelLb->item(i));
+ }
+ for ( i=0; i<(int)qvl.count(); i++ ) channelLb->takeItem( qvl[i] );
+
+ channelLb->setSelectionMode( QListBox::Extended );
+}
+
+bool BroadcastEditor::getChannelList()
+{
+ int i;
+ ChannelDesc *c;
+
+ for ( i=0; i<(int)chan->count(); i++ ) {
+ c = chan->at(i);
+ if ( c->fta ) {
+ if ( c->type==1 ) channelLb->insertItem( tvcPix, c->name );
+ else channelLb->insertItem( racPix, c->name );
+ }
+ else {
+ if ( c->type==1 ) channelLb->insertItem( tvPix, c->name );
+ else channelLb->insertItem( raPix, c->name );
+ }
+ }
+ return true;
+}
+
+void BroadcastEditor::resetList()
+{
+ addBtn->setEnabled( true );
+ channelLb->clear();
+ broadcastLb->clear();
+ list->clear();
+ getChannelList();
+ channelLb->sort();
+ channelLb->setSelectionMode( QListBox::Single );
+}
+
+#include "broadcasteditor.moc"
diff --git a/kaffeine/src/input/dvb/broadcasteditor.h b/kaffeine/src/input/dvb/broadcasteditor.h
new file mode 100644
index 0000000..13c619f
--- /dev/null
+++ b/kaffeine/src/input/dvb/broadcasteditor.h
@@ -0,0 +1,58 @@
+/*
+ * broadcasteditor.h
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef BROADCASTEDITOR_H
+#define BROADCASTEDITOR_H
+
+#include <qpixmap.h>
+#include <qfile.h>
+#include <qlistbox.h>
+
+#include "broadcasteditorui.h"
+#include "channeldesc.h"
+
+class BroadcastEditor : public BroadcastEditorUI
+{
+ Q_OBJECT
+
+public:
+
+ BroadcastEditor( QWidget *parent, QPtrList<ChannelDesc> *ch, QPtrList<ChannelDesc> *ret );
+ ~BroadcastEditor();
+
+ QPtrList<ChannelDesc> *chan;
+ QPtrList<ChannelDesc> *list;
+
+public slots:
+
+ virtual void addToList();
+ virtual void resetList();
+ void slotAddChannel(QListBoxItem*);
+
+private:
+
+ bool getChannelList();
+ ChannelDesc* getChannel( const QString &name );
+
+ QPixmap tvPix, raPix, tvcPix, racPix;
+
+};
+
+#endif /* BROADCASTEDITOR_H */
diff --git a/kaffeine/src/input/dvb/broadcasteditorui.ui b/kaffeine/src/input/dvb/broadcasteditorui.ui
new file mode 100644
index 0000000..034bd39
--- /dev/null
+++ b/kaffeine/src/input/dvb/broadcasteditorui.ui
@@ -0,0 +1,315 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>BroadcastEditorUI</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>BroadcastEditorUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>458</width>
+ <height>378</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Broadcasting Editor</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>11</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>Layout6</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout4</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout2</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Available channels:</string>
+ </property>
+ <property name="scaledContents">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <item>
+ <property name="text">
+ <string>New Item</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>channelLb</cstring>
+ </property>
+ <property name="columnMode">
+ <enum>FixedNumber</enum>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout1</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>addBtn</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>resetBtn</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout3</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>TextLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Broadcasting list:</string>
+ </property>
+ </widget>
+ <widget class="QListBox">
+ <item>
+ <property name="text">
+ <string>New Item</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>broadcastLb</cstring>
+ </property>
+ <property name="columnMode">
+ <enum>FixedNumber</enum>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>Line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>Layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <property name="margin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>cancelBtn</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>Spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="KPushButton">
+ <property name="name">
+ <cstring>okBtn</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>addBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>BroadcastEditorUI</receiver>
+ <slot>addToList()</slot>
+ </connection>
+ <connection>
+ <sender>resetBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>BroadcastEditorUI</receiver>
+ <slot>resetList()</slot>
+ </connection>
+ <connection>
+ <sender>cancelBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>BroadcastEditorUI</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>BroadcastEditorUI</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>channelLb</tabstop>
+ <tabstop>addBtn</tabstop>
+ <tabstop>resetBtn</tabstop>
+ <tabstop>broadcastLb</tabstop>
+ <tabstop>cancelBtn</tabstop>
+ <tabstop>okBtn</tabstop>
+</tabstops>
+<slots>
+ <slot>addToList()</slot>
+ <slot>resetList()</slot>
+</slots>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kaffeine/src/input/dvb/channeldesc.cpp b/kaffeine/src/input/dvb/channeldesc.cpp
new file mode 100644
index 0000000..5ab4acf
--- /dev/null
+++ b/kaffeine/src/input/dvb/channeldesc.cpp
@@ -0,0 +1,184 @@
+/*
+ * channeldesc.cpp
+ *
+ * Copyright (C) 2003-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <math.h>
+
+#include "channeldesc.h"
+
+AudioPid::AudioPid()
+{
+ pid=ac3=0;
+ lang="";
+}
+
+AudioPid::AudioPid( unsigned short apid )
+{
+ pid = apid;
+ ac3=0;
+ lang="";
+}
+
+AudioPid::~AudioPid()
+{
+}
+
+ChannelDesc::ChannelDesc()
+{
+ fta=sid=ttpid=vpid=pmtpid=type=0;
+ vType=0;
+ num=0;
+ name=provider=category="";
+ completed = 0;
+ tp.freq=tp.sr=0;
+ tp.pol='v';
+ maxapid=MAXAPID;
+ for ( int i=0; i<maxapid; i++ ) {
+ apid[i].pid=apid[i].ac3=0;
+ apid[i].lang="";
+ }
+ napid=0;
+ maxsubpid=MAXSUBPID;
+ for ( int i=0; i<maxsubpid; i++ ) {
+ subpid[i].pid=subpid[i].page=subpid[i].id=0;
+ subpid[i].type=0;
+ subpid[i].lang="???";
+ }
+ nsubpid=0;
+}
+
+ChannelDesc::ChannelDesc( const ChannelDesc &chan )
+{
+ num = chan.num;
+ fta = chan.fta;
+ sid = chan.sid;
+ vpid = chan.vpid;
+ vType = chan.vType;
+ pmtpid = chan.pmtpid;
+ type = chan.type;
+ ttpid = chan.ttpid;
+ name = chan.name;
+ provider = chan.provider;
+ category = chan.category;
+ completed = chan.completed;
+ tp = chan.tp;
+ maxapid = chan.maxapid;
+ for ( int i=0; i<maxapid; i++ ) {
+ apid[i] = chan.apid[i];
+ apid[i].ac3 = chan.apid[i].ac3;
+ apid[i].lang = chan.apid[i].lang;
+ }
+ napid = chan.napid;
+ maxsubpid = chan.maxsubpid;
+ for ( int i=0; i<maxsubpid; i++ ) {
+ subpid[i] = chan.subpid[i];
+ subpid[i].type = chan.subpid[i].type;
+ subpid[i].lang = chan.subpid[i].lang;
+ }
+ nsubpid = chan.nsubpid;
+}
+
+ChannelDesc::~ChannelDesc()
+{
+}
+
+Transponder::Transponder()
+{
+ source = "";
+ type = FE_QPSK;
+ freq = 0;
+ sr = 0;
+ pol = 'v';
+ nid=tsid = 0;
+ inversion=INVERSION_AUTO;
+ modulation=QAM_AUTO;
+ hierarchy=HIERARCHY_AUTO;
+ guard=GUARD_INTERVAL_AUTO;
+ transmission=TRANSMISSION_MODE_AUTO;
+ coderateL=FEC_AUTO;
+ coderateH=FEC_AUTO;
+ bandwidth=BANDWIDTH_AUTO;
+ snr = 0;
+}
+
+Transponder::Transponder( const Transponder &trans )
+{
+ source = trans.source;
+ type = trans.type;
+ freq = trans.freq;
+ sr = trans.sr;
+ pol = trans.pol;
+ tsid = trans.tsid;
+ nid = trans.nid;
+ inversion=trans.inversion;
+ modulation=trans.modulation;
+ hierarchy=trans.hierarchy;
+ guard=trans.guard;
+ transmission=trans.transmission;
+ coderateL=trans.coderateL;
+ coderateH=trans.coderateH;
+ bandwidth=trans.bandwidth;
+}
+
+bool Transponder::sameAs( Transponder *trans )
+{
+ int f1 = this->freq*1000;
+ int f2 = trans->freq*1000;
+
+ if ( fabs(f1-f2) < 2000 ) return true;
+ return false;
+}
+
+bool Transponder::operator==( const Transponder &t )
+{
+ if ( this->bandwidth==t.bandwidth
+ && this->source==t.source
+ && this->coderateH==t.coderateH
+ && this->coderateL==t.coderateL
+ && this->freq==t.freq
+ && this->guard==t.guard
+ && this->hierarchy==t.hierarchy
+ && this->inversion==t.inversion
+ && this->modulation==t.modulation
+ && this->pol==t.pol
+ && this->sr==t.sr
+ && this->transmission==t.transmission ) return true;
+ return false;
+}
+
+bool Transponder::operator!=( const Transponder &t )
+{
+ if ( this->bandwidth!=t.bandwidth
+ || this->source!=t.source
+ || this->coderateH!=t.coderateH
+ || this->coderateL!=t.coderateL
+ || this->freq!=t.freq
+ || this->guard!=t.guard
+ || this->hierarchy!=t.hierarchy
+ || this->inversion!=t.inversion
+ || this->modulation!=t.modulation
+ || this->pol!=t.pol
+ || this->sr!=t.sr
+ || this->transmission!=t.transmission ) return true;
+ return false;
+}
+
+Transponder::~Transponder()
+{
+}
diff --git a/kaffeine/src/input/dvb/channeldesc.h b/kaffeine/src/input/dvb/channeldesc.h
new file mode 100644
index 0000000..f4bc1ab
--- /dev/null
+++ b/kaffeine/src/input/dvb/channeldesc.h
@@ -0,0 +1,137 @@
+/*
+ * channeldesc.h
+ *
+ * Copyright (C) 2003-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CHANNELDESC_H
+#define CHANNELDESC_H
+
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qdatetime.h>
+#include <qvaluelist.h>
+#include <qpixmap.h>
+
+#include <linux/dvb/frontend.h>
+
+#include "kaffeinedvbevents.h"
+
+#define MAXAPID 20
+#define MAXSUBPID 10
+
+class RecTimer
+{
+
+public:
+
+ QString name;
+ QString fullPath;
+ QString channel;
+ QDateTime begin;
+ QTime duration;
+ char running;
+ int mode;
+};
+
+class AudioPid
+{
+
+public:
+
+ AudioPid();
+ AudioPid( unsigned short apid );
+ ~AudioPid();
+
+ unsigned short pid;
+ QString lang;
+ char ac3;
+};
+
+class SubPid
+{
+
+public:
+
+ unsigned short pid, page, id;
+ unsigned char type;
+ QString lang;
+};
+
+class Transponder
+{
+
+public:
+
+ Transponder();
+ Transponder( const Transponder &trans ); //copy
+ ~Transponder();
+ bool sameAs( Transponder *trans );
+ bool operator==( const Transponder &t );
+ bool operator!=( const Transponder &t );
+
+ QString source;
+ fe_type_t type; // S, C or T
+ unsigned long freq;
+ QValueList<unsigned long> freqlist;
+ char pol;
+ unsigned long sr;
+ unsigned short nid;
+ unsigned short tsid;
+ fe_spectral_inversion_t inversion;
+ fe_modulation_t modulation;
+ fe_hierarchy_t hierarchy;
+ fe_guard_interval_t guard;
+ fe_transmit_mode_t transmission;
+ fe_code_rate_t coderateL;
+ fe_code_rate_t coderateH;
+ fe_bandwidth_t bandwidth;
+ int snr;
+};
+
+class ChannelDesc
+{
+
+public:
+
+ ChannelDesc();
+ ChannelDesc( const ChannelDesc &chan ); //copy
+ ~ChannelDesc();
+
+ QString provider;
+ QString name;
+ QString category;
+ unsigned int num;
+ unsigned short sid;
+ unsigned short vpid;
+ unsigned char vType; // video stream type
+ AudioPid apid[MAXAPID];
+ char napid;
+ char maxapid;
+ unsigned short ttpid;
+ SubPid subpid[MAXSUBPID];
+ char nsubpid;
+ char maxsubpid;
+ unsigned short pmtpid;
+ unsigned char fta; // 0 for free
+ unsigned char type; // 1 for TV , 2 for RA
+ int completed;
+ Transponder tp;
+ QPixmap pix;
+};
+
+#endif /* CHANNELDESC_H */
diff --git a/kaffeine/src/input/dvb/channeleditor.cpp b/kaffeine/src/input/dvb/channeleditor.cpp
new file mode 100644
index 0000000..6b04fe4
--- /dev/null
+++ b/kaffeine/src/input/dvb/channeleditor.cpp
@@ -0,0 +1,330 @@
+/*
+ * channeleditor.cpp
+ *
+ * Copyright (C) 2004-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qbuttongroup.h>
+#include <qradiobutton.h>
+#include <qspinbox.h>
+#include <qcombobox.h>
+#include <qcheckbox.h>
+#include <qgroupbox.h>
+#include <qlineedit.h>
+#include <qpushbutton.h>
+
+#include <klocale.h>
+#include <kmessagebox.h>
+
+#include "channeleditor.h"
+#include "audioeditor.h"
+#include "subeditor.h"
+
+ChannelEditor::ChannelEditor( QStringList src, bool m, ChannelDesc *chan, QPtrList<ChannelDesc> *cdesc, QWidget *parent ) : ChannelEditorUI( parent )
+{
+ int i;
+ channel = chan;
+ mode = m;
+ chandesc = cdesc;
+ orgName = channel->name;
+
+ sourceComb->insertStringList( src );
+ for ( i=0; i<(int)sourceComb->count(); i++ ) {
+ if ( sourceComb->text(i)==channel->tp.source ) {
+ sourceComb->setCurrentItem(i);
+ break;
+ }
+ }
+
+ if ( channel->tp.type==FE_QAM ) initC();
+ else if ( channel->tp.type==FE_OFDM ) initT();
+ else if ( channel->tp.type==FE_QPSK ) initS();
+ else initA();
+
+ if ( mode ) {
+ ftaCb->setEnabled( false );
+ pidsGroup->setEnabled( false );
+ numSpin->setEnabled( false );
+ setCaption( i18n("Initial Transponder Settings") );
+ }
+ else {
+ numSpin->setMinValue( 1 );
+ numSpin->setMaxValue( chandesc->count() );
+ chanNum = channel->num;
+ numSpin->setValue( channel->num );
+ sidSpin->setValue( channel->sid );
+ vpidSpin->setValue( channel->vpid );
+ ttpidSpin->setValue( channel->ttpid );
+ tsidSpin->setValue( channel->tp.tsid );
+ nidSpin->setValue( channel->tp.nid );
+ ftaCb->setChecked( channel->fta );
+ }
+ nameLe->setText( channel->name );
+
+ connect( apidBtn, SIGNAL(clicked()), this, SLOT(editAudio()) );
+ connect( subpidBtn, SIGNAL(clicked()), this, SLOT(editSubtitle()) );
+}
+
+void ChannelEditor::editAudio()
+{
+ AudioEditor dlg( channel, this );
+
+ dlg.exec();
+}
+
+void ChannelEditor::editSubtitle()
+{
+ SubEditor dlg( channel, this );
+
+ dlg.exec();
+}
+
+void ChannelEditor::accept()
+{
+ int ret, i;
+ QString name;
+
+ name = nameLe->text().stripWhiteSpace();
+ if ( name.isEmpty() ) {
+ KMessageBox::sorry( this, i18n("You must give it a name!") );
+ return;
+ }
+
+ if ( !mode ) {
+ for ( ret=0; ret<(int)chandesc->count(); ret++ ) {
+ if ( (channel->name==chandesc->at(ret)->name) && (channel->name!=orgName) ) {
+ KMessageBox::sorry( this, i18n("This name is not unique.") );
+ return;
+ }
+ }
+ if ( ftaCb->isChecked() ) channel->fta = 1;
+ else channel->fta = 0;
+ channel->vpid = vpidSpin->value();
+ channel->sid = sidSpin->value();
+ channel->ttpid = ttpidSpin->value();
+ channel->tp.tsid = tsidSpin->value();
+ channel->tp.nid = nidSpin->value();
+ if ( !channel->napid ) {
+ KMessageBox::sorry( this, i18n("Missing audio pid(s)!") );
+ return;
+ }
+ if ( numSpin->value()!=chanNum ) {
+ for ( i=0; i<(int)chandesc->count(); i++ ) {
+ if ( (int)chandesc->at(i)->num==numSpin->value() ) {
+ chandesc->at(i)->num = chanNum;
+ break;
+ }
+ }
+ }
+ channel->num = numSpin->value();
+ if ( channel->vpid ) channel->type = 1;
+ else channel->type = 2;
+ }
+ channel->name = name;
+ channel->tp.source = sourceComb->currentText();
+ if ( channel->tp.type==FE_QPSK ) {
+ channel->tp.freq = freqSpin->value();
+ channel->tp.sr = srSpin->value();
+ if ( verticalRadio->isChecked() ) channel->tp.pol = 'v';
+ else channel->tp.pol = 'h';
+ channel->tp.coderateH = (fe_code_rate_t)(FEC_NONE+coderateHComb->currentItem());
+ channel->tp.inversion = (fe_spectral_inversion_t)(INVERSION_OFF+inversionComb->currentItem());
+ }
+ else if ( channel->tp.type==FE_QAM ) {
+ channel->tp.freq = freqSpin->value();
+ channel->tp.sr = srSpin->value();
+ channel->tp.coderateH = (fe_code_rate_t)(FEC_NONE+coderateHComb->currentItem());
+ channel->tp.inversion = (fe_spectral_inversion_t)(INVERSION_OFF+inversionComb->currentItem());
+ channel->tp.modulation = (fe_modulation_t)(QPSK+modulationComb->currentItem());
+ }
+ else if ( channel->tp.type==FE_OFDM ) {
+ channel->tp.freq = freqSpin->value();
+ channel->tp.inversion = (fe_spectral_inversion_t)(INVERSION_OFF+inversionComb->currentItem());
+ channel->tp.coderateH = (fe_code_rate_t)(FEC_NONE+coderateHComb->currentItem());
+ channel->tp.coderateL = (fe_code_rate_t)(FEC_NONE+coderateLComb->currentItem());
+ channel->tp.modulation = (fe_modulation_t)(QPSK+modulationComb->currentItem());
+ channel->tp.transmission = (fe_transmit_mode_t)(TRANSMISSION_MODE_2K+transmissionComb->currentItem());
+ channel->tp.bandwidth = (fe_bandwidth_t)(BANDWIDTH_8_MHZ+bandwidthComb->currentItem());
+ channel->tp.hierarchy = (fe_hierarchy_t)(HIERARCHY_NONE+hierarchyComb->currentItem());
+ channel->tp.guard = (fe_guard_interval_t)(GUARD_INTERVAL_1_32+guardComb->currentItem());
+ }
+ else {
+ channel->tp.freq = freqSpin->value();
+ channel->tp.inversion = (fe_spectral_inversion_t)(INVERSION_OFF+inversionComb->currentItem());
+ switch (modulationComb->currentItem()) {
+ case 0: channel->tp.modulation = QAM_64; break;
+ case 1: channel->tp.modulation = QAM_256; break;
+ case 2: channel->tp.modulation = VSB_8; break;
+ case 3: channel->tp.modulation = VSB_16; break;
+ default: channel->tp.modulation = QAM_AUTO; break;
+ }
+ }
+
+ done( Accepted );
+}
+
+void ChannelEditor::initS()
+{
+ freqSpin->setValue( channel->tp.freq );
+ srSpin->setValue( channel->tp.sr );
+ if ( channel->tp.pol=='v' ) polGroup->setButton( 0 ) ;
+ else polGroup->setButton( 1 ) ;
+ inversionComb->insertStringList( inversionList() );
+ inversionComb->setCurrentItem( INVERSION_OFF+channel->tp.inversion );
+ coderateHComb->insertStringList( coderateList() );
+ coderateHComb->setCurrentItem( FEC_NONE+channel->tp.coderateH );
+ transmissionComb->setEnabled( false );
+ coderateLComb->setEnabled( false );
+ bandwidthComb->setEnabled( false );
+ modulationComb->setEnabled( false );
+ hierarchyComb->setEnabled( false );
+ guardComb->setEnabled( false );
+}
+
+void ChannelEditor::initC()
+{
+ freqSpin->setValue( channel->tp.freq );
+ srSpin->setValue( channel->tp.sr );
+ inversionComb->insertStringList( inversionList() );
+ inversionComb->setCurrentItem( INVERSION_OFF+channel->tp.inversion );
+ coderateHComb->insertStringList( coderateList() );
+ coderateHComb->setCurrentItem( FEC_NONE+channel->tp.coderateH );
+ modulationComb->insertStringList( modulationList() );
+ modulationComb->setCurrentItem( QPSK+channel->tp.modulation );
+ polGroup->setEnabled( false );
+ transmissionComb->setEnabled( false );
+ coderateLComb->setEnabled( false );
+ bandwidthComb->setEnabled( false );
+ hierarchyComb->setEnabled( false );
+ guardComb->setEnabled( false );
+}
+
+void ChannelEditor::initT()
+{
+ freqSpin->setValue( channel->tp.freq );
+ inversionComb->insertStringList( inversionList() );
+ inversionComb->setCurrentItem( INVERSION_OFF+channel->tp.inversion );
+ coderateHComb->insertStringList( coderateList() );
+ coderateHComb->setCurrentItem( FEC_NONE+channel->tp.coderateH );
+ coderateLComb->insertStringList( coderateList() );
+ coderateLComb->setCurrentItem( FEC_NONE+channel->tp.coderateL );
+ modulationComb->insertStringList( modulationList() );
+ modulationComb->setCurrentItem( QPSK+channel->tp.modulation );
+ transmissionComb->insertStringList( transmissionList() );
+ transmissionComb->setCurrentItem( TRANSMISSION_MODE_2K+channel->tp.transmission );
+ bandwidthComb->insertStringList( bandwidthList() );
+ bandwidthComb->setCurrentItem( BANDWIDTH_8_MHZ+channel->tp.bandwidth );
+ hierarchyComb->insertStringList( hierarchyList() );
+ hierarchyComb->setCurrentItem( HIERARCHY_NONE+channel->tp.hierarchy );
+ guardComb->insertStringList( guardList() );
+ guardComb->setCurrentItem( GUARD_INTERVAL_1_32+channel->tp.guard );
+ srSpin->setEnabled( false );
+ polGroup->setEnabled( false );
+}
+
+void ChannelEditor::initA()
+{
+ freqSpin->setValue( channel->tp.freq );
+ inversionComb->insertStringList( inversionList() );
+ inversionComb->setCurrentItem( INVERSION_OFF+channel->tp.inversion );
+ modulationComb->insertStringList( modulationListAtsc() );
+ switch (channel->tp.modulation) {
+ case QAM_64: modulationComb->setCurrentItem(0); break;
+ case QAM_256: modulationComb->setCurrentItem(1); break;
+ case VSB_8: modulationComb->setCurrentItem(2); break;
+ case VSB_16: modulationComb->setCurrentItem(3); break;
+ default: modulationComb->setCurrentItem(4); break;
+ }
+ srSpin->setEnabled( false );
+ polGroup->setEnabled( false );
+ transmissionComb->setEnabled( false );
+ coderateHComb->setEnabled( false );
+ coderateLComb->setEnabled( false );
+ bandwidthComb->setEnabled( false );
+ hierarchyComb->setEnabled( false );
+ guardComb->setEnabled( false );
+}
+
+QStringList ChannelEditor::inversionList()
+{
+ QStringList list;
+
+ list<<"OFF"<<"ON"<<"AUTO";
+ return list;
+}
+
+QStringList ChannelEditor::coderateList()
+{
+ QStringList list;
+
+ list<<"NONE"<<"1/2"<<"2/3"<<"3/4"<<"4/5"<<"5/6"<<"6/7"<<"7/8"<<"8/9"<<"AUTO";
+ return list;
+}
+
+QStringList ChannelEditor::modulationList()
+{
+ QStringList list;
+
+ list<<"QPSK"<<"QAM 16"<<"QAM 32"<<"QAM 64"<<"QAM 128"<<"QAM 256"<<"AUTO";
+ return list;
+}
+
+QStringList ChannelEditor::modulationListAtsc()
+{
+ QStringList list;
+
+ list<<"QAM 64"<<"QAM 256"<<"VSB 8"<<"VSB 16"<<"AUTO";
+ return list;
+}
+
+QStringList ChannelEditor::transmissionList()
+{
+ QStringList list;
+
+ list<<"2K"<<"8K"<<"AUTO";
+ return list;
+}
+
+QStringList ChannelEditor::bandwidthList()
+{
+ QStringList list;
+
+ list<<"8 MHz"<<"7 MHz"<<"6 MHz"<<"AUTO";
+ return list;
+}
+
+QStringList ChannelEditor::hierarchyList()
+{
+ QStringList list;
+
+ list<<"NONE"<<"1"<<"2"<<"4"<<"AUTO";
+ return list;
+}
+
+QStringList ChannelEditor::guardList()
+{
+ QStringList list;
+
+ list<<"1/32"<<"1/16"<<"1/8"<<"1/4"<<"AUTO";
+ return list;
+}
+
+ChannelEditor::~ChannelEditor()
+{
+}
+
+#include "channeleditor.moc"
diff --git a/kaffeine/src/input/dvb/channeleditor.h b/kaffeine/src/input/dvb/channeleditor.h
new file mode 100644
index 0000000..6a3b3f8
--- /dev/null
+++ b/kaffeine/src/input/dvb/channeleditor.h
@@ -0,0 +1,70 @@
+/*
+ * channeleditor.h
+ *
+ * Copyright (C) 2004-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CHANNELEDITOR_H
+#define CHANNELEDITOR_H
+
+#include <qstringlist.h>
+
+#include "channeleditorui.h"
+#include "channeldesc.h"
+
+class ChannelEditor : public ChannelEditorUI
+{
+ Q_OBJECT
+
+public:
+
+ ChannelEditor( QStringList src, bool m, ChannelDesc *chan, QPtrList<ChannelDesc> *cdesc, QWidget *parent );
+ ~ChannelEditor();
+
+protected:
+
+ virtual void accept();
+
+private slots:
+
+ void editAudio();
+ void editSubtitle();
+
+private:
+
+ void initS();
+ void initC();
+ void initT();
+ void initA();
+ QStringList inversionList();
+ QStringList coderateList();
+ QStringList modulationList();
+ QStringList modulationListAtsc();
+ QStringList transmissionList();
+ QStringList bandwidthList();
+ QStringList hierarchyList();
+ QStringList guardList();
+
+ ChannelDesc *channel;
+ QPtrList<ChannelDesc> *chandesc;
+ bool mode;
+ QString orgName;
+ int chanNum;
+
+};
+
+#endif /* CHANNELEDITOR_H */
diff --git a/kaffeine/src/input/dvb/channeleditorui.ui b/kaffeine/src/input/dvb/channeleditorui.ui
new file mode 100644
index 0000000..5b75f18
--- /dev/null
+++ b/kaffeine/src/input/dvb/channeleditorui.ui
@@ -0,0 +1,704 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ChannelEditorUI</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ChannelEditorUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>477</width>
+ <height>533</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Channel Editor</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="Line" row="1" column="0">
+ <property name="name">
+ <cstring>line2</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1_4</cstring>
+ </property>
+ <property name="text">
+ <string>Source:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>sourceComb</cstring>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout5</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Name:</string>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>nameLe</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2_2</cstring>
+ </property>
+ <property name="text">
+ <string>Nr:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>numSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>99999</number>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout6</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>freqGroup</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>polGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Polarity</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton" row="0" column="0">
+ <property name="name">
+ <cstring>verticalRadio</cstring>
+ </property>
+ <property name="text">
+ <string>Vertical</string>
+ </property>
+ </widget>
+ <widget class="QRadioButton" row="0" column="1">
+ <property name="name">
+ <cstring>horizontalRadio</cstring>
+ </property>
+ <property name="text">
+ <string>Horizontal</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Frequency:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Symbol rate:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>srSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>99999</number>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>freqSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>999999</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>ftaCb</cstring>
+ </property>
+ <property name="text">
+ <string>Scrambled</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>pidsGroup</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox" row="1" column="1">
+ <property name="name">
+ <cstring>tsidSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="4" column="1">
+ <property name="name">
+ <cstring>ttpidSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>8191</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel12</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Service ID:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel2_3</cstring>
+ </property>
+ <property name="text">
+ <string>Network ID:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="4" column="0">
+ <property name="name">
+ <cstring>textLabel15</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Teletext PID:</string>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="3" column="1">
+ <property name="name">
+ <cstring>vpidSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>8191</number>
+ </property>
+ <property name="minValue">
+ <number>0</number>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="2" column="1">
+ <property name="name">
+ <cstring>sidSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ </widget>
+ <widget class="QSpinBox" row="0" column="1">
+ <property name="name">
+ <cstring>nidSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>65535</number>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel13</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Video PID:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel1_2</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Transport stream ID:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>subpidBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Subtitle PIDs...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>apidBtn</cstring>
+ </property>
+ <property name="focusPolicy">
+ <enum>TabFocus</enum>
+ </property>
+ <property name="text">
+ <string>Audio PIDs...</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>extendedGroup</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox" row="0" column="1">
+ <property name="name">
+ <cstring>transmissionComb</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="0">
+ <property name="name">
+ <cstring>textLabel11</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Bandwidth:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="0">
+ <property name="name">
+ <cstring>textLabel10</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>FEC high:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="0">
+ <property name="name">
+ <cstring>textLabel8</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Transmission:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="1">
+ <property name="name">
+ <cstring>bandwidthComb</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="1">
+ <property name="name">
+ <cstring>coderateHComb</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="1">
+ <property name="name">
+ <cstring>coderateLComb</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="0">
+ <property name="name">
+ <cstring>textLabel9</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>FEC low:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="3">
+ <property name="name">
+ <cstring>guardComb</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="3" column="2">
+ <property name="name">
+ <cstring>textLabel7</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Guard interval:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="2" column="3">
+ <property name="name">
+ <cstring>hierarchyComb</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="2" column="2">
+ <property name="name">
+ <cstring>textLabel6</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Hierarchy:</string>
+ </property>
+ </widget>
+ <widget class="QLabel" row="1" column="2">
+ <property name="name">
+ <cstring>textLabel5</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Modulation:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="1" column="3">
+ <property name="name">
+ <cstring>modulationComb</cstring>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="0" column="3">
+ <property name="name">
+ <cstring>inversionComb</cstring>
+ </property>
+ </widget>
+ <widget class="QLabel" row="0" column="2">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>5</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Inversion:</string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>98</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout14</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;OK</string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>150</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>cancelBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>ChannelEditorUI</receiver>
+ <slot>accept()</slot>
+ </connection>
+ <connection>
+ <sender>cancelBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>ChannelEditorUI</receiver>
+ <slot>reject()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>nameLe</tabstop>
+ <tabstop>numSpin</tabstop>
+ <tabstop>freqSpin</tabstop>
+ <tabstop>srSpin</tabstop>
+ <tabstop>verticalRadio</tabstop>
+ <tabstop>horizontalRadio</tabstop>
+ <tabstop>ftaCb</tabstop>
+ <tabstop>tsidSpin</tabstop>
+ <tabstop>sidSpin</tabstop>
+ <tabstop>vpidSpin</tabstop>
+ <tabstop>ttpidSpin</tabstop>
+ <tabstop>apidBtn</tabstop>
+ <tabstop>transmissionComb</tabstop>
+ <tabstop>coderateLComb</tabstop>
+ <tabstop>coderateHComb</tabstop>
+ <tabstop>bandwidthComb</tabstop>
+ <tabstop>inversionComb</tabstop>
+ <tabstop>modulationComb</tabstop>
+ <tabstop>hierarchyComb</tabstop>
+ <tabstop>guardComb</tabstop>
+ <tabstop>cancelBtn</tabstop>
+ <tabstop>okBtn</tabstop>
+ <tabstop>sourceComb</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kaffeine/src/input/dvb/cleaner.cpp b/kaffeine/src/input/dvb/cleaner.cpp
new file mode 100644
index 0000000..8214bc9
--- /dev/null
+++ b/kaffeine/src/input/dvb/cleaner.cpp
@@ -0,0 +1,82 @@
+/*
+ * cleaner.cpp
+ *
+ * Copyright (C) 2005-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <sys/statvfs.h>
+
+#include <qdir.h>
+#include <qstringlist.h>
+#include <qptrlist.h>
+#include <qfileinfo.h>
+
+#include "cleaner.h"
+
+Cleaner::Cleaner( const QString &lpath, const QString &rpath )
+{
+ setPaths( lpath, rpath );
+
+ connect( &timer, SIGNAL(timeout()), this, SLOT(doClean()) );
+ timer.start( 60*1000 );
+}
+
+Cleaner::~Cleaner()
+{
+ wait();
+}
+
+void Cleaner::doClean()
+{
+ start(IdlePriority);
+}
+
+void Cleaner::setPaths( const QString &lpath, const QString &rpath )
+{
+ livePath = lpath;
+ recordPath = rpath;
+}
+
+void Cleaner::run()
+{
+ QStringList list;
+ QDir d;
+ double freemb;
+ struct statvfs buf;
+
+ d.setPath( livePath );
+ list = d.entryList( "DVBLive-*", QDir::Files, QDir::Name );
+ if ( list.count()>1 ) d.remove( list[0] );
+
+
+ if ( statvfs( recordPath.local8Bit(), &buf ) ) {
+ fprintf(stderr,"Couldn't get file system statistics\n");
+ return;
+ }
+
+ freemb = (double)(((double)(buf.f_bavail)*(double)(buf.f_bsize))/(1024.0*1024.0));
+ if ( freemb<1000 ) {
+ d.setPath( recordPath );
+ const QFileInfoList *infos = d.entryInfoList( "*.m2t", QDir::Files|QDir::NoSymLinks|QDir::Writable, QDir::Time|QDir::Reversed );
+ QFileInfoListIterator it( *infos );
+ QFileInfo *i;
+ /*if ( ( i=it.current() )!=0 )
+ d.remove( i->absFilePath() );*/
+ }
+}
+
+#include "cleaner.moc"
diff --git a/kaffeine/src/input/dvb/cleaner.h b/kaffeine/src/input/dvb/cleaner.h
new file mode 100644
index 0000000..215af32
--- /dev/null
+++ b/kaffeine/src/input/dvb/cleaner.h
@@ -0,0 +1,54 @@
+/*
+ * cleaner.h
+ *
+ * Copyright (C) 2005-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CLEANER_H
+#define CLEANER_H
+
+#include <qobject.h>
+#include <qthread.h>
+#include <qstring.h>
+#include <qtimer.h>
+
+class Cleaner : public QObject, public QThread
+{
+
+ Q_OBJECT
+
+public:
+
+ Cleaner( const QString &lpath, const QString &rpath );
+ ~Cleaner();
+ void setPaths( const QString &lpath, const QString &rpath );
+
+protected:
+
+ virtual void run();
+
+private slots:
+
+ void doClean();
+
+private:
+
+ QTimer timer;
+ QString livePath, recordPath;
+};
+
+#endif /* CLEANER_H */
diff --git a/kaffeine/src/input/dvb/crontimer.cpp b/kaffeine/src/input/dvb/crontimer.cpp
new file mode 100644
index 0000000..00078ea
--- /dev/null
+++ b/kaffeine/src/input/dvb/crontimer.cpp
@@ -0,0 +1,109 @@
+/*
+ * crontimer.cpp
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <kmessagebox.h>
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kpushbutton.h>
+
+#include "crontimer.h"
+
+CronTimer::CronTimer( int m, QWidget *parent ) : CronTimerUI( parent )
+{
+ connect( cronBtnGrp, SIGNAL(clicked(int)), this, SLOT(modeSelected(int)) );
+ mode = m;
+ switch ( mode ) {
+ case Noone : cronBtnGrp->setButton( 0 ); break;
+ case Daily : cronBtnGrp->setButton( 1 ); break;
+ case Weekly : cronBtnGrp->setButton( 2 ); break;
+ case Monthly : cronBtnGrp->setButton( 3 ); break;
+ default : cronBtnGrp->setButton( 4 );
+ }
+ if ( mode>Monthly ) {
+ daysGb->setEnabled( true );
+ if ( mode&Monday ) monCb->setChecked( true );
+ if ( mode&Tuesday ) tueCb->setChecked( true );
+ if ( mode&Wednesday ) wedCb->setChecked( true );
+ if ( mode&Thursday ) thuCb->setChecked( true );
+ if ( mode&Friday ) friCb->setChecked( true );
+ if ( mode&Saturday ) satCb->setChecked( true );
+ if ( mode&Sunday ) sunCb->setChecked( true );
+ }
+ else
+ daysGb->setEnabled( false );
+
+ KIconLoader *icon = new KIconLoader();
+ cancelBtn->setGuiItem( KGuiItem(i18n("Cancel"), icon->loadIconSet("cancel", KIcon::Small) ) );
+ okBtn->setGuiItem( KGuiItem(i18n("OK"), icon->loadIconSet("ok", KIcon::Small) ) );
+ delete icon;
+}
+
+
+
+CronTimer::~CronTimer()
+{
+}
+
+
+
+int CronTimer::getMode() const
+{
+ return mode;
+}
+
+
+
+void CronTimer::modeSelected( int id )
+{
+ if ( id==4 )
+ daysGb->setEnabled( true );
+ else
+ daysGb->setEnabled( false );
+}
+
+
+
+void CronTimer::accept()
+{
+ switch ( cronBtnGrp->selectedId() ) {
+ case 0 : mode = Noone; break;
+ case 1 : mode = Daily; break;
+ case 2 : mode = Weekly; break;
+ case 3 : mode = Monthly; break;
+ case 4 : {
+ mode = Custom;
+ if ( monCb->isChecked() ) mode+=Monday;
+ if ( tueCb->isChecked() ) mode+=Tuesday;
+ if ( wedCb->isChecked() ) mode+=Wednesday;
+ if ( thuCb->isChecked() ) mode+=Thursday;
+ if ( friCb->isChecked() ) mode+=Friday;
+ if ( satCb->isChecked() ) mode+=Saturday;
+ if ( sunCb->isChecked() ) mode+=Sunday;
+ if ( mode<Monday ) {
+ KMessageBox::sorry( this, i18n("You have to choose some days.") );
+ return;
+ }
+ }
+ }
+
+ done( Accepted );
+}
+
+#include "crontimer.moc"
diff --git a/kaffeine/src/input/dvb/crontimer.h b/kaffeine/src/input/dvb/crontimer.h
new file mode 100644
index 0000000..bb079bd
--- /dev/null
+++ b/kaffeine/src/input/dvb/crontimer.h
@@ -0,0 +1,58 @@
+/*
+ * crontimer.h
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CRONTIMER_H
+#define CRONTIMER_H
+
+#include <qwidget.h>
+#include <qbuttongroup.h>
+#include <qcheckbox.h>
+#include <qradiobutton.h>
+
+#include "crontimerui.h"
+
+class CronTimer : public CronTimerUI
+{
+
+ Q_OBJECT
+
+public:
+
+ CronTimer( int m, QWidget *parent );
+ ~CronTimer();
+ int getMode() const;
+
+ enum Type { Noone=0, Daily=1, Weekly=2, Monthly=4, Custom=8, Monday=16, Tuesday=32, Wednesday=64, Thursday=128, Friday=256, Saturday=512, Sunday=1024 };
+
+protected:
+
+ virtual void accept();
+
+private slots:
+
+ void modeSelected( int id );
+
+private:
+
+ int mode;
+
+};
+
+#endif /* CRONTIMER_H */
diff --git a/kaffeine/src/input/dvb/crontimerui.ui b/kaffeine/src/input/dvb/crontimerui.ui
new file mode 100644
index 0000000..1a70361
--- /dev/null
+++ b/kaffeine/src/input/dvb/crontimerui.ui
@@ -0,0 +1,354 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>CronTimerUI</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>CronTimerUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>317</width>
+ <height>288</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Repeated Timer</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout12</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer5</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>32</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QButtonGroup">
+ <property name="name">
+ <cstring>cronBtnGrp</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>noneRad</cstring>
+ </property>
+ <property name="text">
+ <string>None</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>0</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>dailyRad</cstring>
+ </property>
+ <property name="text">
+ <string>Daily</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>1</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>weeklyRad</cstring>
+ </property>
+ <property name="text">
+ <string>Weekly</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>2</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>mnthlyRad</cstring>
+ </property>
+ <property name="text">
+ <string>Monthly</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>3</number>
+ </property>
+ </widget>
+ <widget class="QRadioButton">
+ <property name="name">
+ <cstring>customRad</cstring>
+ </property>
+ <property name="text">
+ <string>Custom</string>
+ </property>
+ <property name="buttonGroupId">
+ <number>4</number>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer2</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>67</height>
+ </size>
+ </property>
+ </spacer>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer3</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>39</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>daysGb</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>monCb</cstring>
+ </property>
+ <property name="text">
+ <string>Monday</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>tueCb</cstring>
+ </property>
+ <property name="text">
+ <string>Tuesday</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>wedCb</cstring>
+ </property>
+ <property name="text">
+ <string>Wednesday</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>thuCb</cstring>
+ </property>
+ <property name="text">
+ <string>Thursday</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>friCb</cstring>
+ </property>
+ <property name="text">
+ <string>Friday</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>satCb</cstring>
+ </property>
+ <property name="text">
+ <string>Saturday</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>sunCb</cstring>
+ </property>
+ <property name="text">
+ <string>Sunday</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>32</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer6</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>95</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="KPushButton" row="1" column="0">
+ <property name="name">
+ <cstring>cancelBtn</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ <spacer row="1" column="1">
+ <property name="name">
+ <cstring>spacer1</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>177</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="Line" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="KPushButton" row="1" column="2">
+ <property name="name">
+ <cstring>okBtn</cstring>
+ </property>
+ <property name="text">
+ <string></string>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<customwidgets>
+</customwidgets>
+<connections>
+ <connection>
+ <sender>cancelBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>CronTimerUI</receiver>
+ <slot>reject()</slot>
+ </connection>
+ <connection>
+ <sender>okBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>CronTimerUI</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<layoutdefaults spacing="6" margin="11"/>
+<includehints>
+ <includehint>kpushbutton.h</includehint>
+ <includehint>kpushbutton.h</includehint>
+</includehints>
+</UI>
diff --git a/kaffeine/src/input/dvb/dvbcam.cpp b/kaffeine/src/input/dvb/dvbcam.cpp
new file mode 100644
index 0000000..1cb5b86
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbcam.cpp
@@ -0,0 +1,926 @@
+/*
+ * dvbcam.cpp
+ *
+ * Copyright (C) 2006 Christoph Pfister <christophpfister@gmail.com>
+ *
+ * code based on ca_zap (LGPL)
+ * Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ * Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/poll.h>
+#include <linux/dvb/ca.h>
+
+#include <libdvbapi/dvbca.h>
+#include <libdvbapi/dvbdemux.h>
+#include <libdvben50221/en50221_app_ai.h>
+#include <libdvben50221/en50221_app_ca.h>
+#include <libdvben50221/en50221_app_rm.h>
+#include <libdvben50221/en50221_app_tags.h>
+#include <libdvben50221/en50221_session.h>
+#include <libucsi/mpeg/section.h>
+
+#include <qthread.h>
+#include <qstring.h>
+
+#include "dvbcam.h"
+
+class DvbCamCamHandler
+{
+public:
+ virtual ~DvbCamCamHandler();
+
+ bool init();
+
+ virtual void poll() = 0;
+ virtual bool registerCam(int ca_fd, uint8_t slot) = 0;
+
+ bool sendPmt(char *pmt_buffer, int size);
+
+protected:
+ DvbCamCamHandler();
+
+ static int infoCallback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t ca_id_count, uint16_t *ca_ids);
+
+ virtual bool sub_init() = 0;
+
+ void *AiResource;
+ void *CaResource;
+ en50221_app_send_functions SendFuncs;
+
+ volatile int SessionNumber;
+};
+
+class DvbCamCamThread : protected QThread
+{
+public:
+ DvbCamCamThread(int adapter, int ca_device, int ci_type);
+ ~DvbCamCamThread();
+
+ void start();
+ void stop();
+ void wait();
+
+ bool processPmt(int demux_fd);
+
+private:
+ void run();
+
+ int Adapter;
+ int CaDevice;
+ int ciType;
+
+ DvbCamCamHandler *CamHandler;
+
+ char PmtBuffer[4096]; // we imply that processPmt is only once called
+
+ volatile int PmtSize; // PmtSize <= 0 means PmtBuffer invalid
+ volatile bool Stopped;
+};
+
+class DvbCamPmtThread : protected QThread
+{
+public:
+ DvbCamPmtThread(DvbCamCamThread *cam_thread, int adapter, int demux_device, int service_id);
+ ~DvbCamPmtThread();
+
+ void start();
+ void stop();
+ void wait();
+
+private:
+ int createSectionFilter(uint16_t pid, uint8_t table_id);
+ int processPat(int demux_fd);
+ void run();
+
+ DvbCamCamThread *CamThread;
+ int Adapter;
+ int DemuxDevice;
+ int ServiceId;
+
+ volatile bool Stopped;
+};
+
+class DvbCamCamHandlerLLCI : public DvbCamCamHandler
+{
+public:
+ DvbCamCamHandlerLLCI();
+ ~DvbCamCamHandlerLLCI();
+
+private:
+ struct SlResource
+ {
+ en50221_app_public_resource_id resid;
+ uint32_t binary_resource_id;
+ en50221_sl_resource_callback callback;
+ void *arg;
+ };
+
+ static int llci_rm_enq_callback(void *arg, uint8_t slot_id, uint16_t session_number);
+ static int llci_rm_reply_callback(void *arg, uint8_t slot_id, uint16_t session_number, uint32_t resource_id_count, uint32_t *resource_ids);
+ static int llci_rm_changed_callback(void *arg, uint8_t slot_id, uint16_t session_number);
+ static int llci_lookup_callback(void *arg, uint8_t slot_id, uint32_t requested_resource_id, en50221_sl_resource_callback *callback_out, void **arg_out, uint32_t *connected_resource_id);
+ static int llci_session_callback(void *arg, int reason, uint8_t slot_id, uint16_t session_number, uint32_t resource_id);
+
+ void poll();
+ bool registerCam(int ca_fd, uint8_t slot);
+ bool sub_init();
+
+ void *RmResource;
+ void *SessionLayer;
+ void *TransportLayer;
+
+ SlResource Resources[3];
+};
+
+class DvbCamCamHandlerHLCI : public DvbCamCamHandler
+{
+public:
+ DvbCamCamHandlerHLCI();
+ ~DvbCamCamHandlerHLCI();
+
+private:
+ static int hlci_send_data(void *arg, uint16_t session_number, uint8_t *data, uint16_t data_length);
+ static int hlci_send_datav(void *arg, uint16_t session_number, iovec *vector, int iov_count);
+
+ void poll();
+ bool registerCam(int ca_fd, uint8_t slot);
+ bool sub_init();
+};
+
+// class DvbCam
+
+DvbCam::DvbCam(int adapter, int ca_device, int demux_device, int ci_type)
+{
+ Adapter = adapter;
+ CaDevice = ca_device;
+ DemuxDevice = demux_device;
+ ciType = ci_type;
+
+ isRunning = false;
+
+ CamThread = NULL;
+ PmtThread = NULL;
+
+ // at that time, we do reset in cam_thread
+ /*if ( ciType!=CA_CI ) { //do not reset HLCI
+ int ca_fd = dvbca_open( Adapter, CaDevice );
+ if(ca_fd < 0) // should not happen
+ fprintf(stderr, "CamThread: [error] opening ca device failed\n");
+ else {
+ if(dvbca_reset(ca_fd, 0))
+ fprintf(stderr, "CamThread: [error] resetting cam slot failed\n");
+ close(ca_fd);
+ }
+ }*/
+}
+
+DvbCam::~DvbCam()
+{
+ stop();
+}
+
+int DvbCam::probe( int adapter, int ca_device )
+{
+ int fdCa;
+ ca_caps_t cap;
+ ca_slot_info_t info;
+ QString s = QString("/dev/dvb/adapter%1/ca%2").arg( adapter ).arg( ca_device );
+
+ if ( (fdCa = open( s.ascii(), O_RDWR )) < 0) {
+ fprintf(stderr, "DvbCam::probe(): %s:", s.ascii());
+ perror(" ");
+ return -1;
+ }
+
+ if ( ioctl(fdCa, CA_GET_CAP, &cap) == 0) {
+ if ( cap.slot_num>0 ) {
+ info.num = 0;
+ if ( ioctl(fdCa, CA_GET_SLOT_INFO, &info) == 0) {
+ if ( (info.type & CA_CI_LINK)!=0) {
+ fprintf(stderr, "DvbCam::probe(): LLCI slot found on %s\n", s.ascii());
+ if ( (info.flags & CA_CI_MODULE_PRESENT)!=0 ) {
+ fprintf(stderr, "DvbCam::probe(): CA module present on %s\n", s.ascii());
+ close (fdCa);
+ return CA_CI_LINK;
+ }
+ else
+ fprintf(stderr, "DvbCam::probe(): no CA module present on %s\n", s.ascii());
+ }
+ else if ( (info.type & CA_CI)!=0 ) {
+ fprintf(stderr, "DvbCam::probe(): HLCI slot found on %s\n", s.ascii());
+ if ( (info.flags & CA_CI_MODULE_PRESENT)!=0 ) {
+ fprintf(stderr, "DvbCam::probe(): CA module present on %s\n", s.ascii());
+ close (fdCa);
+ return CA_CI;
+ }
+ else
+ fprintf(stderr, "DvbCam::probe(): no CA module present on %s\n", s.ascii());
+ }
+ else
+ fprintf(stderr, "DvbCam::probe(): unsupported CI interface on %s\n", s.ascii());
+ }
+ else
+ fprintf(stderr, "DvbCam::Probe(): ioctl failed on %s\n", s.ascii());
+ }
+ else
+ fprintf(stderr, "DvbCam::Probe(): no CI slot found on %s\n", s.ascii());
+ }
+ else
+ fprintf(stderr, "DvbCam::Probe(): ioctl failed on %s\n", s.ascii());
+
+ close (fdCa);
+ return -1;
+}
+
+void DvbCam::restart(int service_id)
+{
+ stop();
+
+ isRunning = true;
+ sid = service_id;
+
+ CamThread = new DvbCamCamThread(Adapter, CaDevice, ciType);
+ CamThread->start();
+
+ PmtThread = new DvbCamPmtThread(CamThread, Adapter, DemuxDevice, service_id);
+ PmtThread->start();
+}
+
+void DvbCam::stop()
+{
+ if(PmtThread != NULL) {
+ PmtThread->stop();
+ }
+ if(CamThread != NULL) {
+ CamThread->stop();
+ }
+ if(PmtThread != NULL) {
+ PmtThread->wait();
+ delete PmtThread;
+ PmtThread = NULL;
+ }
+ if(CamThread != NULL) {
+ CamThread->wait();
+ delete CamThread; // be careful about deletion: PmtThread uses CamThread internally
+ CamThread = NULL;
+ }
+ isRunning = false;
+}
+
+// class DvbCamCamThread
+
+DvbCamCamThread::DvbCamCamThread(int adapter, int ca_device, int ci_type)
+{
+ Adapter = adapter;
+ CaDevice = ca_device;
+ ciType = ci_type;
+
+ CamHandler = NULL;
+}
+
+DvbCamCamThread::~DvbCamCamThread()
+{
+ wait(); // should never be necessary
+}
+
+void DvbCamCamThread::start()
+{
+ PmtSize = 0;
+ Stopped = false;
+ QThread::start();
+}
+
+void DvbCamCamThread::stop()
+{
+ Stopped = true;
+}
+
+void DvbCamCamThread::wait()
+{
+ QThread::wait();
+}
+
+bool DvbCamCamThread::processPmt(int demux_fd)
+{
+ // read section
+ char si_buf[4096];
+ int size = read(demux_fd, si_buf, sizeof(si_buf));
+ if(size <= 0) {
+ return false;
+ }
+
+ // parse section
+ section *parsed_section = section_codec(reinterpret_cast<unsigned char *> (si_buf), size);
+ if(parsed_section == NULL) {
+ return false;
+ }
+
+ // parse section_ext
+ section_ext *parsed_section_ext = section_ext_decode(parsed_section, 1); // crc check on
+ if(parsed_section_ext == NULL) {
+ return false;
+ }
+
+ // parse pmt
+ mpeg_pmt_section *parsed_pmt = mpeg_pmt_section_codec(parsed_section_ext);
+ if(parsed_pmt == NULL) {
+ return false;
+ }
+
+ // translate it into a cam pmt
+ PmtSize = en50221_ca_format_pmt(parsed_pmt, reinterpret_cast<unsigned char *> (PmtBuffer), sizeof(PmtBuffer), 0, CA_LIST_MANAGEMENT_ONLY, CA_PMT_CMD_ID_OK_DESCRAMBLING);
+ if(PmtSize <= 0) {
+ return false;
+ }
+
+ // the DvbCamCamThread will send it to the cam
+ return true;
+}
+
+void DvbCamCamThread::run()
+{
+ fprintf(stderr, "CamThread: started\n");
+
+ int ca_fd = dvbca_open(Adapter, CaDevice);
+ if(ca_fd < 0) {
+ fprintf(stderr, "CamThread: [error] opening ca device failed\n");
+ return;
+ }
+
+ fprintf(stderr, "CamThread: just using the first cam slot\n");
+
+ if ( ciType!=CA_CI ) { // do not reset HLCI
+ if(dvbca_reset(ca_fd, 0)) {
+ fprintf(stderr, "CamThread: [error] resetting cam slot failed\n");
+ close(ca_fd);
+ return;
+ }
+ }
+
+ while(!Stopped) {
+ bool cam_ready = false;
+ switch(dvbca_get_cam_state(ca_fd, 0)) {
+ case DVBCA_CAMSTATE_MISSING: {
+ /*fprintf(stderr, "CamThread: [error] no cam detected\n");
+ close(ca_fd);
+ return; */ // FIXME: find a more reliable solution
+ break;
+ }
+ case DVBCA_CAMSTATE_READY: {
+ fprintf(stderr, "CamThread: cam 0 is ready\n");
+ cam_ready = true;
+ break;
+ }
+ case DVBCA_CAMSTATE_INITIALISING: {
+ if ( ciType==CA_CI ) { // workaround needed for hlci
+ fprintf(stderr, "CamThread: cam 0 is ready [hlci workaround]\n");
+ cam_ready = true;
+ }
+ break;
+ }
+ default: {
+ fprintf(stderr, "CamThread: [error] querying the cam state failed\n");
+ close(ca_fd);
+ return;
+ }
+ }
+ if(cam_ready) {
+ break;
+ }
+ usleep(100000); // 100 ms
+ }
+
+ if(!Stopped) {
+ switch(dvbca_get_interface_type(ca_fd, 0)) {
+ case DVBCA_INTERFACE_LINK: {
+ fprintf(stderr, "CamThread: LLCI cam slot detected\n");
+ CamHandler = new DvbCamCamHandlerLLCI();
+ break;
+ }
+ case DVBCA_INTERFACE_HLCI: {
+ fprintf(stderr, "CamThread: HLCI cam slot detected\n");
+ CamHandler = new DvbCamCamHandlerHLCI();
+ break;
+ }
+ default: {
+ fprintf(stderr, "CamThread: [error] unknown cam slot type\n");
+ close(ca_fd);
+ return;
+ }
+ }
+ }
+
+ if(!Stopped) {
+ if(!CamHandler->init()) {
+ fprintf(stderr, "CamThread: [error] cam slot initialization failed\n");
+ delete CamHandler;
+ CamHandler = NULL;
+ close(ca_fd);
+ return;
+ }
+ }
+
+ if(!Stopped) {
+ if(!CamHandler->registerCam(ca_fd, 0)) {
+ fprintf(stderr, "CamThread: [error] registering cam 0 failed\n");
+ delete CamHandler;
+ CamHandler = NULL;
+ close(ca_fd);
+ return;
+ }
+ }
+
+ while(!Stopped) {
+ CamHandler->poll();
+ if(PmtSize > 0) {
+ if(CamHandler->sendPmt(PmtBuffer, PmtSize)) {
+ fprintf(stderr, "CamThread: pmt sent to cam\n");
+ PmtSize = 0;
+ }
+ }
+ }
+
+ fprintf(stderr, "CamThread: stopping requested\n");
+
+ delete CamHandler;
+ CamHandler = NULL;
+ close(ca_fd);
+
+ fprintf(stderr, "CamThread: stopped\n");
+ return;
+}
+
+// class DvbCamPmtThread
+
+DvbCamPmtThread::DvbCamPmtThread(DvbCamCamThread *cam_thread, int adapter, int demux_device, int service_id)
+{
+ CamThread = cam_thread;
+ Adapter = adapter;
+ DemuxDevice = demux_device;
+ ServiceId = service_id;
+}
+
+DvbCamPmtThread::~DvbCamPmtThread()
+{
+ wait(); // should never be necessary
+}
+
+void DvbCamPmtThread::start()
+{
+ Stopped = false;
+ QThread::start();
+}
+
+void DvbCamPmtThread::stop()
+{
+ Stopped = true;
+}
+
+void DvbCamPmtThread::wait()
+{
+ QThread::wait();
+}
+
+int DvbCamPmtThread::createSectionFilter(uint16_t pid, uint8_t table_id)
+{
+ // open the demuxer
+ int demux_fd = dvbdemux_open_demux(Adapter, DemuxDevice, 0);
+ if(demux_fd < 0) {
+ return -1;
+ }
+
+ // create a section filter
+ uint8_t filter[18] = {table_id};
+ uint8_t mask[18] = {0xff};
+ if(dvbdemux_set_section_filter(demux_fd, pid, filter, mask, 1, 1)) { // crc check on
+ close(demux_fd);
+ return -1;
+ }
+
+ return demux_fd;
+}
+
+int DvbCamPmtThread::processPat(int demux_fd)
+{
+ // read section
+ char si_buf[4096];
+ int size = read(demux_fd, si_buf, sizeof(si_buf));
+ if(size < 0) {
+ return -1;
+ }
+
+ // parse section
+ section *parsed_section = section_codec(reinterpret_cast<unsigned char *> (si_buf), size);
+ if(parsed_section == NULL) {
+ return -1;
+ }
+
+ // parse section_ext
+ section_ext *parsed_section_ext = section_ext_decode(parsed_section, 1); // crc check on
+ if(parsed_section_ext == NULL) {
+ return -1;
+ }
+
+ // parse pat
+ mpeg_pat_section *parsed_pat = mpeg_pat_section_codec(parsed_section_ext);
+ if(parsed_pat == NULL) {
+ return -1;
+ }
+
+ // try and find the requested program
+ mpeg_pat_program *cur_program;
+ mpeg_pat_section_programs_for_each(parsed_pat, cur_program) {
+ if(cur_program->program_number == ServiceId) {
+ return cur_program->pid;
+ }
+ }
+
+ fprintf(stderr, "PmtThread: [warning] the requested service id couldn't be found\n");
+
+ return -1;
+}
+
+void DvbCamPmtThread::run()
+{
+ fprintf(stderr, "PmtThread: started\n");
+
+ int demux_fd = createSectionFilter(TRANSPORT_PAT_PID, stag_mpeg_program_association);
+ if(demux_fd < 0) {
+ fprintf(stderr, "PmtThread: [error] opening demux device failed\n");
+ return;
+ }
+
+ pollfd poll_desc;
+ poll_desc.fd = demux_fd;
+ poll_desc.events = POLLIN | POLLPRI;
+ while(!Stopped) {
+ int ret = poll(&poll_desc, 1, 100); // 100 ms
+ if(ret < 0) {
+ fprintf(stderr, "PmtThread: [error] polling demux device failed\n");
+ close(demux_fd);
+ return;
+ }
+ if((ret > 0) && (poll_desc.revents != 0) && ((poll_desc.revents & ~(POLLIN | POLLPRI)) == 0)) {
+ int processed_pat = processPat(demux_fd);
+ if(processed_pat >= 0) {
+ close(demux_fd);
+ demux_fd = createSectionFilter(processed_pat, stag_mpeg_program_map);
+ if(demux_fd < 0) {
+ fprintf(stderr, "PmtThread: [error] opening demux device failed\n");
+ return;
+ }
+ poll_desc.fd = demux_fd;
+ break;
+ }
+ }
+ }
+
+ while(!Stopped) {
+ int ret = poll(&poll_desc, 1, 100); // 100 ms
+ if(ret < 0) {
+ fprintf(stderr, "PmtThread: [error] polling demux device failed\n");
+ close(demux_fd);
+ return;
+ }
+ if((ret > 0) && (poll_desc.revents != 0) && ((poll_desc.revents & ~(POLLIN | POLLPRI)) == 0)) {
+ if(CamThread->processPmt(demux_fd)) {
+ fprintf(stderr, "PmtThread: new pmt received\n");
+ close(demux_fd);
+ fprintf(stderr, "PmtThread: stopped\n");
+ return;
+ }
+ }
+ }
+
+ fprintf(stderr, "PmtThread: stopping requested\n");
+
+ close(demux_fd);
+
+ fprintf(stderr, "PmtThread: stopped\n");
+ return;
+}
+
+// class DvbCamCamHandler
+
+DvbCamCamHandler::DvbCamCamHandler()
+{
+ AiResource = NULL;
+ CaResource = NULL;
+
+ SessionNumber = -1;
+}
+
+DvbCamCamHandler::~DvbCamCamHandler()
+{
+ if(CaResource != NULL) {
+ en50221_app_ca_destroy(CaResource);
+ CaResource = NULL;
+ }
+ if(AiResource != NULL) {
+ en50221_app_ai_destroy(AiResource);
+ AiResource = NULL;
+ }
+}
+
+bool DvbCamCamHandler::init()
+{
+ AiResource = en50221_app_ai_create(&SendFuncs);
+ CaResource = en50221_app_ca_create(&SendFuncs);
+
+ if(CaResource != NULL) {
+ en50221_app_ca_register_info_callback(CaResource, infoCallback, this);
+ }
+
+ return sub_init();
+}
+
+bool DvbCamCamHandler::sendPmt(char *pmt_buffer, int size)
+{
+ if((CaResource != NULL) && (SessionNumber >= 0)) {
+ if(!en50221_app_ca_pmt(CaResource, SessionNumber, reinterpret_cast<unsigned char *> (pmt_buffer), size)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+int DvbCamCamHandler::infoCallback(void *arg, uint8_t /*slot_id*/, uint16_t session_number, uint32_t /*ca_id_count*/, uint16_t */*ca_ids*/)
+{
+ (static_cast<DvbCamCamHandler *> (arg))->SessionNumber = session_number;
+ return 0;
+}
+
+// class DvbCamCamHandlerLLCI
+
+#define MAX_CARDS 1
+#define MAX_TC 16
+#define MAX_SESSIONS 16
+
+DvbCamCamHandlerLLCI::DvbCamCamHandlerLLCI()
+{
+ RmResource = NULL;
+ SessionLayer = NULL;
+ TransportLayer = NULL;
+}
+
+DvbCamCamHandlerLLCI::~DvbCamCamHandlerLLCI()
+{
+ if(SessionLayer != NULL) {
+ en50221_sl_destroy(SessionLayer);
+ SessionLayer = NULL;
+ }
+ if(TransportLayer != NULL) {
+ en50221_tl_destroy(TransportLayer);
+ TransportLayer = NULL;
+ }
+ if(RmResource != NULL) {
+ en50221_app_rm_destroy(RmResource);
+ RmResource = NULL;
+ }
+}
+
+int DvbCamCamHandlerLLCI::llci_rm_enq_callback(void *arg, uint8_t /*slot_id*/, uint16_t session_number)
+{
+ uint32_t resource_ids[] = {EN50221_APP_RM_RESOURCEID, EN50221_APP_AI_RESOURCEID, EN50221_APP_CA_RESOURCEID};
+ en50221_app_rm_reply(arg, session_number, sizeof(resource_ids) / 4, resource_ids);
+ return 0;
+}
+
+int DvbCamCamHandlerLLCI::llci_rm_reply_callback(void *arg, uint8_t /*slot_id*/, uint16_t session_number, uint32_t /*resource_id_count*/, uint32_t */*resource_ids*/)
+{
+ en50221_app_rm_changed(arg, session_number);
+ return 0;
+}
+
+int DvbCamCamHandlerLLCI::llci_rm_changed_callback(void *arg, uint8_t /*slot_id*/, uint16_t session_number)
+{
+ en50221_app_rm_enq(arg, session_number);
+ return 0;
+}
+
+int DvbCamCamHandlerLLCI::llci_lookup_callback(void *arg, uint8_t /*slot_id*/, uint32_t requested_resource_id, en50221_sl_resource_callback *callback_out, void **arg_out, uint32_t *connected_resource_id)
+{
+ // decode the resource id
+ en50221_app_public_resource_id resid;
+ if(!en50221_app_decode_public_resource_id(&resid, requested_resource_id)) {
+ return -1;
+ }
+
+ // try and find an instance of the resource
+ const SlResource *Resources = (static_cast<DvbCamCamHandlerLLCI *> (arg))->Resources;
+ int i;
+ for(i = 0; i < 3; ++i) {
+ if((resid.resource_class == Resources[i].resid.resource_class) && (resid.resource_type == Resources[i].resid.resource_type)) {
+ *callback_out = Resources[i].callback;
+ *arg_out = Resources[i].arg;
+ *connected_resource_id = Resources[i].binary_resource_id;
+ return 0;
+ }
+ }
+ return -1;
+}
+
+int DvbCamCamHandlerLLCI::llci_session_callback(void *arg, int reason, uint8_t /*slot_id*/, uint16_t session_number, uint32_t resource_id)
+{
+ if(reason == S_SCALLBACK_REASON_CAMCONNECTED) {
+ if(resource_id == EN50221_APP_RM_RESOURCEID) {
+ void *RmResource = (static_cast<DvbCamCamHandlerLLCI *> (arg))->Resources[0].arg;
+ en50221_app_rm_enq(RmResource, session_number);
+ }
+ else if(resource_id == EN50221_APP_AI_RESOURCEID) {
+ void *AiResource = (static_cast<DvbCamCamHandlerLLCI *> (arg))->Resources[1].arg;
+ en50221_app_ai_enquiry(AiResource, session_number);
+ }
+ else if(resource_id == EN50221_APP_CA_RESOURCEID) {
+ void *CaResource = (static_cast<DvbCamCamHandlerLLCI *> (arg))->Resources[2].arg;
+ en50221_app_ca_info_enq(CaResource, session_number);
+ }
+ }
+ return 0;
+}
+
+void DvbCamCamHandlerLLCI::poll()
+{
+ if(en50221_tl_poll(TransportLayer)) {
+ fprintf(stderr, "CamThread: [warning] polling the stack failed\n");
+ usleep(10000); // wait 10 ms to not block
+ }
+}
+
+bool DvbCamCamHandlerLLCI::registerCam(int ca_fd, uint8_t slot)
+{
+ // register the slot
+ int slot_id = en50221_tl_register_slot(TransportLayer, ca_fd, slot, 1000, 100);
+ if(slot_id < 0) {
+ return false;
+ }
+
+ // create a new connection on the slot
+ if(en50221_tl_new_tc(TransportLayer, slot_id) < 0) {
+ return false;
+ }
+
+ return true;
+}
+
+bool DvbCamCamHandlerLLCI::sub_init()
+{
+ // create transport layer
+ TransportLayer = en50221_tl_create(MAX_CARDS, MAX_TC);
+ if(TransportLayer == NULL) {
+ return false;
+ }
+
+ // create session layer
+ SessionLayer = en50221_sl_create(TransportLayer, MAX_SESSIONS);
+ if(SessionLayer == NULL) {
+ en50221_tl_destroy(TransportLayer);
+ TransportLayer = NULL;
+ return false;
+ }
+
+ // create sendfuncs
+ SendFuncs.arg = SessionLayer;
+ SendFuncs.send_data = en50221_sl_send_data;
+ SendFuncs.send_datav = en50221_sl_send_datav;
+
+ // create the resource manager resource
+ RmResource = en50221_app_rm_create(&SendFuncs);
+ en50221_app_decode_public_resource_id(&Resources[0].resid, EN50221_APP_RM_RESOURCEID);
+ Resources[0].binary_resource_id = EN50221_APP_RM_RESOURCEID;
+ Resources[0].callback = en50221_app_rm_message;
+ Resources[0].arg = RmResource;
+ en50221_app_rm_register_enq_callback(RmResource, llci_rm_enq_callback, RmResource);
+ en50221_app_rm_register_reply_callback(RmResource, llci_rm_reply_callback, RmResource);
+ en50221_app_rm_register_changed_callback(RmResource, llci_rm_changed_callback, RmResource);
+
+ // integrate the application information resource
+ en50221_app_decode_public_resource_id(&Resources[1].resid, EN50221_APP_AI_RESOURCEID);
+ Resources[1].binary_resource_id = EN50221_APP_AI_RESOURCEID;
+ Resources[1].callback = en50221_app_ai_message;
+ Resources[1].arg = AiResource;
+
+ // integrate the ca resource
+ en50221_app_decode_public_resource_id(&Resources[2].resid, EN50221_APP_CA_RESOURCEID);
+ Resources[2].binary_resource_id = EN50221_APP_CA_RESOURCEID;
+ Resources[2].callback = en50221_app_ca_message;
+ Resources[2].arg = CaResource;
+
+ // register session layer callbacks
+ en50221_sl_register_lookup_callback(SessionLayer, llci_lookup_callback, this);
+ en50221_sl_register_session_callback(SessionLayer, llci_session_callback, this);
+
+ return true;
+}
+
+// class DvbCamCamHandlerHLCI
+
+DvbCamCamHandlerHLCI::DvbCamCamHandlerHLCI()
+{
+}
+
+DvbCamCamHandlerHLCI::~DvbCamCamHandlerHLCI()
+{
+}
+
+int DvbCamCamHandlerHLCI::hlci_send_data(void *arg, uint16_t /*session_number*/, uint8_t *data, uint16_t data_length)
+{
+ return dvbca_hlci_write(static_cast<int> (reinterpret_cast<intptr_t> (arg)), data, data_length);
+}
+
+int DvbCamCamHandlerHLCI::hlci_send_datav(void *arg, uint16_t /*session_number*/, iovec *vector, int iov_count)
+{
+ // calculate the total length of the data to send
+ uint32_t data_size = 0;
+ for(int i = 0; i < iov_count; ++i) {
+ data_size += vector[i].iov_len;
+ }
+
+ // allocate memory for it
+ uint8_t *buf = new uint8_t[data_size];
+
+ // merge the iovecs
+ uint8_t *pos = buf;
+ for(int i = 0; i < iov_count; ++i) {
+ memcpy(pos, vector[i].iov_base, vector[i].iov_len);
+ pos += vector[i].iov_len;
+ }
+
+ // send it
+ int status = dvbca_hlci_write(static_cast<int> (reinterpret_cast<intptr_t> (arg)), buf, data_size);
+ delete buf;
+ return status;
+}
+
+void DvbCamCamHandlerHLCI::poll()
+{
+ // we do nothing here for the moment
+ usleep(100000); // 100 ms
+}
+
+bool DvbCamCamHandlerHLCI::registerCam(int ca_fd, uint8_t /*slot*/)
+{
+ SendFuncs.arg = reinterpret_cast<void *> (ca_fd);
+
+ // get application information
+ if(en50221_app_ai_enquiry(AiResource, 0)) {
+ fprintf(stderr, "CamThread: [DEBUG #1]\n");
+ return false;
+ }
+
+ uint8_t buf[256];
+ int size = dvbca_hlci_read(ca_fd, TAG_APP_INFO, buf, sizeof(buf));
+ if(size <= 0) {
+ fprintf(stderr, "CamThread: [DEBUG #2]\n");
+ return false;
+ }
+
+ if(en50221_app_ai_message(AiResource, 0, 0, EN50221_APP_AI_RESOURCEID, buf, size)) {
+ fprintf(stderr, "CamThread: [DEBUG #3]\n");
+ return false;
+ }
+
+ // FIXME: try to change this soon
+ buf[0] = TAG_CA_INFO >> 16;
+ buf[1] = TAG_CA_INFO >> 8;
+ buf[2] = TAG_CA_INFO;
+ buf[3] = 0;
+ if(en50221_app_ca_message(CaResource, 0, 0, EN50221_APP_CA_RESOURCEID, buf, 4)) {
+ fprintf(stderr, "CamThread: [DEBUG #4]\n");
+ return false;
+ }
+
+ fprintf(stderr, "CamThread: [DEBUG #5]\n");
+
+ return true;
+}
+
+bool DvbCamCamHandlerHLCI::sub_init()
+{
+ // create sendfuncs
+ SendFuncs.arg = NULL;
+ SendFuncs.send_data = hlci_send_data;
+ SendFuncs.send_datav = hlci_send_datav;
+
+ return true;
+}
diff --git a/kaffeine/src/input/dvb/dvbcam.h b/kaffeine/src/input/dvb/dvbcam.h
new file mode 100644
index 0000000..47a4012
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbcam.h
@@ -0,0 +1,52 @@
+/*
+ * dvbcam.h
+ *
+ * Copyright (C) 2006 Christoph Pfister <christophpfister@gmail.com>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DVBCAM_H
+#define DVBCAM_H
+
+class DvbCamCamThread;
+class DvbCamPmtThread;
+
+class DvbCam
+{
+public:
+ DvbCam(int adapter, int ca_device, int demux_device, int ci_type);
+ ~DvbCam();
+
+ void restart(int service_id);
+ void stop();
+ bool running() { return isRunning; }
+ int serviceId() { return sid; }
+
+ static int probe( int adapter, int ca_device );
+
+private:
+ int Adapter;
+ int CaDevice;
+ int DemuxDevice;
+ bool isRunning;
+ int sid;
+ int ciType;
+
+ DvbCamCamThread *CamThread;
+ DvbCamPmtThread *PmtThread;
+};
+
+#endif /* DVBCAM_H */
diff --git a/kaffeine/src/input/dvb/dvbconfig.cpp b/kaffeine/src/input/dvb/dvbconfig.cpp
new file mode 100644
index 0000000..746d745
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbconfig.cpp
@@ -0,0 +1,1478 @@
+/*
+ * dvbconfig.cpp
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <unistd.h>
+#include <errno.h>
+
+#include <qdir.h>
+#include <qlayout.h>
+#include <qgroupbox.h>
+#include <qregexp.h>
+#include <qradiobutton.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+#include <kfiledialog.h>
+#include <ktar.h>
+#include <kstandarddirs.h>
+
+#include "dvbconfig.h"
+#include "kaffeinedvbplugin.h"
+
+
+
+MSpinBox::MSpinBox( QWidget *parent, int devNum ) : QSpinBox( 1, 4, 1, parent )
+{
+ deviceNumber = devNum;
+ connect( this, SIGNAL(valueChanged(int)), this, SLOT(slotValueChanged(int)) );
+}
+
+
+
+void MSpinBox::slotValueChanged( int value )
+{
+ emit signalValueChanged( value, deviceNumber );
+}
+
+
+
+MPushButton::MPushButton( QWidget *parent, int devNum, int lnbNum ) : KPushButton( parent )
+{
+ deviceNumber = devNum;
+ lnbNumber = lnbNum;
+ connect( this, SIGNAL(clicked()), this, SLOT(isClicked()) );
+}
+
+
+
+void MPushButton::isClicked()
+{
+ emit clicked( deviceNumber, lnbNumber );
+}
+
+
+
+MComboBox::MComboBox( QWidget *parent, int devNum, int lnbNum ) : QComboBox( parent )
+{
+ deviceNumber = devNum;
+ lnbNumber = lnbNum;
+ connect( this, SIGNAL(activated(int)), this, SLOT(isActivated(int)) );
+}
+
+
+
+void MComboBox::isActivated( int index )
+{
+ emit activated( index, deviceNumber, lnbNumber );
+}
+
+
+
+LNB::LNB()
+{
+ switchFreq = 11700;
+ loFreq = 9750;
+ hiFreq = 10600;
+ rotorType = 0;
+ speed13v = 2.5;
+ speed18v = 1.5;
+}
+
+
+
+Device::Device( int anum, int tnum, fe_type_t t, const QString &n, bool as )
+{
+ adapter = anum;
+ tuner = tnum;
+ type = t;
+ name = n;
+ source = "";
+ canAutoscan= as;
+ tuningTimeout = 1500;
+}
+
+
+
+Category::Category( const QString &tname, const QString &ticon )
+{
+ name = tname;
+ icon = ticon;
+}
+
+
+
+DVBconfig::DVBconfig( const QString &dvbConf )
+{
+ dvbConfigDir = dvbConf;
+ dvbConfigIconsDir = dvbConf+"icons/";
+ QDir dir;
+ dir.setPath( dvbConfigIconsDir );
+ if ( !dir.exists() )
+ dir.mkdir( dvbConfigIconsDir );
+ config = new KConfig( dvbConfigDir+"dvbrc" );
+ downProgress = 0;
+ sizeFile = 0;
+ categories.setAutoDelete( true );
+ devList.setAutoDelete( true );
+ startup();
+ readConfig();
+}
+
+
+
+DVBconfig::~DVBconfig()
+{
+ saveConfig();
+ delete config;
+ categories.clear();
+ devList.clear();
+}
+
+
+
+bool DVBconfig::haveDvbDevice()
+{
+ int i, j, res, fdFrontend=0;
+ struct dvb_frontend_info info;
+
+ QStringList list, flist;
+ QDir d;
+ d.setPath( "/dev/dvb/" );
+ list = d.entryList( "adapter*", QDir::Dirs, QDir::Name );
+
+ for ( i=0; i<(int)list.count(); i++ ) {
+ d.setPath( "/dev/dvb/"+list[i]+"/" );
+ flist = d.entryList( "frontend*", QDir::System, QDir::Name );
+ for ( j=0; j<(int)flist.count(); j++ ) {
+ fdFrontend = open( QString("/dev/dvb/%1/%2").arg( list[i] ).arg( flist[j] ).ascii(), O_RDWR);
+ if ( fdFrontend>0 ) {
+ if ( (res = ioctl( fdFrontend, FE_GET_INFO, &info ) < 0) )
+ perror( QString("/dev/dvb/%1/%2 FE_GET_INFO: ").arg( list[i] ).arg( flist[j] ).ascii() );
+ else {
+ close( fdFrontend );
+ return true;
+ }
+ close( fdFrontend );
+ }
+ }
+ }
+
+ return false;
+}
+
+
+
+void DVBconfig::startup()
+{
+ int i=0, j=0, res, fdFrontend=0;
+ struct dvb_frontend_info info;
+ bool as;
+
+ QStringList list, flist;
+ QString s, t;
+ QDir d;
+ d.setPath( "/dev/dvb/" );
+ list = d.entryList( "adapter*", QDir::Dirs, QDir::Name );
+
+ for ( i=0; i<(int)list.count(); i++ ) {
+ d.setPath( "/dev/dvb/"+list[i]+"/" );
+ flist = d.entryList( "frontend*", QDir::System, QDir::Name );
+ for ( j=0; j<(int)flist.count(); j++ ) {
+ s = list[i];
+ t = flist[j];
+ fdFrontend = open( QString("/dev/dvb/%1/%2").arg( s ).arg( t ).ascii(), O_RDWR);
+ if ( fdFrontend>0 ) {
+ if ( !(res = ioctl( fdFrontend, FE_GET_INFO, &info ) < 0) ) {
+ if ( (info.type==FE_OFDM)
+ && (info.caps & FE_CAN_QAM_AUTO)
+ && (info.caps & FE_CAN_TRANSMISSION_MODE_AUTO)
+ && (info.caps & FE_CAN_GUARD_INTERVAL_AUTO)
+ && (info.caps & FE_CAN_HIERARCHY_AUTO)
+ && (info.caps & FE_CAN_FEC_AUTO) )
+ as = true;
+ else
+ as = false;
+ fprintf(stderr,"/dev/dvb/%s/%s : opened ( %s )\n", s.ascii(), t.ascii(), info.name );
+ devList.append( new Device( s.replace("adapter","").toInt(), t.replace("frontend","").toInt(), info.type, info.name, as ) );
+ }
+ close( fdFrontend );
+ }
+ else
+ perror( QString("/dev/dvb/%1/%2").arg( s ).arg( t ).ascii() );
+ }
+ }
+
+ //devList.append( new Device( 3, 0, FE_QPSK, "Dummy S", false ) );
+}
+
+
+
+void DVBconfig::setDownloadResult( Job *job )
+{
+ if ( downProgress && job ) {
+ delete downProgress;
+ downProgress = 0;
+ }
+}
+
+
+
+void DVBconfig::setDownloadPercent( Job *job, unsigned long percent )
+{
+ if ( downProgress && job )
+ downProgress->progressBar()->setProgress( percent );
+}
+
+
+
+bool DVBconfig::loadDvbData( QWidget *parent )
+{
+ QString s="";
+ FileCopyJob *job;
+ QFile f( dvbConfigDir+"dvbdata.tar.gz" );
+
+ //if ( f.exists() ) f.remove();
+ downProgress = new KProgressDialog( parent, "progress", i18n("Downloading... "), i18n("Copying data files..."), true );
+ downProgress->progressBar()->setTotalSteps( 100 );
+ //job = file_copy( KURL( "http://hftom.free.fr/kaxtv/dvbdata.tar.gz" ), KURL( dvbConfigDir+"dvbdata.tar.gz" ), -1, true, false, false );
+ job = file_copy( KURL( "http://hftom.free.fr/kaxtv/dvbdata.tar.gz" ), KURL( dvbConfigDir+"dvbdata.tar.gz" ), -1, true, false, false );
+ connect( job, SIGNAL(result(KIO::Job*)), this, SLOT(setDownloadResult(KIO::Job*)) );
+ connect( job, SIGNAL(percent(KIO::Job*,unsigned long)), this, SLOT(setDownloadPercent(KIO::Job*,unsigned long)) );
+ downProgress->exec();
+ disconnect( job, SIGNAL(result(KIO::Job*)), this, SLOT(setDownloadResult(KIO::Job*)) );
+ disconnect( job, SIGNAL(percent(KIO::Job*,unsigned long)), this, SLOT(setDownloadPercent(KIO::Job*,unsigned long)) );
+ if ( downProgress ) {
+ delete downProgress;
+ downProgress = 0;
+ }
+ KTar tar( dvbConfigDir+"dvbdata.tar.gz");
+ if ( tar.open( IO_ReadOnly ) ) {
+ tar.directory()->copyTo( dvbConfigDir );
+ return true;
+ }
+ else
+ return false;
+}
+
+
+
+bool DVBconfig::localData()
+{
+ QString s = locate("data","kaffeine/dvbdata.tar.gz");
+ KTar tar( s );
+ if ( tar.open( IO_ReadOnly ) ) {
+ tar.directory()->copyTo( dvbConfigDir );
+ return true;
+ }
+ else
+ return false;
+}
+
+
+
+bool DVBconfig::haveData()
+{
+ if ( !QDir( dvbConfigDir+"dvb-s" ).exists() || !QDir( dvbConfigDir+"dvb-c" ).exists() || !QDir( dvbConfigDir+"dvb-t" ).exists() ) {
+ loadDvbData(0);
+ if ( !QDir( dvbConfigDir+"dvb-s" ).exists() || !QDir( dvbConfigDir+"dvb-c" ).exists() || !QDir( dvbConfigDir+"dvb-t" ).exists() ) {
+ if ( !localData() )
+ return false;
+ }
+ }
+ return true;
+}
+
+
+
+QStringList DVBconfig::getSourcesList( fe_type_t type )
+{
+ QString s;
+ QStringList list;
+
+ switch ( type ) {
+ case FE_QPSK : s = "dvb-s"; break;
+ case FE_QAM : s = "dvb-c"; break;
+ case FE_OFDM : s = "dvb-t"; break;
+ default : return list;
+ }
+ list = QDir( dvbConfigDir+s ).entryList( QDir::Files, QDir::Name );
+ return list;
+}
+
+
+
+void DVBconfig::addCategory( const QString &name, const QString &icon )
+{
+ categories.append( new Category( name, icon ) );
+}
+
+
+
+void DVBconfig::removeCategory( const QString &name )
+{
+ int i;
+
+ for ( i=0; i<(int)categories.count(); i++ ) {
+ if ( categories.at(i)->name==name ) {
+ categories.remove( i );
+ break;
+ }
+ }
+}
+
+
+
+void DVBconfig::changeIconCategory( const QString &name, const QString &icon )
+{
+ int i;
+
+ if ( name==i18n("All") )
+ allIcon = icon;
+ else if ( name==i18n("TV") )
+ tvIcon = icon;
+ else if ( name==i18n("Radio") )
+ radioIcon = icon;
+ else {
+ for ( i=0; i<(int)categories.count(); i++ ) {
+ if ( categories.at(i)->name==name ) {
+ categories.at(i)->icon = icon;
+ break;
+ }
+ }
+ }
+}
+
+
+
+int DVBconfig::readDvbChanOrder()
+{
+ config->setGroup( "DVB Options" );
+ int sort = config->readNumEntry("ChannelsSorting", 0);
+ return sort;
+}
+
+
+
+void DVBconfig::saveDvbChanOrder( int s, int col )
+{
+ int sort = (s<<1) | col;
+ config->setGroup( "DVB Options" );
+ config->writeEntry("ChannelsSorting", sort);
+ config->sync();
+}
+
+
+
+void DVBconfig::readConfig()
+{
+ QSize size;
+ QString s;
+ int i, j;
+
+ config->setGroup( "DVB Options" );
+ broadcastAddress = config->readEntry( "BroadcastAddress", "192.168.0.255" );
+ broadcastPort = config->readNumEntry( "BroadcastPort", 1234 );
+ senderPort = config->readNumEntry( "SenderPort", 1235 );
+ size = QSize(600, 350);
+ epgSize = config->readSizeEntry( "EPG Geometry", &size );
+ size = QSize(600, 300);
+ timerSize = config->readSizeEntry( "Timers Geometry", &size );
+ size = QSize(300, 300);
+ scanSize = config->readSizeEntry( "Scan Geometry", &size );
+ beginMargin = config->readNumEntry( "BeginMargin", 5 );
+ endMargin = config->readNumEntry( "EndMargin", 10 );
+ instantDuration = config->readNumEntry( "InstantDuration", 120 );
+ recordDir = config->readEntry( "RecordDir", QDir::homeDirPath() );
+ if ( !recordDir.endsWith("/") )
+ recordDir+= "/";
+ sizeFile = config->readNumEntry("SizeFile",0);
+ shiftDir = config->readEntry( "ShiftDir", QDir::homeDirPath() );
+ if ( !shiftDir.endsWith("/") )
+ shiftDir+= "/";
+ filenameFormat = config->readEntry( "filenameFormat", "%name" );
+ for ( i=0; i<(int)devList.count(); i++ ) {
+ devList.at(i)->source = config->readEntry( QString("DVB%1").arg(i), "" );
+ devList.at(i)->tuningTimeout = config->readNumEntry( QString("DVB%1_TIMEOUT").arg(i), 1500 );
+ if ( devList.at(i)->type!=FE_QPSK )
+ continue;
+ devList.at(i)->numLnb = config->readNumEntry( QString("DVB%1_NLNB").arg(i), 1 );
+ for ( j=0; j<devList.at(i)->numLnb; j++ ) {
+ devList.at(i)->lnb[j].switchFreq = config->readNumEntry( QString("DVB%1_LNB%2_switch").arg(i).arg(j), 11700 );
+ devList.at(i)->lnb[j].loFreq = config->readNumEntry( QString("DVB%1_LNB%2_lo").arg(i).arg(j), 9750 );
+ devList.at(i)->lnb[j].hiFreq = config->readNumEntry( QString("DVB%1_LNB%2_hi").arg(i).arg(j), 10600 );
+ devList.at(i)->lnb[j].rotorType = config->readNumEntry( QString("DVB%1_LNB%2_rotor").arg(i).arg(j), 0 );
+ devList.at(i)->lnb[j].source = config->readListEntry( QString("DVB%1_LNB%2_source").arg(i).arg(j) );
+ devList.at(i)->lnb[j].position = config->readIntListEntry( QString("DVB%1_LNB%2_position").arg(i).arg(j) );
+ devList.at(i)->lnb[j].speed13v = config->readDoubleNumEntry( QString("DVB%1_LNB%2_speed13v").arg(i).arg(j), 2.5 );
+ devList.at(i)->lnb[j].speed18v = config->readDoubleNumEntry( QString("DVB%1_LNB%2_speed18v").arg(i).arg(j), 1.5 );
+ }
+ }
+ j = config->readNumEntry( "NumCategories", 0 );
+ for ( i=0; i<j; i++ )
+ categories.append( new Category( config->readEntry( QString("CategoryName%1").arg(i), "" ), config->readEntry( QString("CategoryIcon%1").arg(i), "kaffeine" ) ) );
+ allIcon = config->readEntry( "AllIcon", "kaffeine" );
+ tvIcon = config->readEntry( "TvIcon", "kdvbtv" );
+ radioIcon = config->readEntry( "RadioIcon", "kdvbra" );
+ lastChannel = config->readNumEntry( "LastChannel", 1 );
+ splitSizes = config->readIntListEntry("SplitSizes");
+ defaultCharset = config->readEntry( "DefaultCharset", "ISO8859-1" );
+ usalsLatitude = config->readDoubleNumEntry( "UsalsLatitude", 0.0 );
+ usalsLongitude = config->readDoubleNumEntry( "UsalsLongitude", 0.0 );
+ for ( i=0; i<(int)devList.count(); i++ ) {
+ devList.at(i)->usalsLatitude = usalsLatitude;
+ devList.at(i)->usalsLongitude = usalsLongitude;
+ }
+}
+
+
+
+void DVBconfig::saveConfig()
+{
+ int i, j;
+
+ config->setGroup( "DVB Options" );
+ config->writeEntry( "EPG Geometry", epgSize );
+ config->writeEntry( "Timers Geometry", timerSize );
+ config->writeEntry( "Scan Geometry", scanSize );
+ config->writeEntry( "BeginMargin", beginMargin );
+ config->writeEntry( "EndMargin", endMargin );
+ config->writeEntry( "InstantDuration", instantDuration );
+ config->writeEntry( "RecordDir", recordDir );
+ config->writeEntry( "ShiftDir", shiftDir );
+ config->writeEntry( "filenameFormat", filenameFormat );
+ config->writeEntry( "BroadcastAddress", broadcastAddress );
+ config->writeEntry( "BroadcastPort", broadcastPort );
+ config->writeEntry( "SenderPort", senderPort );
+ for ( i=0; i<(int)devList.count(); i++ ) {
+ config->writeEntry( QString("DVB%1").arg(i), devList.at(i)->source );
+ config->writeEntry( QString("DVB%1_TIMEOUT").arg(i), devList.at(i)->tuningTimeout );
+ if ( devList.at(i)->type!=FE_QPSK )
+ continue;
+ config->writeEntry( QString("DVB%1_NLNB").arg(i), devList.at(i)->numLnb );
+ for ( j=0; j<devList.at(i)->numLnb; j++ ) {
+ config->writeEntry( QString("DVB%1_LNB%2_switch").arg(i).arg(j), devList.at(i)->lnb[j].switchFreq );
+ config->writeEntry( QString("DVB%1_LNB%2_lo").arg(i).arg(j), devList.at(i)->lnb[j].loFreq );
+ config->writeEntry( QString("DVB%1_LNB%2_hi").arg(i).arg(j), devList.at(i)->lnb[j].hiFreq );
+ config->writeEntry( QString("DVB%1_LNB%2_rotor").arg(i).arg(j), devList.at(i)->lnb[j].rotorType );
+ config->writeEntry( QString("DVB%1_LNB%2_source").arg(i).arg(j), devList.at(i)->lnb[j].source );
+ config->writeEntry( QString("DVB%1_LNB%2_position").arg(i).arg(j), devList.at(i)->lnb[j].position );
+ config->writeEntry( QString("DVB%1_LNB%2_speed13v").arg(i).arg(j), devList.at(i)->lnb[j].speed13v );
+ config->writeEntry( QString("DVB%1_LNB%2_speed18v").arg(i).arg(j), devList.at(i)->lnb[j].speed18v );
+ }
+ }
+ config->writeEntry( "NumCategories", categories.count() );
+ for ( i=0; i<(int)categories.count(); i++ ) {
+ config->writeEntry( QString("CategoryName%1").arg(i), categories.at(i)->name );
+ config->writeEntry( QString("CategoryIcon%1").arg(i), categories.at(i)->icon );
+ }
+ config->writeEntry( "AllIcon", allIcon );
+ config->writeEntry( "TvIcon", tvIcon );
+ config->writeEntry( "RadioIcon", radioIcon );
+ config->writeEntry( "LastChannel", lastChannel );
+ config->writeEntry( "SplitSizes", splitSizes );
+ config->writeEntry( "DefaultCharset", defaultCharset );
+ config->writeEntry( "UsalsLatitude", usalsLatitude );
+ config->writeEntry( "UsalsLongitude", usalsLongitude );
+ config->writeEntry( "SizeFile", sizeFile );
+ config->sync();
+}
+
+
+
+bool DVBconfig::firstRun()
+{
+ config->setGroup( "DVB Options" );
+ if ( config->readNumEntry( "FirstRun", 0 )<3 ) {
+ config->writeEntry( "FirstRun", 3 );
+ return true;
+ }
+ return false;
+}
+
+
+
+DvbConfigDialog::DvbConfigDialog( DVBconfig *dc, QWidget *parent, KaffeineDvbPlugin *p ) :
+ KDialogBase ( IconList, i18n("DVB Settings"), Ok|Cancel, Ok, parent, "dvbConfigDialog", true, true )
+{
+ QLabel *lab;
+ KIconLoader *icon = new KIconLoader();
+ QHBoxLayout *h1;
+ QString s;
+ int i;
+ QVBoxLayout *vb;
+ QGroupBox *gb;
+ QGridLayout *grid, *sgrid;
+ QLabel *ident;
+ QLabel *dvbType;
+ int gridLine;
+ QFrame *page;
+ QSpinBox *spin;
+ KPushButton *usals;
+ QWidget *swidg;
+ QStringList rotorList; rotorList<<i18n("No rotor")<<i18n("USALS rotor")<<i18n("Positions rotor");
+
+ dvbConfig = dc;
+ timeoutSpin.setAutoDelete( true );
+
+ for ( i=0; i<(int)dvbConfig->devList.count(); i++ ) {
+ page = addPage( i18n("DVB Device")+" "+QString("%1:%2").arg(dvbConfig->devList.at(i)->adapter).arg(dvbConfig->devList.at(i)->tuner), i18n("Device Settings"),
+ KGlobal::instance()->iconLoader()->loadIcon( "hwinfo", KIcon::NoGroup, KIcon::SizeMedium ) );
+ vb = new QVBoxLayout( page, 6, 6 );
+ gb = new QGroupBox( "", page );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+ gridLine = 0;
+
+ lab = new QLabel( i18n("<qt><b>Name:</b></qt>"), gb );
+ grid->addWidget( lab, gridLine, 0 );
+ ident = new QLabel( dvbConfig->devList.at(i)->name, gb );
+ grid->addMultiCellWidget( ident, gridLine, gridLine, 1, 3 );
+ ++gridLine;
+
+ lab = new QLabel( i18n("<qt><b>Type:</b></qt>"), gb );
+ grid->addWidget( lab, gridLine, 0 );
+ dvbType = new QLabel( gb );
+ switch ( dvbConfig->devList.at(i)->type ) {
+ case FE_QAM : dvbType->setText( i18n("Cable") ); break;
+ case FE_OFDM : dvbType->setText( i18n("Terrestrial") ); break;
+ case FE_QPSK : dvbType->setText( i18n("Satellite") ); break;
+ case FE_ATSC : dvbType->setText( i18n("Atsc") ); break;
+ default : dvbType->setText( i18n("Unknown") );
+ }
+ grid->addMultiCellWidget( dvbType, gridLine, gridLine, 1, 3 );
+ ++gridLine;
+
+ lab = new QLabel( i18n("Tuner timeout :"), gb );
+ grid->addWidget( lab, gridLine, 0 );
+ spin = new QSpinBox( 500, 5000, 100, gb );
+ spin->setValue( dvbConfig->devList.at(i)->tuningTimeout );
+ timeoutSpin.append( spin );
+ grid->addWidget( spin, gridLine, 1 );
+ lab = new QLabel( i18n("(ms)"), gb );
+ grid->addWidget( lab, gridLine, 2 );
+ ++gridLine;
+
+ if ( dvbConfig->devList.at(i)->type==FE_QPSK ) {
+ lab = new QLabel( i18n("Number of LNBs:"), gb );
+ grid->addWidget( lab, gridLine, 0 );
+ satNumber[i] = new MSpinBox( gb, i );
+ connect( satNumber[i], SIGNAL(signalValueChanged(int,int)), this, SLOT(satNumberChanged(int,int)));
+ grid->addWidget( satNumber[i], gridLine, 1 );
+ usals = new KPushButton( gb );
+ usals->setGuiItem( KGuiItem(i18n("Set rotor coordinates..."), icon->loadIconSet("move", KIcon::Small) ) );
+ connect( usals, SIGNAL(clicked()), this, SLOT(setUsals()));
+ grid->addWidget( usals, gridLine, 2 );
+
+ ++gridLine;
+
+ lnb0[i] = new MPushButton( gb, i, 0 );
+ lnb0[i]->setGuiItem( KGuiItem(i18n("LNB 1 settings..."), icon->loadIconSet("hwinfo", KIcon::Small) ) );
+ lnb0[i]->setEnabled(true);
+ grid->addWidget( lnb0[i], gridLine, 0 );
+ connect( lnb0[i], SIGNAL(clicked(int,int)), this, SLOT(setLnb(int,int)));
+ rotor0[i] = new MComboBox( gb, i, 0 );
+ rotor0[i]->insertStringList( rotorList );
+ rotor0[i]->setCurrentItem( dvbConfig->devList.at(i)->lnb[0].rotorType );
+ grid->addWidget( rotor0[i], gridLine, 1 );
+ connect( rotor0[i], SIGNAL(activated(int,int,int)), this, SLOT(setRotor(int,int,int)));
+ swidg = new QWidget( gb );
+ sgrid = new QGridLayout( swidg, 1, 1, 0, 0 );
+ sat0[i] = new QComboBox( swidg );
+ sat0[i]->insertStringList( dvbConfig->getSourcesList(dvbConfig->devList.at(i)->type) );
+ sgrid->addWidget( sat0[i], 0, 0 );
+ src0[i] = new MPushButton( swidg, i, 0 );
+ src0[i]->setGuiItem( KGuiItem(i18n("Sources list...") ) );
+ connect( src0[i], SIGNAL(clicked(int,int)), this, SLOT(setRotorSources(int,int)) );
+ sgrid->addWidget( src0[i], 1, 0 );
+ if ( dvbConfig->devList.at(i)->lnb[0].rotorType==0 ) {
+ setSource( sat0[i], dvbConfig->devList.at(i)->lnb[0].source[0] );
+ src0[i]->hide();
+ }
+ else {
+ sat0[i]->hide();
+ }
+ grid->addWidget( swidg, gridLine, 2 );
+ ++gridLine;
+
+ lnb1[i] = new MPushButton( gb, i, 1 );
+ lnb1[i]->setGuiItem( KGuiItem(i18n("LNB 2 settings..."), icon->loadIconSet("hwinfo", KIcon::Small) ) );
+ lnb1[i]->setEnabled(false);
+ grid->addWidget( lnb1[i], gridLine, 0 );
+ connect( lnb1[i], SIGNAL(clicked(int,int)), this, SLOT(setLnb(int,int)));
+ rotor1[i] = new MComboBox( gb, i, 1 );
+ rotor1[i]->setEnabled( false );
+ rotor1[i]->insertStringList( rotorList );
+ rotor1[i]->setCurrentItem( dvbConfig->devList.at(i)->lnb[1].rotorType );
+ grid->addWidget( rotor1[i], gridLine, 1 );
+ connect( rotor1[i], SIGNAL(activated(int,int,int)), this, SLOT(setRotor(int,int,int)));
+ swidg = new QWidget( gb );
+ sgrid = new QGridLayout( swidg, 1, 1, 0, 0 );
+ sat1[i] = new QComboBox( swidg );
+ sat1[i]->setEnabled(false);
+ sat1[i]->insertStringList( dvbConfig->getSourcesList(dvbConfig->devList.at(i)->type) );
+ sgrid->addWidget( sat1[i], 0, 0 );
+ src1[i] = new MPushButton( swidg, i, 1 );
+ src1[i]->setEnabled(false);
+ src1[i]->setGuiItem( KGuiItem(i18n("Sources list...") ) );
+ connect( src1[i], SIGNAL(clicked(int,int)), this, SLOT(setRotorSources(int,int)) );
+ sgrid->addWidget( src1[i], 1, 0 );
+ if ( dvbConfig->devList.at(i)->lnb[1].rotorType==0 ) {
+ setSource( sat1[i], dvbConfig->devList.at(i)->lnb[1].source[0] );
+ src1[i]->hide();
+ }
+ else {
+ sat1[i]->hide();
+ }
+ grid->addWidget( swidg, gridLine, 2 );
+ ++gridLine;
+
+ lnb2[i] = new MPushButton( gb, i, 2 );
+ lnb2[i]->setGuiItem( KGuiItem(i18n("LNB 3 settings..."), icon->loadIconSet("hwinfo", KIcon::Small) ) );
+ lnb2[i]->setEnabled(false);
+ grid->addWidget( lnb2[i], gridLine, 0 );
+ connect( lnb2[i], SIGNAL(clicked(int,int)), this, SLOT(setLnb(int,int)));
+ rotor2[i] = new MComboBox( gb, i, 2 );
+ rotor2[i]->setEnabled(false);
+ rotor2[i]->insertStringList( rotorList );
+ rotor2[i]->setCurrentItem( dvbConfig->devList.at(i)->lnb[2].rotorType );
+ grid->addWidget( rotor2[i], gridLine, 1 );
+ connect( rotor2[i], SIGNAL(activated(int,int,int)), this, SLOT(setRotor(int,int,int)));
+ swidg = new QWidget( gb );
+ sgrid = new QGridLayout( swidg, 1, 1, 0, 0 );
+ sat2[i] = new QComboBox( swidg );
+ sat2[i]->setEnabled(false);
+ sat2[i]->insertStringList( dvbConfig->getSourcesList(dvbConfig->devList.at(i)->type) );
+ sgrid->addWidget( sat2[i], 0, 0 );
+ src2[i] = new MPushButton( swidg, i, 2 );
+ src2[i]->setEnabled(false);
+ src2[i]->setGuiItem( KGuiItem(i18n("Sources list...") ) );
+ connect( src2[i], SIGNAL(clicked(int,int)), this, SLOT(setRotorSources(int,int)) );
+ sgrid->addWidget( src2[i], 1, 0 );
+ if ( dvbConfig->devList.at(i)->lnb[2].rotorType==0 ) {
+ setSource( sat2[i], dvbConfig->devList.at(i)->lnb[2].source[0] );
+ src2[i]->hide();
+ }
+ else {
+ sat2[i]->hide();
+ }
+ grid->addWidget( swidg, gridLine, 2 );
+ ++gridLine;
+
+ lnb3[i] = new MPushButton( gb, i, 3 );
+ lnb3[i]->setGuiItem( KGuiItem(i18n("LNB 4 settings..."), icon->loadIconSet("hwinfo", KIcon::Small) ) );
+ lnb3[i]->setEnabled(false);
+ grid->addWidget( lnb3[i], gridLine, 0 );
+ connect( lnb3[i], SIGNAL(clicked(int,int)), this, SLOT(setLnb(int,int)));
+ rotor3[i] = new MComboBox( gb, i, 3 );
+ rotor3[i]->setEnabled(false);
+ rotor3[i]->insertStringList( rotorList );
+ rotor3[i]->setCurrentItem( dvbConfig->devList.at(i)->lnb[3].rotorType );
+ grid->addWidget( rotor3[i], gridLine, 1 );
+ connect( rotor3[i], SIGNAL(activated(int,int,int)), this, SLOT(setRotor(int,int,int)));
+ swidg = new QWidget( gb );
+ sgrid = new QGridLayout( swidg, 1, 1, 0, 0 );
+ sat3[i] = new QComboBox( swidg );
+ sat3[i]->setEnabled(false);
+ sat3[i]->insertStringList( dvbConfig->getSourcesList(dvbConfig->devList.at(i)->type) );
+ sgrid->addWidget( sat3[i], 0, 0 );
+ src3[i] = new MPushButton( swidg, i, 3 );
+ src3[i]->setEnabled(false);
+ src3[i]->setGuiItem( KGuiItem(i18n("Sources list...") ) );
+ connect( src3[i], SIGNAL(clicked(int,int)), this, SLOT(setRotorSources(int,int)) );
+ sgrid->addWidget( src3[i], 1, 0 );
+ if ( dvbConfig->devList.at(i)->lnb[3].rotorType==0 ) {
+ setSource( sat3[i], dvbConfig->devList.at(i)->lnb[3].source[0] );
+ src3[i]->hide();
+ }
+ else {
+ sat3[i]->hide();
+ }
+ grid->addWidget( swidg, gridLine, 2 );
+ ++gridLine;
+
+ satNumber[i]->setValue( dvbConfig->devList.at(i)->numLnb );
+ }
+ else {
+ lab = new QLabel( i18n("Source:"), gb );
+ grid->addWidget( lab, gridLine, 0 );
+ sat0[i] = new QComboBox( gb );
+ if ( dvbConfig->devList.at(i)->canAutoscan )
+ sat0[i]->insertItem( "AUTO" );
+ sat0[i]->insertStringList( dvbConfig->getSourcesList(dvbConfig->devList.at(i)->type) );
+ setSource( sat0[i], dvbConfig->devList.at(i)->source );
+ grid->addWidget( sat0[i], gridLine, 1 );
+ ++gridLine;
+
+ if ( dvbConfig->devList.at(i)->canAutoscan ) {
+ lab = new QLabel( i18n("<qt>This device seems to support the <b><i>autoscan</i></b> feature. "
+ "You can choose <b>AUTO</b> in Source list to let Kaffeine "
+ "search for a range of frequencies.<br>"
+ "If <b><i>autoscan</i></b> fails to find your channels, choose a real Source in list.</qt>"), gb );
+ grid->addMultiCellWidget( lab, gridLine, gridLine, 0, 3 );
+ ++gridLine;
+ }
+ }
+ lab = new QLabel( i18n("<qt><i>If you can't find your network/location in the list, you'll have to create one. "
+ "Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing file as start point. "
+ "Fill in with the values for your network/location and give it a sensible name "
+ "(follow the naming convention). If you think your new file could be usefull for others, send it to "
+ "kaffeine-user(AT)lists.sf.net.</i></qt>"), gb );
+ grid->addMultiCellWidget( lab, gridLine, gridLine, 0, 3 );
+
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+ }
+
+ page = addPage(i18n("Recording"),i18n("DVB Recording Options"),
+ KGlobal::instance()->iconLoader()->loadIcon( "hdd_unmount", KIcon::NoGroup, KIcon::SizeMedium ) );
+ vb = new QVBoxLayout( page, 6, 6 );
+ gb = new QGroupBox( "", page );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+
+ lab = new QLabel( i18n("Records directory:"), gb );
+ grid->addWidget( lab, 0, 0 );
+ recordDirLe = new QLineEdit( gb );
+ recordDirLe->setReadOnly( true );
+ grid->addWidget( recordDirLe, 0, 1 );
+ recordDirBtn = new QToolButton( gb );
+ recordDirBtn->setIconSet( icon->loadIconSet("fileopen", KIcon::Small) );
+ grid->addWidget( recordDirBtn, 0, 2 );
+
+ lab = new QLabel( i18n("Time shifting directory:"), gb );
+ grid->addWidget( lab, 1, 0 );
+ shiftDirLe = new QLineEdit( gb );
+ shiftDirLe->setReadOnly( true );
+ grid->addWidget( shiftDirLe, 1, 1 );
+ shiftDirBtn = new QToolButton( gb );
+ shiftDirBtn->setIconSet( icon->loadIconSet("fileopen", KIcon::Small) );
+ grid->addWidget( shiftDirBtn, 1, 2 );
+
+ lab = new QLabel( i18n("Begin margin:"), gb );
+ grid->addWidget( lab, 2, 0 );
+ beginSpin = new QSpinBox( gb );
+ h1 = new QHBoxLayout();
+ h1->addWidget( beginSpin );
+ lab = new QLabel( i18n("(minutes)"), gb );
+ h1->addWidget( lab );
+ grid->addLayout( h1, 2, 1 );
+
+ lab = new QLabel( i18n("End margin:"), gb );
+ grid->addWidget( lab, 3, 0 );
+ endSpin = new QSpinBox( gb );
+ h1 = new QHBoxLayout();
+ h1->addWidget( endSpin );
+ lab = new QLabel( i18n("(minutes)"), gb );
+ h1->addWidget( lab );
+ grid->addLayout( h1, 3, 1 );
+
+ lab = new QLabel( i18n("Instant record duration:"), gb );
+ grid->addWidget( lab, 4, 0 );
+ instantDurationSpin = new QSpinBox( 1, 1440, 1, gb );
+ h1 = new QHBoxLayout();
+ h1->addWidget( instantDurationSpin );
+ lab = new QLabel( i18n("(minutes)"), gb );
+ h1->addWidget( lab );
+ grid->addLayout( h1, 4, 1 );
+
+ lab = new QLabel( i18n("Max file size (0=Unlimited):"), gb );
+ grid->addWidget( lab, 5, 0 );
+ sizeFileSpin = new QSpinBox( 1, 9999, 1, gb );
+ sizeFileSpin->setMinValue(0);
+ h1 = new QHBoxLayout();
+ h1->addWidget( sizeFileSpin );
+ lab = new QLabel( i18n("(MB)"), gb );
+ h1->addWidget( lab );
+ grid->addLayout( h1, 5, 1 );
+
+ lab = new QLabel( i18n("Filename Format:"), gb );
+ grid->addWidget( lab, 7, 0 );
+ filenameFormatLe = new QLineEdit( gb );
+ grid->addWidget( filenameFormatLe, 7, 1 );
+ helpNameBtn = new QToolButton( gb );
+ helpNameBtn->setIconSet( icon->loadIconSet("help", KIcon::Small) );
+ grid->addWidget( helpNameBtn, 7, 2 );
+
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ recordDirLe->setText( dvbConfig->recordDir );
+ shiftDirLe->setText( dvbConfig->shiftDir );
+ beginSpin->setValue( dvbConfig->beginMargin );
+ endSpin->setValue( dvbConfig->endMargin );
+ instantDurationSpin->setValue( dvbConfig->instantDuration );
+ sizeFileSpin->setValue( dvbConfig->sizeFile );
+ filenameFormatLe->setText( dvbConfig->filenameFormat );
+
+ page = addPage(i18n("Broadcasting"),i18n("DVB Broadcasting"),
+ KGlobal::instance()->iconLoader()->loadIcon( "network_local", KIcon::NoGroup, KIcon::SizeMedium ) );
+ vb = new QVBoxLayout( page, 6, 6 );
+ gb = new QGroupBox( "", page );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+
+ lab = new QLabel( i18n("Broadcast address:"), gb );
+ grid->addWidget( lab, 0, 0 );
+ broadcastLe = new QLineEdit( gb );
+ grid->addWidget( broadcastLe, 0, 1 );
+ lab = new QLabel( i18n("Broadcast port:"), gb );
+ grid->addWidget( lab, 1, 0 );
+ bportSpin = new QSpinBox( 1, 65535, 1, gb );
+ grid->addWidget( bportSpin, 1, 1 );
+ lab = new QLabel( i18n("Info port:"), gb );
+ grid->addWidget( lab, 2, 0 );
+ sportSpin = new QSpinBox( 1, 65535, 1, gb );
+ grid->addWidget( sportSpin, 2, 1 );
+
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ broadcastLe->setText( dvbConfig->broadcastAddress );
+ bportSpin->setValue( dvbConfig->broadcastPort );
+ sportSpin->setValue( dvbConfig->senderPort );
+
+ page = addPage(i18n("Misc"),i18n("Misc"),
+ KGlobal::instance()->iconLoader()->loadIcon( "misc", KIcon::NoGroup, KIcon::SizeMedium ) );
+ vb = new QVBoxLayout( page, 6, 6 );
+ gb = new QGroupBox( "", page );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+
+ lab = new QLabel( i18n("Default charset (restart needed):"), gb );
+ grid->addWidget( lab, 0, 0 );
+ charsetComb = new QComboBox( gb );
+ charsetComb->insertItem( "ISO8859-1" );
+ charsetComb->insertItem( "ISO6937" );
+ if ( dvbConfig->defaultCharset=="ISO8859-1" )
+ charsetComb->setCurrentItem( 0 );
+ else if ( dvbConfig->defaultCharset=="ISO6937" )
+ charsetComb->setCurrentItem( 1 );
+ grid->addWidget( charsetComb, 0, 1 );
+
+ lab = new QLabel( i18n("Update scan data:"), gb );
+ grid->addWidget( lab, 1, 0 );
+ updateBtn = new KPushButton( gb );
+ updateBtn->setGuiItem( KGuiItem(i18n("Download"), icon->loadIconSet("khtml_kget", KIcon::Small) ) );
+ grid->addWidget( updateBtn, 1, 1 );
+
+ lab = new QLabel( i18n("Dump epg's events to \n~/kaffeine_dvb_events.tx:"), gb );
+ grid->addWidget( lab, 2, 0 );
+ dumpBtn = new KPushButton( gb );
+ dumpBtn->setGuiItem( KGuiItem(i18n("Dump"), icon->loadIconSet("filesave", KIcon::Small) ) );
+ grid->addWidget( dumpBtn, 2, 1 );
+
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ if ( p ) {
+ page = addPage(i18n("DVB plugins"),i18n("DVB plugins"),
+ KGlobal::instance()->iconLoader()->loadIcon( "misc", KIcon::NoGroup, KIcon::SizeMedium ) );
+ vb = new QVBoxLayout( page, 6, 6 );
+ gb = new QGroupBox( "", page );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+
+ KPushButton *btn = new KPushButton( p->pluginName(), gb );
+ grid->addWidget( btn, 0, 0 );
+ connect( btn, SIGNAL(clicked()), p, SLOT(configDialog()) );
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+ }
+
+ connect( recordDirBtn, SIGNAL(clicked()), this, SLOT(setRecordDir()) );
+ connect( shiftDirBtn, SIGNAL(clicked()), this, SLOT(setShiftDir()) );
+ connect( updateBtn, SIGNAL(clicked()), this, SLOT(downloadData()) );
+ connect( helpNameBtn, SIGNAL(clicked()), this, SLOT(fileTemplateHelp()) );
+ delete icon;
+}
+
+
+
+void DvbConfigDialog::setUsals()
+{
+ KDialogBase *dlg = new KDialogBase( this, "usalsConfigDialog", true, i18n("Rotors settings"), Ok|Cancel, Ok, true );
+ QGridLayout *grid;
+ QWidget *page = new QWidget( dlg );
+ dlg->setMainWidget( page );
+
+ QVBoxLayout *vb = new QVBoxLayout( page, 6, 6 );
+ QLabel *lab = new QLabel( i18n("Set your position coordinates for rotors:"), page );
+ vb->addWidget( lab );
+ lab = new QLabel( "(Sydney: -33.8916, 151.2417 - New York: 40.7139, -74.0063)", page );
+ vb->addWidget( lab );
+ grid = new QGridLayout( 0, 1, 1 );
+ lab = new QLabel( i18n("Latitude:"), page );
+ grid->addWidget( lab, 0, 0 );
+ QLineEdit *latitude = new QLineEdit( page );
+ latitude->setText( QString().setNum( dvbConfig->usalsLatitude ) );
+ grid->addWidget( latitude, 0, 1 );
+ lab = new QLabel( i18n("Longitude:"), page );
+ grid->addWidget( lab, 1, 0 );
+ QLineEdit *longitude = new QLineEdit( page );
+ longitude->setText( QString().setNum( dvbConfig->usalsLongitude ) );
+ grid->addWidget( longitude, 1, 1 );
+ vb->addLayout( grid );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ if ( dlg->exec()==QDialog::Accepted ) {
+ dvbConfig->usalsLatitude = latitude->text().toDouble();
+ dvbConfig->usalsLongitude = longitude->text().toDouble();
+ for ( int i=0; i<(int)dvbConfig->devList.count(); i++ ) {
+ dvbConfig->devList.at(i)->usalsLatitude = dvbConfig->usalsLatitude;
+ dvbConfig->devList.at(i)->usalsLongitude = dvbConfig->usalsLongitude;
+ }
+ }
+}
+
+
+
+void DvbConfigDialog::setRotorSources( int devNum, int lnbNum )
+{
+ RotorConfig rotor( dvbConfig->devList.at(devNum), dvbConfig, lnbNum, this );
+ rotor.exec();
+}
+
+
+
+void DvbConfigDialog::setRotor( int index, int devNum, int lnbNum )
+{
+ QComboBox *comb;
+ QPushButton *btn;
+
+ switch ( lnbNum ) {
+ case 0 : comb=sat0[devNum]; btn=src0[devNum]; break;
+ case 1 : comb=sat1[devNum]; btn=src1[devNum]; break;
+ case 2 : comb=sat2[devNum]; btn=src2[devNum]; break;
+ case 3 : comb=sat3[devNum]; btn=src3[devNum]; break;
+ default : return;
+ }
+
+ dvbConfig->devList.at(devNum)->lnb[lnbNum].rotorType=index;
+
+ if ( index==0 ) {
+ btn->hide();
+ comb->show();
+ }
+ else {
+ comb->hide();
+ btn->show();
+ }
+}
+
+
+
+void DvbConfigDialog::setLnb( int devNum, int lnbNum )
+{
+ LnbConfig lnb( &dvbConfig->devList.at(devNum)->lnb[lnbNum], this );
+ lnb.exec();
+}
+
+
+
+void DvbConfigDialog::downloadData()
+{
+ int ret;
+
+loop:
+ if ( !dvbConfig->loadDvbData(0) ) {
+ ret = KMessageBox::questionYesNo( this, i18n("<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!<br>\
+ Check your internet connection, and say Yes to try again.<br>\
+ Or say No to cancel.<br> Should I try again?</qt>") );
+ if ( ret==KMessageBox::Yes )
+ goto loop;
+ return;
+ }
+}
+
+
+
+void DvbConfigDialog::setSource( QComboBox *box, QString s )
+{
+ int pos, i;
+
+ pos = s.find("|");
+ if ( pos>=0 )
+ s = s.right( s.length()-pos-1 );
+ for ( i=0; i<(int)box->count(); i++ ) {
+ if ( box->text(i)==s ) {
+ box->setCurrentItem(i);
+ break;
+ }
+ }
+}
+
+
+
+void DvbConfigDialog::satNumberChanged( int value, int devNum )
+{
+ sat0[devNum]->setEnabled( value > 0 );
+ sat1[devNum]->setEnabled( value > 1 );
+ sat2[devNum]->setEnabled( value > 2 );
+ sat3[devNum]->setEnabled( value > 3 );
+
+ src0[devNum]->setEnabled( value > 0 );
+ src1[devNum]->setEnabled( value > 1 );
+ src2[devNum]->setEnabled( value > 2 );
+ src3[devNum]->setEnabled( value > 3 );
+
+ lnb0[devNum]->setEnabled( value > 0 );
+ lnb1[devNum]->setEnabled( value > 1 );
+ lnb2[devNum]->setEnabled( value > 2 );
+ lnb3[devNum]->setEnabled( value > 3 );
+
+ rotor0[devNum]->setEnabled( value > 0 );
+ rotor1[devNum]->setEnabled( value > 1 );
+ rotor2[devNum]->setEnabled( value > 2 );
+ rotor3[devNum]->setEnabled( value > 3 );
+}
+
+
+
+void DvbConfigDialog::fileTemplateHelp()
+{
+ KMessageBox::information( this, i18n("Special strings are:\n- %chan (channel's name)\n- %date (the starting date, YYMMdd-hhmmss)\n- %name (the name given in timer editor or the program name from EPG)\nSo, if you set template to '%chan-%date-%name', the resulting filename will be, for example, BBC-20070919-210000-News.m2t") );
+}
+
+
+
+void DvbConfigDialog::setRecordDir()
+{
+ QString s = KFileDialog::getExistingDirectory( recordDirLe->text().stripWhiteSpace() );
+ if ( !s.isEmpty() )
+ recordDirLe->setText( s );
+}
+
+
+
+void DvbConfigDialog::setShiftDir()
+{
+ QString s = KFileDialog::getExistingDirectory( shiftDirLe->text().stripWhiteSpace() );
+ if ( !s.isEmpty() )
+ shiftDirLe->setText( s );
+}
+
+
+
+void DvbConfigDialog::accept()
+{
+ QString s;
+ int i;
+
+ if ( recordDirLe->text().stripWhiteSpace().isEmpty() ) {
+ KMessageBox::sorry( this, i18n("Invalid records directory.") );
+ recordDirLe->setFocus();
+ return;
+ }
+ if ( shiftDirLe->text().stripWhiteSpace().isEmpty() ) {
+ KMessageBox::sorry( this, i18n("Invalid time shifting directory.") );
+ shiftDirLe->setFocus();
+ return;
+ }
+ if ( bportSpin->value()==sportSpin->value() ) {
+ KMessageBox::sorry( this, i18n("Broadcast and Info ports must be different.") );
+ sportSpin->setFocus();
+ return;
+ }
+ if ( !QRegExp("(\\d{1,3}\\.){3}\\d{1,3}").exactMatch( broadcastLe->text().stripWhiteSpace() ) ) {
+ KMessageBox::sorry( this, i18n("Invalid broadcast address.") );
+ broadcastLe->setFocus();
+ return;
+ }
+ if ( !filenameFormatLe->text().contains("%chan") && !filenameFormatLe->text().contains("%date") && !filenameFormatLe->text().contains("%name") ) {
+ KMessageBox::sorry( this, i18n("Invalid filename format.") );
+ filenameFormatLe->setFocus();
+ return;
+ }
+
+ for ( i=0; i<(int)dvbConfig->devList.count(); i++ ) {
+ switch (dvbConfig->devList.at(i)->type) {
+ case FE_QPSK: {
+ dvbConfig->devList.at(i)->numLnb = satNumber[i]->value();
+ if ( dvbConfig->devList.at(i)->lnb[3].rotorType==0 ) {
+ dvbConfig->devList.at(i)->lnb[3].source.clear();
+ dvbConfig->devList.at(i)->lnb[3].source.append(sat3[i]->currentText());
+ }
+ if ( dvbConfig->devList.at(i)->lnb[2].rotorType==0 ) {
+ dvbConfig->devList.at(i)->lnb[2].source.clear();
+ dvbConfig->devList.at(i)->lnb[2].source.append(sat2[i]->currentText());
+ }
+ if ( dvbConfig->devList.at(i)->lnb[1].rotorType==0 ) {
+ dvbConfig->devList.at(i)->lnb[1].source.clear();
+ dvbConfig->devList.at(i)->lnb[1].source.append(sat1[i]->currentText());
+ }
+ if ( dvbConfig->devList.at(i)->lnb[0].rotorType==0 ) {
+ dvbConfig->devList.at(i)->lnb[0].source.clear();
+ dvbConfig->devList.at(i)->lnb[0].source.append(sat0[i]->currentText());
+ }
+ s = "S";
+ break;
+ }
+ case FE_QAM: {
+ s = "C";
+ s+="|"+sat0[i]->currentText();
+ break;
+ }
+ case FE_OFDM: {
+ s = "T";
+ s+="|"+sat0[i]->currentText();
+ break;
+ }
+ case FE_ATSC: {
+ s = "A";
+ s+="|"+sat0[i]->currentText();
+ break;
+ }
+ }
+ dvbConfig->devList.at(i)->source = s;
+ dvbConfig->devList.at(i)->tuningTimeout = timeoutSpin.at(i)->value();
+ }
+
+ dvbConfig->recordDir = recordDirLe->text();
+ if ( !dvbConfig->recordDir.endsWith("/") )
+ dvbConfig->recordDir+= "/";
+ dvbConfig->shiftDir = shiftDirLe->text();
+ if ( !dvbConfig->shiftDir.endsWith("/") )
+ dvbConfig->shiftDir+= "/";
+ dvbConfig->beginMargin = beginSpin->value();
+ dvbConfig->endMargin = endSpin->value();
+ dvbConfig->instantDuration = instantDurationSpin->value();
+ dvbConfig->sizeFile = sizeFileSpin->value();
+ dvbConfig->filenameFormat = filenameFormatLe->text();
+ dvbConfig->defaultCharset = charsetComb->currentText();
+ dvbConfig->broadcastAddress = broadcastLe->text().stripWhiteSpace();
+ dvbConfig->broadcastPort = bportSpin->value();
+ dvbConfig->senderPort = sportSpin->value();
+ dvbConfig->saveConfig();
+ done( Accepted );
+}
+
+
+
+DvbConfigDialog::~DvbConfigDialog()
+{
+}
+
+
+
+LnbConfig::LnbConfig( LNB *b, QWidget *parent ) :
+ KDialogBase ( parent, "lnbConfigDialog", true, i18n("LNB Settings"), Ok|Cancel, Ok, true )
+{
+ QGridLayout *grid;
+
+ QWidget *page = new QWidget( this );
+ setMainWidget( page );
+
+ lnb = b;
+
+ QVBoxLayout *vb = new QVBoxLayout( page, 6, 6 );
+ univ = new QPushButton( i18n("Universal LNB"), page );
+ connect( univ, SIGNAL(clicked()), this, SLOT(setUniversal()) );
+ vb->addWidget( univ );
+ cmono = new QPushButton( i18n("C-Band LNB"), page );
+ connect( cmono, SIGNAL(clicked()), this, SLOT(setCBandMono()) );
+ vb->addWidget( cmono );
+ cmulti = new QPushButton( i18n("C-Band Multipoint LNB"), page );
+ connect( cmulti, SIGNAL(clicked()), this, SLOT(setCBandMulti()) );
+ vb->addWidget( cmulti );
+
+ grid = new QGridLayout( 0, 1, 1 );
+ nLO = new QButtonGroup( 3, Qt::Horizontal, page );
+ connect( nLO, SIGNAL(clicked(int)), this, SLOT(setDual(int)) );
+ new QRadioButton( i18n("Dual LO"), nLO );
+ new QRadioButton( i18n("Single LO"), nLO );
+ new QRadioButton( i18n("H/V LO"), nLO );
+ grid->addMultiCellWidget( nLO, 0, 0, 0, 1 );
+ slofLab = new QLabel( i18n("Dual LO switch frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( slofLab, 1, 0 );
+ slof = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( slof, 1, 1 );
+ loLab = new QLabel( i18n("Lo-band frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( loLab, 2, 0 );
+ lo = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( lo, 2, 1 );
+ hiLab = new QLabel( i18n("Hi-band frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( hiLab, 3, 0 );
+ hi = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( hi, 3, 1 );
+ singleLab = new QLabel( i18n("Single LO frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( singleLab, 4, 0 );
+ single = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( single, 4, 1 );
+ verticalLab = new QLabel( i18n("Vertical pol. LO frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( verticalLab, 5, 0 );
+ vertical = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( vertical, 5, 1 );
+ horizontalLab = new QLabel( i18n("Horizontal pol. LO frequency:")+i18n(" (MHz)"), page );
+ grid->addWidget( horizontalLab, 6, 0 );
+ horizontal = new QSpinBox( 0, 13000, 1, page );
+ grid->addWidget( horizontal, 6, 1 );
+
+ vb->addLayout( grid );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+
+ slof->setValue( lnb->switchFreq );
+ lo->setValue( lnb->loFreq );
+ hi->setValue( lnb->hiFreq );
+ single->setValue( lnb->loFreq );
+ vertical->setValue( lnb->loFreq );
+ horizontal->setValue( lnb->hiFreq );
+
+ if ( lnb->switchFreq ) {
+ nLO->setButton( 0 );
+ setDual( 0 );
+ }
+ else {
+ if ( lnb->hiFreq ) {
+ nLO->setButton( 2 );
+ setDual( 2 );
+ }
+ else {
+ nLO->setButton( 1 );
+ setDual( 1 );
+ }
+ }
+}
+
+
+
+void LnbConfig::setDual( int id )
+{
+ switch ( id ) {
+ case 0: {
+ singleLab->hide();
+ single->hide();
+ verticalLab->hide();
+ vertical->hide();
+ horizontalLab->hide();
+ horizontal->hide();
+ slofLab->show();
+ slof->show();
+ loLab->show();
+ lo->show();
+ hiLab->show();
+ hi->show();
+ break;
+ }
+ case 1: {
+ slofLab->hide();
+ slof->hide();
+ loLab->hide();
+ lo->hide();
+ hiLab->hide();
+ hi->hide();
+ verticalLab->hide();
+ vertical->hide();
+ horizontalLab->hide();
+ horizontal->hide();
+ singleLab->show();
+ single->show();
+ break;
+ }
+ case 2: {
+ slofLab->hide();
+ slof->hide();
+ loLab->hide();
+ lo->hide();
+ hiLab->hide();
+ hi->hide();
+ singleLab->hide();
+ single->hide();
+ verticalLab->show();
+ vertical->show();
+ horizontalLab->show();
+ horizontal->show();
+ break;
+ }
+ }
+}
+
+
+
+void LnbConfig::setUniversal()
+{
+ nLO->setButton( 0 );
+ setDual( 0 );
+ slof->setValue( 11700 );
+ lo->setValue( 9750 );
+ hi->setValue( 10600 );
+}
+
+
+
+void LnbConfig::setCBandMono()
+{
+ nLO->setButton( 1 );
+ setDual( 1 );
+ single->setValue( 5150 );
+}
+
+
+
+void LnbConfig::setCBandMulti()
+{
+ nLO->setButton( 2 );
+ setDual( 2 );
+ vertical->setValue( 5150 );
+ horizontal->setValue( 5750 );
+}
+
+
+
+void LnbConfig::accept()
+{
+ switch ( nLO->selectedId() ) {
+ case 0: {
+ lnb->switchFreq = slof->value();
+ lnb->loFreq = lo->value();
+ lnb->hiFreq = hi->value();
+ break;
+ }
+ case 1: {
+ lnb->switchFreq = 0;
+ lnb->hiFreq = 0;
+ lnb->loFreq = single->value();
+ break;
+ }
+ case 2: {
+ lnb->switchFreq = 0;
+ lnb->loFreq = vertical->value();
+ lnb->hiFreq = horizontal->value();
+ break;
+ }
+ }
+ done( Accepted );
+}
+
+
+
+RotorConfig::RotorConfig( Device *d, DVBconfig *c, int lnb, QWidget *parent ) :
+ KDialogBase ( parent, "rotorConfigDialog", true, i18n("Rotor Settings"), Ok|Cancel, Ok, true )
+{
+ int i;
+
+ QWidget *page = new QWidget( this );
+ setMainWidget( page );
+
+ dev = d;
+ config = c;
+ lnbNum = lnb;
+
+ QVBoxLayout *vb = new QVBoxLayout( page, 6, 6 );
+ QGridLayout *grid = new QGridLayout( 0, 1, 1 );
+ QLabel *lab = new QLabel( i18n("Sattelite:"), page );
+ grid->addWidget( lab, 0, 0 );
+ if ( dev->lnb[lnbNum].rotorType==2 ) {
+ lab = new QLabel( i18n("Position:"), page );
+ grid->addWidget( lab, 0, 1 );
+ }
+ srcComb = new QComboBox( page );
+ srcComb->insertStringList( config->getSourcesList( dev->type ) );
+ grid->addWidget( srcComb, 1, 0 );
+ position = new QSpinBox( 0, 500, 1, page );
+ grid->addWidget( position, 1, 1 );
+ vb->addLayout( grid );
+ vb->addItem( new QSpacerItem( 20, 10, QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+
+ addBtn = new QPushButton( i18n("Add to list"), page );
+ connect( addBtn, SIGNAL(clicked()), this, SLOT(add()) );
+ vb->addWidget( addBtn );
+ vb->addItem( new QSpacerItem( 20, 10, QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+
+ listView = new QListView( page );
+ listView->addColumn( i18n("Sattelite:") );
+ vb->addWidget( listView );
+
+ resetBtn = new QPushButton( i18n("Clear list"), page );
+ connect( resetBtn, SIGNAL(clicked()), this, SLOT(reset()) );
+ vb->addWidget( resetBtn );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+
+ grid = new QGridLayout( 0, 1, 1 );
+ lab = new QLabel( i18n("13V rotor speed:"), page );
+ grid->addWidget( lab, 0, 0 );
+ speed13 = new QLineEdit( page );
+ speed13->setText( QString().setNum( dev->lnb[lnbNum].speed13v ) );
+ grid->addWidget( speed13, 0, 1 );
+ lab = new QLabel( i18n("sec./ °"), page );
+ grid->addWidget( lab, 0, 2 );
+ lab = new QLabel( i18n("18V rotor speed:"), page );
+ grid->addWidget( lab, 1, 0 );
+ speed18 = new QLineEdit( page );
+ speed18->setText( QString().setNum( dev->lnb[lnbNum].speed18v ) );
+ grid->addWidget( speed18, 1, 1 );
+ lab = new QLabel( i18n("sec./ °"), page );
+ grid->addWidget( lab, 1, 2 );
+ vb->addLayout( grid );
+
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ if ( dev->lnb[lnbNum].rotorType==2 ) {
+ listView->addColumn( i18n("Position:") );
+ for ( i=0; i<(int)dev->lnb[lnbNum].source.count(); i++ )
+ new QListViewItem( listView, dev->lnb[lnbNum].source[i], QString().setNum(dev->lnb[lnbNum].position[i]) );
+ }
+ else {
+ position->hide();
+ for ( i=0; i<(int)dev->lnb[lnbNum].source.count(); i++ )
+ new QListViewItem( listView, dev->lnb[lnbNum].source[i] );
+ }
+
+}
+
+
+
+void RotorConfig::reset()
+{
+ listView->clear();
+ position->setValue( 1 );
+}
+
+
+
+void RotorConfig::add()
+{
+ if ( position->isHidden() ) {
+ new QListViewItem( listView, srcComb->currentText() );
+ }
+ else {
+ new QListViewItem( listView, srcComb->currentText(), QString().setNum(position->value()) );
+ }
+
+}
+
+
+
+void RotorConfig::accept()
+{
+ QListViewItem *it;
+
+ dev->lnb[lnbNum].speed18v = speed18->text().toDouble();
+ dev->lnb[lnbNum].speed13v = speed13->text().toDouble();
+ dev->lnb[lnbNum].source.clear();
+ dev->lnb[lnbNum].position.clear();
+ for ( it=listView->firstChild(); it; it=it->nextSibling() ) {
+ dev->lnb[lnbNum].source.append( it->text(0) );
+ if ( dev->lnb[lnbNum].rotorType==2 )
+ dev->lnb[lnbNum].position.append( it->text(1).toInt() );
+ }
+ done( Accepted );
+}
+
+
+#include "dvbconfig.moc"
diff --git a/kaffeine/src/input/dvb/dvbconfig.h b/kaffeine/src/input/dvb/dvbconfig.h
new file mode 100644
index 0000000..f52b9cc
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbconfig.h
@@ -0,0 +1,301 @@
+/*
+ * dvbconfig.h
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DVBCONFIG_H
+#define DVBCONFIG_H
+
+#include <qspinbox.h>
+#include <qlabel.h>
+#include <qlineedit.h>
+#include <qcombobox.h>
+#include <qtoolbutton.h>
+#include <qbuttongroup.h>
+#include <qlistview.h>
+
+#include <kdialogbase.h>
+#include <kpushbutton.h>
+#include <kconfig.h>
+#include <kio/job.h>
+#include <kprogress.h>
+
+#include <linux/dvb/frontend.h>
+
+using namespace KIO;
+
+class MSpinBox : public QSpinBox
+{
+ Q_OBJECT
+public:
+ MSpinBox( QWidget *parent, int devNum );
+public slots:
+ void slotValueChanged( int value );
+signals:
+ void signalValueChanged( int value, int devNum );
+private:
+ int deviceNumber;
+};
+
+
+
+class MPushButton : public KPushButton
+{
+ Q_OBJECT
+public:
+ MPushButton( QWidget *parent, int devNum, int lnbNum );
+private slots:
+ void isClicked();
+signals:
+ void clicked( int devnum, int lnbnum );
+private:
+ int deviceNumber;
+ int lnbNumber;
+};
+
+
+
+class MComboBox : public QComboBox
+{
+ Q_OBJECT
+public:
+ MComboBox( QWidget *parent, int devNum, int lnbNum );
+private slots:
+ void isActivated( int index );
+signals:
+ void activated( int index, int devnum, int lnbnum );
+private:
+ int deviceNumber;
+ int lnbNumber;
+};
+
+
+
+class LNB
+{
+public:
+ LNB();
+
+ unsigned int switchFreq;
+ unsigned int loFreq;
+ unsigned int hiFreq;
+ int rotorType;
+ double speed13v, speed18v;
+ QStringList source;
+ QValueList<int> position;
+ QString currentSource;
+};
+
+
+
+class Device
+{
+public:
+ Device( int anum, int tnum, fe_type_t t, const QString &n, bool as );
+ int adapter, tuner;
+ fe_type_t type;
+ QString name;
+ QString source;
+ int numLnb;
+ LNB lnb[4];
+ bool canAutoscan;
+ int tuningTimeout;
+ double usalsLatitude, usalsLongitude;
+};
+
+
+
+class Category
+{
+public:
+ Category( const QString &tname, const QString &ticon );
+ QString name;
+ QString icon;
+};
+
+
+
+class DVBconfig : public QObject
+{
+ Q_OBJECT
+
+public:
+
+ DVBconfig( const QString &dvbConf );
+ ~DVBconfig();
+ void readConfig();
+ void saveConfig();
+ int readDvbChanOrder();
+ void saveDvbChanOrder( int s, int col );
+ void startup();
+ static bool haveDvbDevice();
+ bool loadDvbData( QWidget *parent );
+ bool localData();
+ QStringList getSourcesList( fe_type_t type );
+ bool haveData();
+ bool firstRun();
+ void addCategory( const QString &name, const QString &icon );
+ void removeCategory( const QString &name );
+ void changeIconCategory( const QString &name, const QString &icon );
+
+ KConfig *config;
+ QString recordDir, shiftDir, filenameFormat;
+ int beginMargin, endMargin, instantDuration, sizeFile;
+ QSize epgSize, scanSize, timerSize;
+ QPtrList<Device> devList;
+ QPtrList<Category> categories;
+ QString allIcon, tvIcon, radioIcon;
+ QString dvbConfigDir;
+ QString dvbConfigIconsDir;
+ QString broadcastAddress;
+ int broadcastPort, senderPort;
+ int lastChannel;
+ QValueList<int> splitSizes;
+ QString defaultCharset;
+ double usalsLatitude, usalsLongitude;
+
+private:
+
+ KProgressDialog *downProgress;
+ bool downloadFinished;
+
+private slots:
+
+ void setDownloadResult( KIO::Job *job );
+ void setDownloadPercent( KIO::Job *job, unsigned long percent );
+};
+
+
+
+class KaffeineDvbPlugin;
+
+class DvbConfigDialog : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+
+ DvbConfigDialog( DVBconfig *dc, QWidget *parent, KaffeineDvbPlugin *p );
+ ~DvbConfigDialog();
+ void setSource( QComboBox *box, QString s );
+
+ QLineEdit *recordDirLe, *shiftDirLe, *broadcastLe, *filenameFormatLe;
+ QSpinBox *beginSpin, *endSpin, *instantDurationSpin, *bportSpin, *sportSpin, *sizeFileSpin;
+ MSpinBox *satNumber[8];
+ QComboBox *sat0[8];
+ QComboBox *sat1[8];
+ QComboBox *sat2[8];
+ QComboBox *sat3[8];
+ MPushButton *src0[8];
+ MPushButton *src1[8];
+ MPushButton *src2[8];
+ MPushButton *src3[8];
+ MComboBox *rotor0[8];
+ MComboBox *rotor1[8];
+ MComboBox *rotor2[8];
+ MComboBox *rotor3[8];
+ MPushButton *lnb0[8];
+ MPushButton *lnb1[8];
+ MPushButton *lnb2[8];
+ MPushButton *lnb3[8];
+ KPushButton *updateBtn, *dumpBtn;
+ QToolButton *recordDirBtn, *shiftDirBtn, *helpNameBtn;
+ DVBconfig *dvbConfig;
+ QComboBox *charsetComb;
+ QPtrList<QSpinBox> timeoutSpin;
+
+private slots:
+
+ void fileTemplateHelp();
+ void setRecordDir();
+ void setShiftDir();
+ void satNumberChanged( int value, int devNum );
+ void downloadData();
+ void setLnb( int devNum, int lnbNum );
+ void setRotor( int index, int devNum, int lnbNum );
+ void setRotorSources( int devNum, int lnbNum );
+ void setUsals();
+
+protected slots:
+
+ virtual void accept();
+};
+
+
+
+class LnbConfig : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+
+ LnbConfig( LNB *b, QWidget *parent );
+
+protected slots:
+
+ virtual void accept();
+ void setDual( int id );
+ void setUniversal();
+ void setCBandMono();
+ void setCBandMulti();
+
+private:
+
+ QSpinBox *slof;
+ QSpinBox *lo, *hi, *single, *vertical, *horizontal;
+ QLabel *slofLab, *loLab, *hiLab, *singleLab, *verticalLab, *horizontalLab;
+ QButtonGroup *nLO;
+ QPushButton *univ, *cmono, *cmulti;
+
+ LNB *lnb;
+};
+
+
+
+class RotorConfig : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+
+ RotorConfig( Device *d, DVBconfig *c, int lnb, QWidget *parent );
+
+protected slots:
+
+ virtual void accept();
+
+private slots:
+
+ void reset();
+ void add();
+
+private:
+
+ QSpinBox *position;
+ QComboBox *srcComb;
+ QListView *listView;
+ QPushButton *addBtn, *resetBtn;
+ QLineEdit *speed13, *speed18;
+
+ Device *dev;
+ int lnbNum;
+ DVBconfig *config;
+};
+
+
+#endif /* DVBCONFIG_H */
diff --git a/kaffeine/src/input/dvb/dvbevents.cpp b/kaffeine/src/input/dvb/dvbevents.cpp
new file mode 100644
index 0000000..13e1265
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbevents.cpp
@@ -0,0 +1,424 @@
+/*
+ * dvbevents.cpp
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#include <qdatetime.h>
+#include <qfile.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+#include <ktrader.h>
+#include <kparts/componentfactory.h>
+
+#include "dvbevents.h"
+
+
+
+DVBevents::DVBevents( QString devType, int anum, int tnum, const QString &charset, EventTable *table )
+ : KaffeineDVBsection( anum, tnum, charset )
+{
+ events = table;
+ KaffeineEpgPlugin *plug;
+ QString plugName;
+ int error;
+
+ KTrader::OfferList offers = KTrader::self()->query("KaffeineEpgPlugin");
+ KTrader::OfferList::Iterator end( offers.end() );
+ for ( KTrader::OfferList::Iterator it=offers.begin(); it!=end; ++it ) {
+ error = 0;
+ KService::Ptr ptr = (*it);
+ if ( !ptr->name().contains(devType) )
+ continue;
+ plug = KParts::ComponentFactory::createPartInstanceFromService<KaffeineEpgPlugin>(ptr, 0, ptr->name().ascii(), 0, 0, 0, &error );
+ plugName = ptr->desktopEntryName();
+ if (error > 0) {
+ fprintf( stderr, "Loading of EPG plugin %s failed: %s\n", plugName.ascii(), KLibLoader::self()->lastErrorMessage().ascii() );
+ plug = NULL;
+ }
+ else {
+ plugs.append( plug );
+ plug->setTable( table );
+ plug->initSection( anum, tnum, charset );
+ plugNames.append( plugName );
+ }
+ }
+ fprintf( stderr, "%d EPG plugins loaded for device %d:%d.\n", plugs.count(), anum, tnum );
+}
+
+
+
+DVBevents::~DVBevents()
+{
+ int i;
+
+ isRunning = false;
+ if ( !wait(2000) ) {
+ terminate();
+ wait();
+ }
+ for ( i=0; i<(int)plugs.count(); ++i ) {
+ plugs.at(i)->stop();
+ KService::Ptr service = KService::serviceByDesktopName( plugNames[i] );
+ KLibLoader::self()->unloadLibrary( service->library().ascii() );
+ }
+}
+
+
+
+bool DVBevents::shortEventDesc( unsigned char *buf, EventDesc *desc )
+{
+ QString name, text;
+ int len, len2;
+ ShortEvent *ev;
+
+ if ( !safeLen( buf+6 ) )
+ return false;
+ len = getBits(buf,40,8);
+ if ( !safeLen( buf+6+len ) )
+ return false;
+ name = getText( buf+6, len );
+ if ( !safeLen( buf+6+len+1 ) )
+ return false;
+ len2 = getBits(buf+6+len,0,8);
+ if ( !safeLen( buf+7+len+len2 ) )
+ return false;
+ text = getText( buf+7+len, len2);
+ if ( desc->title.isEmpty() ) {
+ desc->title=name;
+ desc->subtitle=text;
+ return true;
+ }
+ desc->shortEvents.append( new ShortEvent() );
+ ev = desc->shortEvents.getLast();
+ ev->name = name;
+ ev->text = text;
+ return true;
+}
+
+
+
+bool DVBevents::extEventDesc( unsigned char *buf, EventDesc *desc )
+{
+ int loop, len1, len2;
+ unsigned char *b = buf;
+ QString s;
+
+ if ( !safeLen( b+7 ) )
+ return false;
+ loop = getBits(b+6,0,8);
+ b +=7;
+
+ while ( loop>0 ) {
+ if ( !safeLen( b+1 ) )
+ return false;
+ len1 = getBits(b,0,8);
+ if ( !safeLen( b+1+len1 ) )
+ return false;
+ s = getText(b+1,len1);
+ if ( !safeLen( b+1+len1+1 ) )
+ return false;
+ len2 = getBits(b+1+len1,0,8);
+ if ( !safeLen( buf+2+len1+len2 ) )
+ return false;
+ if ( !s.isEmpty() )
+ s = s+" : ";
+ s = s+getText(b+2+len1,len2);
+ desc->extEvents.append( new QString( s ) );
+ b +=(2+len1+len2);
+ loop -=(2+len1+len2);
+ }
+ if ( !safeLen( b+1 ) )
+ return false;
+ len1 = getBits(b,0,8);
+ if ( !safeLen( b+1+len1 ) )
+ return false;
+ s = getText(b+1,len1);
+ desc->extEvents.append( new QString( s ) );
+ return true;
+}
+
+
+
+bool DVBevents::tableEIT( unsigned char* buffer )
+{
+ unsigned char* buf = buffer;
+ unsigned int length, loop, sid, tid, eid, tsid, sn, lsn, nid;
+ int i, sec;
+ EventDesc *desc=0, *itdesc=0;
+ EventSid *slist;
+ QPtrList<EventDesc> *currentEvents;
+ bool nodesc, parse;
+ QDateTime start, cur, dt;
+ unsigned int cdt = QDateTime::currentDateTime().toTime_t();
+
+ tid = getBits(buf,0,8);
+ length = getBits(buf,12,12);
+ sid = getBits(buf,24,16);
+ sn = getBits(buf,48,8);
+ lsn = getBits(buf,56,8);
+ tsid = getBits(buf,64,16);
+ nid = getBits(buf,80,16);
+ length -=11;
+ buf +=14;
+
+ slist = currentSrc->getEventSid( nid, tsid, sid );
+ if ( !slist )
+ return false;
+ slist->lock();
+ currentEvents = slist->getEvents();
+ QPtrListIterator<EventDesc> it( *currentEvents );
+
+ while ( length>4 ) {
+ nodesc=parse=false;
+ if ( !safeLen( buf+2 ) )
+ goto stop;
+ eid = getBits(buf,0,16);
+ if ( !safeLen( buf+2+5 ) )
+ goto stop;
+ start = getDateTime( buf+2 );
+ nodesc=parse=true;
+
+ it.toFirst();
+ while ( (desc=it.current())!=0 ) {
+ if ( desc->sid==sid ) {
+ if ( desc->startDateTime==start || desc->eid==eid ) {
+ if ( desc->tid==0x4e && tid!=0x4e ) {
+ parse = false;
+ nodesc = false;
+ break;
+ }
+ else {
+ nodesc = false;
+ if ( (cdt-desc->loop)<300 ) { // only reparse events every 300 seconds
+ parse = false;
+ }
+ else {
+ desc->extEvents.clear();
+ desc->shortEvents.clear();
+ desc->title=desc->subtitle="";
+ }
+ break;
+ }
+ }
+ }
+ ++it;
+ }
+
+ if ( nodesc )
+ desc = new EventDesc();
+ if ( parse ) {
+ if ( !safeLen( buf+10 ) )
+ goto stop;
+ desc->duration = getTime( buf+7 );
+ if ( !safeLen( buf+11 ) )
+ goto stop;
+ desc->running = getBits(buf,80,3);
+ desc->sid = sid;
+ desc->tid = tid;
+ desc->tsid = tsid;
+ desc->nid = nid;
+ desc->lsn = lsn;
+ desc->sn = sn;
+ desc->eid = eid;
+ desc->loop = cdt;
+ }
+
+ if ( desc->sn != sn ) {
+ slist->unlock();
+ return false;
+ }
+ if ( !safeLen( buf+12 ) )
+ goto stop;
+ loop = getBits(buf,84,12);
+ buf +=12;
+ length -=(12+loop);
+ while ( loop>0 ) {
+ if ( parse ) {
+ if ( !safeLen( buf+1 ) )
+ goto stop;
+ switch ( getBits(buf,0,8) ) {
+ case 0x4D :
+ if ( !shortEventDesc( buf, desc ) )
+ goto stop;
+ break;
+ case 0x4E :
+ if ( !extEventDesc( buf, desc ) )
+ goto stop;
+ break;
+ default :
+ break;
+ }
+ }
+ if ( !safeLen( buf+2 ) )
+ goto stop;
+ loop -=( getBits(buf,8,8)+2 );
+ buf +=( getBits(buf,8,8)+2 );
+ }
+//out:
+ if ( parse ) {
+ if ( !nodesc ) {
+ if ( start==desc->startDateTime )
+ goto ifend;
+ currentEvents->take( currentEvents->find( desc ) );
+ }
+ desc->startDateTime = start;
+ for ( i=0; i<(int)currentEvents->count(); i++ ) {
+ itdesc = currentEvents->at(i);
+ if ( desc->startDateTime<itdesc->startDateTime ) {
+ currentEvents->insert( i, desc );
+ break;
+ }
+ itdesc = 0;
+ }
+ if ( !itdesc )
+ currentEvents->append( desc );
+ }
+ifend:
+ if ( parse )
+ ++(desc->sn);
+ if ( nodesc ) {
+ cur = QDateTime::currentDateTime();
+ dt = desc->startDateTime;
+ sec = desc->duration.hour()*3600+desc->duration.minute()*60+desc->duration.second();
+ if ( dt.addSecs( sec )<cur || desc->title.length()<3 ) {
+ currentEvents->remove( desc );
+ }
+ else
+ desc->source = currentSrc->getSource();
+ }
+
+ }
+ slist->unlock();
+ return true;
+stop:
+ slist->unlock();
+ fprintf( stderr, "Stop parsing EIT (%d:%d)\n", adapter, tuner );
+ if ( nodesc )
+ delete desc;
+ return false;
+}
+
+
+
+
+bool DVBevents::safeLen( unsigned char* buf )
+{
+ if ( buf<(secbuf+readSize) )
+ return true;
+ fprintf( stderr, "EIT (%d:%d) : buffer overflow! Rejected\n", adapter, tuner );
+ return false;
+}
+
+
+
+bool DVBevents::go( QString src, int freqKHz, bool all )
+{
+ int tid, i;
+
+ if ( isRunning )
+ return true;
+
+ if ( all )
+ tid = 0;
+ else
+ tid = 0x4e;
+
+ currentSrc = events->getEventSource( src );
+
+ if ( !setFilter( 0x12, tid, 1000 ) )
+ return false;
+ isRunning = true;
+ start();
+ fprintf(stderr,"dvbEvents %d:%d started\n", adapter, tuner);
+
+ for ( i=0; i<(int)plugs.count(); ++i ) {
+ plugs.at(i)->go( src, freqKHz );
+ }
+
+ return true;
+}
+
+
+
+void DVBevents::stop()
+{
+ int i;
+
+ if ( !isRunning )
+ return;
+
+ isRunning = false;
+ if ( !wait(2000) ) {
+ terminate();
+ wait();
+ fprintf(stderr,"dvbEvents %d:%d terminated\n", adapter, tuner);
+ }
+ else
+ fprintf(stderr,"dvbEvents %d:%d ended\n", adapter, tuner);
+ stopFilter();
+
+ for ( i=0; i<(int)plugs.count(); ++i ) {
+ plugs.at(i)->stop();
+ }
+}
+
+
+
+void DVBevents::run()
+{
+ int n=0, tid;
+ int skip=0;
+
+ setpriority(PRIO_PROCESS, 0, 19); // eit parsing is cpu eater on some astra multiplex.
+ while ( isRunning ) {
+ if ( !isRunning )
+ break;
+
+ if ( poll(pf,1,1000)>0 ){
+ if ( pf[0].revents & POLLIN ){
+ n = read( fdDemux, secbuf, 4096 );
+ skip = 0;
+ }
+ else
+ skip++;
+ }
+ else
+ skip++;
+
+ if (skip)
+ continue;
+ if ( n<16 )
+ continue;
+ else
+ readSize = n;
+
+ if ( !isRunning )
+ break;
+
+ tid = getBits(secbuf,0,8);
+ if ( tid>0x4D && tid<0x70 ) {
+ tableEIT( secbuf );
+ }
+ }
+}
diff --git a/kaffeine/src/input/dvb/dvbevents.h b/kaffeine/src/input/dvb/dvbevents.h
new file mode 100644
index 0000000..e5d693d
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbevents.h
@@ -0,0 +1,59 @@
+/*
+ * dvbevents.h
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DVBEVENTS_H
+#define DVBEVENTS_H
+
+#include <qptrlist.h>
+
+#include "kaffeinedvbsection.h"
+#include "kaffeinedvbevents.h"
+
+
+
+class DVBevents : public KaffeineDVBsection
+{
+
+public:
+
+ DVBevents( QString devType, int anum, int tnum, const QString &charset, EventTable *table );
+ ~DVBevents();
+ bool go( QString src, int freqKHz, bool all=false );
+ void stop();
+
+private:
+
+ virtual void run();
+ bool tableEIT( unsigned char* buffer );
+ bool shortEventDesc( unsigned char *buf, EventDesc *desc );
+ bool extEventDesc( unsigned char *buf, EventDesc *desc );
+ bool safeLen( unsigned char* buf );
+
+ unsigned char secbuf[4096];
+ int readSize;
+
+ EventTable *events;
+ EventSource *currentSrc;
+
+ QPtrList<KaffeineEpgPlugin> plugs;
+ QStringList plugNames;
+};
+
+#endif /* DVBEVENTS_H */
diff --git a/kaffeine/src/input/dvb/dvbout.cpp b/kaffeine/src/input/dvb/dvbout.cpp
new file mode 100644
index 0000000..0ede057
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbout.cpp
@@ -0,0 +1,568 @@
+/*
+ * dvbout.cpp
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <fcntl.h>
+
+#include <kstandarddirs.h>
+
+#include "dvbout.h"
+#include "kaffeinedvbplugin.h"
+
+#define NTS 64
+
+DVBout::DVBout( ChannelDesc chan, int anum, int tnum, KaffeineDvbPlugin *p )
+{
+ bool bok;
+ bok = true;
+ unsigned int i, j=0, k;
+
+ for( i = 0 ; i < 256 ; i++ ) {
+ k = 0;
+ for (j = (i << 24) | 0x800000 ; j != 0x80000000 ; j <<= 1) {
+ k = (k << 1) ^ (((k ^ j) & 0x80000000) ? 0x04c11db7 : 0);
+ }
+ CRC32[i] = k;
+ }
+
+ plug = 0;
+ if ( p ) {
+ plug = p;
+ plugHandle = plug->init( chan.sid, anum, tnum, chan.fta );
+ }
+
+ fdPipe=0;
+ channel = chan;
+ thWrite = 0;
+ rtp = 0;
+ if ( channel.vpid )
+ pids.append( channel.vpid );
+ for ( i=0; i<channel.napid && i<MAX_AUDIO; i++ )
+ pids.append( channel.apid[i].pid );
+ for ( i=0; i<channel.nsubpid && i<MAX_DVBSUB; i++ )
+ pids.append( channel.subpid[i].pid );
+ wBuf = NULL;
+ timeShifting = beginLive = false;
+ haveRec = haveLive = instantRec = haveBroadcast = false;
+ patpmt = wpatpmt = false;
+ connect( &stopRecTimer, SIGNAL(timeout()), this, SLOT(stopRec()) );
+ connect( &timerPatPmt, SIGNAL(timeout()), this, SLOT(setPatPmt()) );
+ if ( !pids.contains(8192) )
+ timerPatPmt.start(500);
+}
+
+
+
+void DVBout::calculateCRC( unsigned char *p_begin, unsigned char *p_end )
+{
+ unsigned int i_crc = 0xffffffff;
+
+ // Calculate the CRC
+ while( p_begin < p_end ) {
+ i_crc = (i_crc<<8) ^ CRC32[ (i_crc>>24) ^ ((unsigned int)*p_begin) ];
+ p_begin++;
+ }
+
+ // Store it after the data
+ p_end[0] = (i_crc >> 24) & 0xff;
+ p_end[1] = (i_crc >> 16) & 0xff;
+ p_end[2] = (i_crc >> 8) & 0xff;
+ p_end[3] = (i_crc >> 0) & 0xff;
+}
+
+
+
+void DVBout::writePat()
+{
+ int i;
+
+ tspat[0x00] = 0x47; // sync_byte
+ tspat[0x01] = 0x40;
+ tspat[0x02] = 0x00; // PID = 0x0000
+ tspat[0x03] = 0x10; // | (ps->pat_counter & 0x0f);
+ tspat[0x04] = 0x00; // pointer_field. CRC calculation begins here
+ tspat[0x05] = 0x00; // 0x00: Program association section
+ tspat[0x06] = 0xb0;
+ tspat[0x07] = 0x11; // section_length = 0x011
+ tspat[0x08] = 0x00;
+ tspat[0x09] = 0xbb; // TS id = 0x00b0 (what the vlc calls "Stream ID")
+ tspat[0x0a] = 0xc1;
+ // section # and last section #
+ tspat[0x0b] = tspat[0x0c] = 0x00;
+ // Network PID (useless)
+ tspat[0x0d] = tspat[0x0e] = 0x00; tspat[0x0f] = 0xe0; tspat[0x10] = 0x10;
+ // Program Map PID
+ pmtpid = 0xff;
+ while ( pids.contains( pmtpid ) ) pmtpid--;
+ tspat[0x11] = 0x03; tspat[0x12] = 0xe8; tspat[0x13] = 0xe0; tspat[0x14] = pmtpid;
+ // Put CRC in ts[0x15...0x18]
+ calculateCRC( tspat + 0x05, tspat + 0x15 );
+ // needed stuffing bytes
+ for (i=0x19 ; i < 188 ; i++) tspat[i]=0xff;
+}
+
+
+
+void DVBout::writePmt()
+{
+ int i, off=0;
+
+ tspmt[0x00] = 0x47; //sync_byte
+ tspmt[0x01] = 0x40;
+ tspmt[0x02] = pmtpid;
+ tspmt[0x03] = 0x10;
+ tspmt[0x04] = 0x00; // pointer_field. CRC calculation begins here
+ tspmt[0x05] = 0x02; // 0x02: Program map section
+ tspmt[0x06] = 0xb0;
+ tspmt[0x07] = 0x20; // section_length
+ tspmt[0x08] = 0x03;
+ tspmt[0x09] = 0xe8; // prog number
+ tspmt[0x0a] = 0xc1;
+ // section # and last section #
+ tspmt[0x0b] = tspmt[0x0c] = 0x00;
+ // PCR PID
+ tspmt[0x0d] = channel.vpid>>8; tspmt[0x0e] = channel.vpid&0xff;
+ // program_info_length == 0
+ tspmt[0x0f] = 0xf0; tspmt[0x10] = 0x00;
+ // Program Map / Video PID
+ tspmt[0x11] = channel.vType; // video stream type
+ tspmt[0x12] = channel.vpid>>8; tspmt[0x13] = channel.vpid&0xff;
+ tspmt[0x14] = 0xf0; tspmt[0x15] = 0x09; // es info length
+ // useless info
+ tspmt[0x16] = 0x07; tspmt[0x17] = 0x04; tspmt[0x18] = 0x08; tspmt[0x19] = 0x80;
+ tspmt[0x1a] = 0x24; tspmt[0x1b] = 0x02; tspmt[0x1c] = 0x11; tspmt[0x1d] = 0x01;
+ tspmt[0x1e] = 0xfe;
+ off = 0x1e;
+ // audio pids
+ i = 0;
+ for ( i=0; i<channel.napid && i<MAX_AUDIO; i++ ) {
+ if ( channel.apid[i].ac3 ) {
+ tspmt[++off] = 0x81; // stream type = xine see this as ac3
+ tspmt[++off] = channel.apid[i].pid>>8; tspmt[++off] = channel.apid[i].pid&0xff;
+ tspmt[++off] = 0x00; tspmt[++off] = 0x0c; // es info length
+ tspmt[++off] = 0x05; tspmt[++off] = 0x04; tspmt[++off] = 0x41;
+ tspmt[++off] = 0x43; tspmt[++off] = 0x2d; tspmt[++off] = 0x33;
+ }
+ else {
+ tspmt[++off] = 0x04; // stream type = audio
+ tspmt[++off] = channel.apid[i].pid>>8; tspmt[++off] = channel.apid[i].pid&0xff;
+ tspmt[++off] = 0xf0; tspmt[++off] = 0x06; // es info length
+ }
+ tspmt[++off] = 0x0a; // iso639 descriptor tag
+ tspmt[++off] = 0x04; // descriptor length
+ if ( !channel.apid[i].lang.isEmpty() ) {
+ tspmt[++off] = channel.apid[i].lang.constref(0);
+ tspmt[++off] = channel.apid[i].lang.constref(1);
+ if ( channel.apid[i].ac3 )
+ tspmt[++off] = '_';
+ else
+ tspmt[++off] = channel.apid[i].lang.constref(2);
+ }
+ else if ( channel.apid[i].ac3 ) {
+ tspmt[++off] = 'd';
+ tspmt[++off] = 'd';
+ tspmt[++off] = 49+i;
+ }
+ else {
+ tspmt[++off] = 'c';
+ tspmt[++off] = 'h';
+ tspmt[++off] = 49+i;
+ }
+ tspmt[++off] = 0x00; // audio type
+ }
+ // Subtitles
+ for ( i=0; i<channel.nsubpid && i<MAX_DVBSUB; i++ ) {
+ tspmt[++off] = 0x06; // stream type = ISO_13818_PES_PRIVATE
+ tspmt[++off] = channel.subpid[i].pid>>8; tspmt[++off] = channel.subpid[i].pid&0xff;
+ tspmt[++off] = 0xf0; tspmt[++off] = 0x0a; // es info length
+ tspmt[++off] = 0x59; //DVB sub tag
+ tspmt[++off] = 0x08; // descriptor length
+ if ( !channel.subpid[i].lang.isEmpty() ) {
+ tspmt[++off] = channel.subpid[i].lang.constref(0);
+ tspmt[++off] = channel.subpid[i].lang.constref(1);
+ tspmt[++off] = channel.subpid[i].lang.constref(2);
+ }
+ else {
+ tspmt[++off] = 'c';
+ tspmt[++off] = 'h';
+ tspmt[++off] = 49+i;
+ }
+ tspmt[++off] = channel.subpid[i].type; //sub type
+ tspmt[++off] = channel.subpid[i].page>>8; tspmt[++off] = channel.subpid[i].page&0xff; // comp_page_id
+ tspmt[++off] = channel.subpid[i].id>>8; tspmt[++off] = channel.subpid[i].id&0xff; // anc_page_id
+ }
+ tspmt[0x07] = off-3; // update section_length
+ // Put CRC in ts[0x29...0x2c]
+ calculateCRC( tspmt+0x05, tspmt+off+1 );
+ // needed stuffing bytes
+ for (i=off+5 ; i < 188 ; i++) tspmt[i]=0xff;
+}
+
+
+
+bool DVBout::hasInstantRec() const
+{
+ return instantRec;
+}
+
+
+
+bool DVBout::hasRec() const
+{
+ return haveRec;
+}
+
+
+
+bool DVBout::hasLive() const
+{
+ if ( haveLive || fdPipe || timeShifting )
+ return true;
+ return false;
+}
+
+
+
+bool DVBout::hasBroadcast() const
+{
+ return haveBroadcast;
+}
+
+
+
+bool DVBout::doPause( const QString &name ) // called from dvbstream::run()
+{
+ if ( !haveLive )
+ return false;
+
+ if ( !timeShifting ) {
+ liveFile.setName( name );
+ liveFile.open( IO_WriteOnly|IO_Truncate );
+ liveFile.writeBlock( (char*)tspat, TS_SIZE );
+ liveFile.writeBlock( (char*)tspmt, TS_SIZE );
+ mutex.lock();
+ haveLive = false;
+ mutex.unlock();
+ if ( !wait(100) ) {
+ terminate();
+ wait();
+ }
+ mutex.lock();
+ haveLive = true;
+ if ( close( fdPipe )<0 )
+ perror("close out pipe: ");
+ else
+ fprintf(stderr,"out pipe closed\n");
+ fdPipe = 0;
+ mutex.unlock();
+ timeShifting = true;
+ //emit shifting( timeShifting );
+ }
+ return true;
+}
+
+
+
+void DVBout::setPatPmt()
+{
+ patpmt = true;
+}
+
+
+
+bool DVBout::goLive( const QString &name )
+{
+ if ( fdPipe ) return false;
+
+ haveLive = true;
+ pipeName = name;
+ beginLive = true;
+ //activeApid = napid;
+
+ writePat();
+ writePmt();
+ if ( !pids.contains(8192) )
+ patpmt = wpatpmt = true;
+ wBuf = new unsigned char[TS_SIZE*NTS*100];
+ if ( !wBuf ) fprintf( stderr, "\nNO WBUF !!!\n\n" );
+ wRead = wWrite = wDist = 0;
+ start();
+ return true;
+}
+
+
+
+void DVBout::preStopLive()
+{
+ mutex.lock();
+ haveLive = false;
+ mutex.unlock();
+}
+
+
+
+void DVBout::stopLive()
+{
+ mutex.lock();
+ if ( timeShifting ) {
+ liveFile.close();
+ timeShifting = false;
+ emit shifting( timeShifting );
+ }
+ mutex.unlock();
+ if ( !wait(500) ) {
+ terminate();
+ wait();
+ }
+ if ( fdPipe ) {
+ close( fdPipe );
+ fprintf( stderr, "pipe closed\n" );
+ fdPipe = 0;
+ }
+ delete [] wBuf;
+ wBuf = NULL;
+}
+
+
+
+bool DVBout::goBroadcast( Ts2Rtp *r )
+{
+ if ( haveBroadcast ) return false;
+ fprintf(stderr,"Start Broadcast: %s\n", channel.name.ascii() );
+ rtp = r;
+ haveBroadcast = true;
+ return true;
+}
+
+
+
+void DVBout::stopBroadcast()
+{
+ if ( !haveBroadcast ) return;
+ fprintf(stderr,"Stop Broadcast: %s\n", channel.name.ascii() );
+ mutex.lock();
+ rtp->removeChannels();
+ haveBroadcast = false;
+ mutex.unlock();
+}
+
+
+
+bool DVBout::goRec( const QString &name, int maxsize, RecTimer *t )
+{
+ QString fname=name;
+
+ if ( haveRec )
+ return false;
+
+ recTimer = t;
+ fileName=name;
+ fileNumber=0;
+
+ if (maxsize>0) {
+ fileMaxSize = (long long int)1048576*(long long int)maxsize;
+ fname=fileName+"_"+QString().setNum(fileNumber);
+ }
+ else {
+ fileMaxSize = 0;
+ fname=fileName;
+ }
+ if ( QFile(fname+".m2t").exists() )
+ renameFile( fname, ".m2t" );
+ writePat();
+ writePmt();
+ if ( channel.apid[0].pid!=8192 )
+ patpmt = true;
+ outFile.setName( fname+".m2t" );
+ if ( !outFile.open( IO_WriteOnly | IO_Truncate ) )
+ return false;
+ outFile.writeBlock( (char*)tspat, TS_SIZE );
+ outFile.writeBlock( (char*)tspmt, TS_SIZE );
+ recTimer->fullPath = fname+".m2t";
+
+ haveRec = true;
+ if ( recTimer ) {
+ QTime t = recTimer->duration.addSecs( QDateTime::currentDateTime().secsTo(recTimer->begin) );
+ stopRecTimer.start( QTime().msecsTo( t ), true );
+ }
+ else
+ instantRec = true;
+ fprintf( stderr, "Recording started: %s\n", channel.name.latin1() );
+ return true;
+}
+
+
+
+void DVBout::renameFile( QString &name, const QString &ext )
+{
+ int index=1;
+
+ while ( QFile(name+"-"+QString().setNum(index)+ext).exists() )
+ index++;
+
+ name = name+"-"+QString().setNum(index);
+}
+
+
+
+void DVBout::changeTimer( int ms )
+{
+ if ( stopRecTimer.isActive() )
+ stopRecTimer.changeInterval( ms );
+}
+
+
+
+void DVBout::stopRec()
+{
+ if ( !haveRec )
+ return;
+
+ if ( stopRecTimer.isActive() )
+ stopRecTimer.stop();
+ mutex.lock();
+ outFile.close();
+ mutex.unlock();
+ haveRec = instantRec = false;
+ fprintf( stderr, "Recording stopped: %s\n", channel.name.latin1() );
+ if ( !haveLive && !haveBroadcast )
+ emit endRecord( this, recTimer, true );
+ else
+ emit endRecord( this, recTimer, false );
+}
+
+
+
+void DVBout::process( unsigned char *buf, int size )
+{
+ int i, pid;
+ unsigned char *buffer=buf;
+ QString fname;
+
+ for ( i=0; i<size; i+=TS_SIZE ) {
+ pid = (((buffer[1] & 0x1f) << 8) | buffer[2]);
+ if ( pids.contains( pid ) || pids.contains( 8192) ) {
+ memcpy( thBuf+thWrite, buffer, TS_SIZE );
+ thWrite+=TS_SIZE;
+ if ( thWrite==(TS_SIZE*NTS ) ) {
+ if ( plug && plugHandle )
+ plug->process( plugHandle, thBuf, TS_SIZE*NTS );
+ mutex.lock();
+ if ( haveLive && fdPipe ) {
+ if ( beginLive ) {
+ beginLive = !beginLive;
+ start();
+ }
+ if ( wDist<95 ) {
+ memcpy( wBuf+(wWrite*TS_SIZE*NTS), thBuf, TS_SIZE*NTS );
+ wpatpmt = patpmt;
+ ++wDist;
+ ++wWrite;
+ if ( wWrite>99 )
+ wWrite = 0;
+ //fprintf(stderr,"WDIST = %d\n",wDist);
+ }
+ }
+ else if ( timeShifting ) {
+ if ( patpmt ) {
+ liveFile.writeBlock( (char*)tspat, TS_SIZE );
+ liveFile.writeBlock( (char*)tspmt, TS_SIZE );
+ }
+ liveFile.writeBlock( (char*)thBuf, TS_SIZE*NTS );
+ }
+ if ( haveRec && fileNumber>=0 ) {
+ if ((fileMaxSize>0)&&(outFile.size()>=fileMaxSize)) {
+ outFile.close();
+ fileNumber++;
+ fname=fileName+"_"+QString().setNum(fileNumber);
+ if (QFile(fname+"_"+QString().setNum(fileNumber)+".m2t").exists() )
+ renameFile( fname, ".m2t" );
+
+ outFile.setName( fname+".m2t" );
+ if ( !outFile.open( IO_WriteOnly | IO_Truncate ) )
+ fileNumber=-1;
+ else
+ {
+ outFile.writeBlock( (char*)tspat, TS_SIZE );
+ outFile.writeBlock( (char*)tspmt, TS_SIZE );
+ recTimer->fullPath = fname+".m2t";
+ }
+ }
+ if (fileNumber>=0)
+ {
+ if ( patpmt ) {
+ outFile.writeBlock( (char*)tspat, TS_SIZE );
+ outFile.writeBlock( (char*)tspmt, TS_SIZE );
+ }
+ outFile.writeBlock( (char*)thBuf, TS_SIZE*NTS );
+ }
+
+ }
+ if ( haveBroadcast )
+ rtp->process( thBuf, TS_SIZE*NTS );
+ patpmt = false;
+ mutex.unlock();
+ thWrite = 0;
+ }
+ }
+ buffer+=TS_SIZE;
+ }
+}
+
+
+
+void DVBout::run()
+{
+ if ( haveLive && fdPipe ) {
+ while ( haveLive && fdPipe ) {
+ if ( wDist>0 ) {
+ if ( wpatpmt ) {
+ write( fdPipe, tspat, TS_SIZE );
+ write( fdPipe, tspmt, TS_SIZE );
+ wpatpmt = false;
+ }
+ write( fdPipe, wBuf+(wRead*TS_SIZE*NTS), TS_SIZE*NTS );
+ --wDist;
+ ++wRead;
+ if ( wRead>99 )
+ wRead = 0;
+ }
+ else
+ usleep( 100 );
+ }
+ return;
+ }
+
+ if ( (fdPipe=open( pipeName.ascii(), O_WRONLY))<0 ) {
+ perror("PIPE FILE: ");
+ return;
+ }
+ fprintf(stderr,"pipe opened\n");
+ emit playDvb();
+}
+
+
+
+DVBout::~DVBout()
+{
+ if ( plug )
+ plug->close( plugHandle );
+}
+
+#include "dvbout.moc"
diff --git a/kaffeine/src/input/dvb/dvbout.h b/kaffeine/src/input/dvb/dvbout.h
new file mode 100644
index 0000000..bc97b47
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbout.h
@@ -0,0 +1,118 @@
+/*
+ * dvbout.h
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DVBOUT_H
+#define DVBOUT_H
+
+#include <qobject.h>
+#include <qthread.h>
+#include <qmutex.h>
+#include <qstring.h>
+#include <qfile.h>
+#include <qtimer.h>
+#include <qvaluelist.h>
+
+#include "channeldesc.h"
+#include "ts2rtp.h"
+#include "gdvb.h"
+
+class KaffeineDvbPlugin;
+
+class DVBout : public QObject, public QThread
+{
+ Q_OBJECT
+
+public:
+
+ DVBout( ChannelDesc chan, int anum, int tnum, KaffeineDvbPlugin *p );
+ ~DVBout();
+ void process( unsigned char *buf, int size );
+ bool goLive( const QString &name );
+ void preStopLive();
+ void stopLive();
+ bool goBroadcast( Ts2Rtp *r );
+ void stopBroadcast();
+ bool goRec( const QString &name, int maxsize, RecTimer *t );
+ bool hasRec() const;
+ bool hasLive() const;
+ bool hasBroadcast() const;
+ bool hasInstantRec() const;
+ bool timeShiftMode() const;
+ bool doPause( const QString &name );
+ void changeTimer( int ms );
+ QValueList<int> pidsList() { return pids; }
+
+ ChannelDesc channel;
+ QValueList<int> dmx, pids;
+ RecTimer *recTimer;
+
+public slots:
+
+ void stopRec();
+
+private slots:
+
+ void setPatPmt();
+
+private:
+
+ void writePmt();
+ void writePat();
+ void calculateCRC( unsigned char *p_begin, unsigned char *p_end );
+ void renameFile( QString &name, const QString &ext );
+
+ int pmtpid;
+ bool patpmt, wpatpmt;
+ bool timeShifting;
+ QString pipeName;
+ QFile outFile, liveFile;
+ int fdPipe;
+ Ts2Rtp *rtp;
+ unsigned char thBuf[188*100];
+ unsigned char *wBuf;
+ int wRead, wWrite, wDist;
+ unsigned char tspat[188];
+ unsigned char tspmt[188];
+ unsigned int CRC32[256];
+ int thWrite;
+ bool beginLive;
+ bool haveRec, haveLive, instantRec, haveBroadcast;
+ QTimer stopRecTimer, timerPatPmt;
+ QMutex mutex;
+ KaffeineDvbPlugin *plug;
+ void *plugHandle;
+
+ int fileNumber;
+ QString fileName;
+ long long int fileMaxSize;
+
+signals:
+
+ void playDvb();
+ void endRecord(DVBout*, RecTimer*, bool);
+ void shifting(bool);
+
+protected:
+
+ virtual void run();
+
+};
+
+#endif /* DVBOUT_H */
diff --git a/kaffeine/src/input/dvb/dvbpanel.cpp b/kaffeine/src/input/dvb/dvbpanel.cpp
new file mode 100644
index 0000000..4d70760
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbpanel.cpp
@@ -0,0 +1,2673 @@
+/*
+ * dvbpanel.cpp
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <sys/statvfs.h>
+
+#include <qlayout.h>
+#include <qfile.h>
+#include <qdir.h>
+#include <qstringlist.h>
+#include <qlabel.h>
+#include <qpixmap.h>
+#include <qtooltip.h>
+#include <qwhatsthis.h>
+#include <qapplication.h>
+#include <qpopupmenu.h>
+#include <qmap.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kinputdialog.h>
+#include <kicondialog.h>
+#include <kaction.h>
+#include <kprocess.h>
+#include <kfiledialog.h>
+#include <ktrader.h>
+#include <kxmlguifactory.h>
+#include <kparts/componentfactory.h>
+
+#include "kaffeineinput.h"
+#include "kaffeinedvbplugin.h"
+#include "dvbpanel.h"
+#include "channeldesc.h"
+#include "dvbstream.h"
+#include "kevents.h"
+#include "broadcasteditor.h"
+#include "channeleditor.h"
+
+#define CHANICONSIZE 28
+
+
+
+DIconViewItem::DIconViewItem( DvbPanel *pan, QIconView *parent, const QString &text, const QPixmap &icon )
+ : KIconViewItem( parent, text, icon )
+{
+ panel = pan;
+}
+
+
+
+void DIconViewItem::dropped( QDropEvent *e, const QValueList<QIconDragItem> & )
+{
+ QString s;
+
+ if ( !dropEnabled() )
+ return;
+ if ( QTextDrag::decode( e, s ) )
+ panel->moveChannel( text(), s );
+}
+
+
+
+DListView::DListView( QWidget *parent ) : KListView( parent )
+{
+ visibleItems = 0;
+}
+
+
+
+QDragObject* DListView::dragObject()
+{
+ if ( currentItem() )
+ return new QTextDrag( currentItem()->text(1), this );
+ else
+ return 0;
+}
+
+
+
+DvbPanel::DvbPanel( QWidget *parent, QObject *objParent, const char *name ) : KaffeineInput(objParent,name)
+{
+ browseDvbStream = -1;
+ plug = NULL;
+
+ isTuning = false;
+ timeShiftFileName = "";
+ timersDialog = 0;
+ currentCategory = "All";
+ channels.setAutoDelete( true );
+ timers.setAutoDelete( true );
+ dvb.setAutoDelete( true );
+
+ mainWidget = new QVBox( parent );
+ mainWidget->setSizePolicy( QSizePolicy (QSizePolicy::Preferred, QSizePolicy::Preferred) );
+ split = new QSplitter( mainWidget );
+ split->setOpaqueResize( true );
+ pbox = new QVBox( split );
+ iconView = new KIconView( pbox );
+ iconView->setVScrollBarMode( QScrollView::AlwaysOff );
+ iconView->setHScrollBarMode( QScrollView::AlwaysOff );
+ iconView->horizontalScrollBar()->setFixedHeight( 0 );
+ connect( iconView, SIGNAL(rightButtonPressed(QIconViewItem*,const QPoint&)), this, SLOT(catContextMenu(QIconViewItem*,const QPoint&)) );
+ connect( iconView, SIGNAL(clicked(QIconViewItem*)), this, SLOT(catSelected(QIconViewItem*)) );
+ iconView->setArrangement(QIconView::TopToBottom);
+ iconView->setMargin(0);
+ iconView->setSpacing(0);
+ iconView->setItemsMovable(false);
+ iconView->setResizeMode(QIconView::Adjust);
+ iconView->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::Minimum ) );
+ playerBox = new QVBox( pbox );
+ playerBox->setMinimumWidth( 200 );
+ panel = new QFrame( split );
+ panel->setLineWidth(1);
+ panel->setFrameStyle(QFrame::Panel|QFrame::Sunken);
+ split->moveToFirst( panel );
+ split->setResizeMode( panel, QSplitter::KeepSize );
+
+ QVBoxLayout *vb = new QVBoxLayout( panel, 3, 3 );
+ channelsBtn = new QToolButton( panel );
+ channelsBtn->setAutoRaise( true );
+ QToolTip::add( channelsBtn, i18n("Channels"));
+ dateBtn = new QToolButton( panel );
+ dateBtn->setAutoRaise( true );
+ QToolTip::add( dateBtn, i18n("Timers"));
+ infoBtn = new QToolButton( panel );
+ infoBtn->setAutoRaise( true );
+ QToolTip::add( infoBtn, i18n("Electronic Program Guide"));
+ osdBtn = new QToolButton( panel );
+ osdBtn->setAutoRaise( true );
+ QToolTip::add( osdBtn, i18n("OSD"));
+ configBtn = new QToolButton( panel );
+ configBtn->setAutoRaise( true );
+ QToolTip::add( configBtn, i18n("DVB settings"));
+ recallBtn = new QToolButton( panel );
+ recallBtn->setAutoRaise( true );
+ QToolTip::add( recallBtn, i18n("Recall"));
+ QHBoxLayout *h1 = new QHBoxLayout();
+ h1->addItem( new QSpacerItem( 1, 1, QSizePolicy::Preferred, QSizePolicy::Minimum ) );
+ h1->addWidget( channelsBtn );
+ h1->addWidget( dateBtn );
+ h1->addWidget( infoBtn );
+ h1->addWidget( osdBtn );
+ h1->addWidget( configBtn );
+ h1->addWidget( recallBtn );
+ h1->addItem( new QSpacerItem( 1, 1, QSizePolicy::Preferred, QSizePolicy::Minimum ) );
+ vb->addLayout( h1 );
+
+ h1 = new QHBoxLayout();
+ searchBtn = new QToolButton( panel );
+ searchBtn->setAutoRaise( true );
+ QToolTip::add( searchBtn, i18n("Search channel(s)"));
+ QLabel* filterLabel = new QLabel( i18n("Filter") + ":", panel );
+ searchLE = new KLineEdit( panel );
+ searchLE->setFocusPolicy( QWidget::ClickFocus );
+ h1->addWidget( searchBtn );
+ h1->addWidget( filterLabel );
+ h1->addWidget( searchLE );
+ vb->addLayout( h1 );
+
+ channelsCb = new DListView( panel );
+ channelsCb->setHScrollBarMode( QListView::AlwaysOff );
+ //channelsCb->setPaletteBackgroundColor( QColor(255,255,200) );
+ connect( channelsCb, SIGNAL(itemRenamed(QListViewItem*)), this, SLOT(channelNumberChanged(QListViewItem*)) );
+ connect( channelsCb, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(channelSelected(QListViewItem*)) );
+ connect( channelsCb, SIGNAL(clicked(QListViewItem*)), this, SLOT(channelClicked(QListViewItem*)) );
+ connect( channelsCb, SIGNAL(contextMenuRequested(QListViewItem*,const QPoint&,int)), this, SLOT(channelPopup(QListViewItem*,const QPoint&,int)) );
+ channelsCb->setItemsRenameable( true );
+ channelsCb->addColumn( i18n("Number") );
+ channelsCb->addColumn( i18n("Name") );
+ channelsCb->addColumn( i18n("Source") );
+ channelsCb->setAllColumnsShowFocus( true );
+ channelsCb->setSizePolicy( QSizePolicy (QSizePolicy::Preferred, QSizePolicy::MinimumExpanding) );
+ //channelsCb->setEnabled( false );
+ vb->addWidget( channelsCb );
+
+ h1 = new QHBoxLayout();
+ recordBtn = new QToolButton( panel );
+ QToolTip::add( recordBtn, i18n("Instant Record") );
+ recordBtn->setToggleButton( true );
+ h1->addWidget( recordBtn );
+ broadcastBtn = new QToolButton( panel );
+ QToolTip::add( broadcastBtn, i18n("Broadcast") );
+ h1->addWidget( broadcastBtn );
+ vb->addLayout( h1 );
+
+ h1 = new QHBoxLayout();
+ h1->addItem( new QSpacerItem( 1, 1, QSizePolicy::Preferred, QSizePolicy::Minimum ) );
+ shiftLed = new KLed( panel );
+ shiftLed->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+ shiftLed->setDarkFactor( 500 );
+ shiftLed->off();
+ QToolTip::add( shiftLed, i18n("Time shifting") );
+ h1->addWidget( shiftLed );
+ h1->addItem( new QSpacerItem( 1, 1, QSizePolicy::Preferred, QSizePolicy::Minimum ) );
+ recordLed = new KLed( panel );
+ recordLed->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+ recordLed->setColor( QColor( 255,0,0 ) );
+ recordLed->setDarkFactor( 500 );
+ recordLed->off();
+ QToolTip::add( recordLed, i18n("Recording") );
+ h1->addWidget( recordLed );
+ h1->addItem( new QSpacerItem( 1, 1, QSizePolicy::Preferred, QSizePolicy::Minimum ) );
+ broadcastLed = new KLed( panel );
+ broadcastLed->setSizePolicy( QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Fixed ) );
+ broadcastLed->setColor( QColor( 255,128,0 ) );
+ broadcastLed->setDarkFactor( 500 );
+ broadcastLed->off();
+ QToolTip::add( broadcastLed, i18n("Broadcasting") );
+ h1->addWidget( broadcastLed );
+ h1->addItem( new QSpacerItem( 1, 1, QSizePolicy::Preferred, QSizePolicy::Minimum ) );
+ vb->addLayout( h1 );
+
+ KIconLoader *icon = new KIconLoader();
+ tvPix = icon->loadIcon( "kdvbtv", KIcon::Small );
+ tvcPix = icon->loadIcon( "kdvbtvc", KIcon::Small );
+ raPix = icon->loadIcon( "kdvbra", KIcon::Small );
+ racPix = icon->loadIcon( "kdvbrac", KIcon::Small );
+ QIconSet iconset;
+ iconset.setPixmap( icon->loadIcon( "filesave", KIcon::Small ), QIconSet::Small );
+ iconset.setPixmap( icon->loadIcon( "player_record", KIcon::Small), QIconSet::Small, QIconSet::Normal, QIconSet::On );
+ recordBtn->setIconSet( iconset );
+ broadcastBtn->setIconSet( icon->loadIconSet("network_local", KIcon::Small) );
+ dateBtn->setIconSet( icon->loadIconSet("date", KIcon::Small) );
+ infoBtn->setIconSet( icon->loadIconSet("view_text", KIcon::Small) );
+ osdBtn->setIconSet( icon->loadIconSet("info", KIcon::Small) );
+ channelsBtn->setIconSet( icon->loadIconSet("kdvbtv", KIcon::Small) );
+ configBtn->setIconSet( icon->loadIconSet("configure", KIcon::Small) );
+ recallBtn->setIconSet( icon->loadIconSet("reload", KIcon::Small) );
+ searchBtn->setIconSet( icon->loadIconSet("locationbar_erase", KIcon::Small) );
+
+ setXMLFile("kaffeinedvb.rc");
+ setupActions();
+
+ connect( this, SIGNAL(zap(ChannelDesc*)), SLOT(dvbZap(ChannelDesc*)) );
+ connect( configBtn, SIGNAL(clicked()), this, SLOT(showConfigDialog()));
+ connect( recallBtn, SIGNAL(clicked()), this, SLOT(recallZap()));
+
+ connect( recordBtn, SIGNAL(clicked()), this, SLOT(setRecord()) );
+ connect( broadcastBtn, SIGNAL(clicked()), this, SLOT(setBroadcast()) );
+ connect( infoBtn, SIGNAL(clicked()), this, SLOT(showEvents()) );
+ connect( channelsBtn, SIGNAL(clicked()), this, SLOT(scanner()) );
+ connect( dateBtn, SIGNAL(clicked()), this, SLOT(showTimers()) );
+ connect( osdBtn, SIGNAL(clicked()), this, SLOT(dvbOSD()));
+ connect( searchBtn, SIGNAL(clicked()), this, SLOT(resetSearch()) );
+ connect(searchLE, SIGNAL(textChanged(const QString&)), this, SLOT(searchChannel(const QString&)));
+
+ connect( &timersTimer, SIGNAL(timeout()), this, SLOT(checkTimers()) );
+ connect( &osdTimer, SIGNAL(timeout()), this, SLOT(resetOSD()) );
+ connect( &showOsdTimer, SIGNAL(timeout()), this, SLOT(dvbOSD()) );
+ connect( &tuningTimer, SIGNAL(timeout()), this, SLOT(setTuning()) );
+ connect( &stopTuningTimer, SIGNAL(timeout()), this, SLOT(setTuning()) );
+ connect( &diskTimer, SIGNAL(timeout()), this, SLOT(diskStatus()) );
+
+ setConfig();
+
+ updown = 1;
+ autocount = 0;
+ delete icon;
+
+ events.loadEpg();
+}
+
+
+
+void DvbPanel::togglePanel()
+{
+ if ( panel->isHidden() )
+ panel->show();
+ else
+ panel->hide();
+}
+
+
+
+void DvbPanel::diskStatus()
+{
+ double freemb;
+ struct statvfs buf;
+
+ if ( statvfs( dvbConfig->shiftDir.local8Bit(), &buf ) ) {
+ fprintf(stderr,"Couldn't get file system statistics\n");
+ return;
+ }
+
+ freemb = (double)(((double)(buf.f_bavail)*(double)(buf.f_bsize))/(1024.0*1024.0));
+ if ( freemb<300 )
+ emit showOSD( i18n("Warning: low disc space")+QString(" (%1").arg((int)freemb)+i18n("MB")+")", 5000, 3 );
+}
+
+
+
+void DvbPanel::channelPopup( QListViewItem *it, const QPoint &pos, int col )
+{
+ QPoint p=pos;
+
+ if ( !it )
+ return;
+
+ int i=col, j;
+ QImage img;
+ QPixmap pix;
+ QString name = it->text(1);
+ QString s;
+
+ QPopupMenu *pop = new QPopupMenu();
+ pop->insertItem( i18n("Select icon..."), 1 );
+ pop->insertItem( i18n("Edit..."), 2 );
+ i = 0;
+ i = pop->exec( QCursor::pos() );
+ switch ( i ) {
+ case 0 :
+ break;
+ case 1 :
+ s = KFileDialog::getOpenFileName( QString::null, "image/png image/jpeg image/gif image/x-bmp image/x-xpm", 0, i18n("Choose channel icon"));
+ if ( s.isEmpty() )
+ break;
+ img = QImage( s );
+ if ( img.isNull() )
+ break;
+ if ( img.width()>img.height() )
+ img = img.smoothScale( CHANICONSIZE, img.height()*CHANICONSIZE/img.width() );
+ else
+ img = img.smoothScale( img.width()*CHANICONSIZE/img.height(), CHANICONSIZE );
+ pix.convertFromImage( img );
+ for ( j=0; j<(int)channels.count(); j++ ) {
+ if ( channels.at(j)->name==name ) {
+ channels.at(j)->pix = pix;
+ break;
+ }
+ }
+ pix.save( dvbConfig->dvbConfigIconsDir+name, "PNG" );
+ fillChannelList();
+ break;
+ case 2:
+ editChannel( name );
+ break;
+
+ }
+ delete pop;
+}
+
+bool DvbPanel::editChannel( QString &name )
+{
+ int j;
+ ChannelDesc *chan=0;
+ QStringList list;
+ QPixmap pix;
+
+ for ( j=0; j<(int)channels.count(); j++ ) {
+ chan = channels.at(j);
+ if ( chan->name==name ) {
+ j = -1;
+ list.append( chan->tp.source );
+ break;
+ }
+ }
+ if ( j==-1 ) {
+ ChannelEditor dlg( list, false, chan, &channels, mainWidget );
+ int ret = dlg.exec();
+ if ( ret==ChannelEditor::Accepted ) {
+ pix.load( dvbConfig->dvbConfigIconsDir+chan->name );
+ if ( !pix.isNull() )
+ chan->pix = pix;
+ else {
+ if ( chan->type==1 ) {
+ if ( chan->fta )
+ pix = tvcPix;
+ else
+ pix = tvPix;
+ }
+ else {
+ if ( chan->fta )
+ pix = racPix;
+ else
+ pix = raPix;
+ }
+ }
+ fillChannelList( chan );
+ return true;
+ }
+ }
+ return false;
+}
+
+
+
+
+void DvbPanel::getTargets( QStringList &uiNames, QStringList &iconNames, QStringList &targetNames )
+{
+ uiNames.append( i18n("Digital TV") );
+ iconNames.append( "tv" );
+ targetNames.append( "DVB" );
+}
+
+
+
+bool DvbPanel::execTarget( const QString &target )
+{
+ if ( target=="DVB" ) {
+ if ( !channelsCb->isEnabled() ) {
+ KMessageBox::information( mainWidget, i18n("Live digital TV only works with the xine engine.") );
+ return true;
+ }
+ emit showMe( this );
+ QTimer::singleShot( 100, this, SLOT(playLastChannel()) );
+ return true;
+ }
+ return false;
+}
+
+
+
+void DvbPanel::setupActions()
+{
+ new KAction(i18n("OSD Next Channel"), "next", CTRL+SHIFT+Key_W, this, SLOT(dvbOSDNext()), actionCollection(), "dvb_browse_next");
+ new KAction(i18n("OSD Previous Channel"), "previous", CTRL+SHIFT+Key_Q, this, SLOT(dvbOSDPrev()), actionCollection(),"dvb_browse_prev");
+ new KAction(i18n("OSD Zap"), "ok", CTRL+SHIFT+Key_E, this, SLOT(dvbOSDZap()), actionCollection(), "dvb_browse_zap");
+ new KAction(i18n("OSD Next Event"), "down", CTRL+SHIFT+Key_S, this, SLOT(dvbOSDAdvance()), actionCollection(), "dvb_browse_advance");
+ new KAction(i18n("OSD Previous Event"), "up", CTRL+SHIFT+Key_A, this, SLOT(dvbOSDRetreat()), actionCollection(), "dvb_browse_retreat");
+ new KAction(i18n("Instant Record"), "filesave", 0, this, SLOT(setRecord()), actionCollection(), "dvb_instant_record");
+ new KAction(i18n("Recall"), "reload", CTRL+SHIFT+Key_Z, this, SLOT(recallZap()), actionCollection(), "dvb_recall");
+ new KAction(i18n("Show OSD"), "info", Key_O, this, SLOT(dvbOSD()), actionCollection(), "dvb_show_osd");
+ new KAction(i18n("EPG..."), "view_text", Key_G, this, SLOT(showEvents()), actionCollection(), "dvb_show_epg");
+ new KAction(i18n("Timers..."), "date", Key_T, this, SLOT(showTimers()), actionCollection(), "dvb_show_timers");
+ new KAction(i18n("Broadcasting..."), "network_local", Key_B, this, SLOT(setBroadcast()), actionCollection(), "dvb_show_broadcast");
+ new KAction(i18n("Channels..."), "kdvbtv", Key_C, this, SLOT(scanner()), actionCollection(), "dvb_channels");
+ new KAction(i18n("Configure DVB..."), "configure", CTRL|Key_C, this, SLOT(showConfigDialog()), actionCollection(), "dvb_config");
+}
+
+
+
+QWidget *DvbPanel::wantPlayerWindow()
+{
+ return playerBox;
+}
+
+
+
+QWidget *DvbPanel::inputMainWidget()
+{
+ return mainWidget;
+}
+
+
+
+void DvbPanel::searchChannel( const QString &text )
+{
+ int i, c=-1;
+ QListViewItemIterator it( channelsCb );
+ if ( !it.current() )
+ return;
+ for ( i=0; i<channelsCb->columns(); i++ ) {
+ if ( channelsCb->columnText(i)==i18n("Name") ) {
+ c = i;
+ break;
+ }
+ }
+ if ( c==-1 )
+ return;
+
+ channelsCb->visibleItems = 0;
+
+ while ( it.current() ) {
+ if ( text.isEmpty() || it.current()->text( c ).contains( text, false ) ) {
+ it.current()->setVisible(true);
+ ++channelsCb->visibleItems;
+ }
+ else {
+ it.current()->setVisible(false);
+ }
+ ++it;
+ }
+}
+
+
+
+void DvbPanel::resetSearch()
+{
+ searchLE->clear();
+ searchChannel( "" );
+}
+
+
+
+void DvbPanel::channelNumberChanged( QListViewItem *it )
+{
+ int i, j;
+ bool ok;
+ unsigned int oldNum=0;
+ unsigned int num = it->text(0).toUInt( &ok, 10 );
+
+ for ( i=0; i<(int)channels.count(); i++ ) {
+ if ( channels.at(i)->name==it->text(1) ) {
+ oldNum = channels.at(i)->num;
+ break;
+ }
+ }
+
+ if ( num && oldNum ) {
+ for ( j=0; j<(int)channels.count(); j++ ) {
+ if ( channels.at(j)->num==num ) {
+ channels.at(j)->num = oldNum;
+ channels.at(i)->num = num;
+ break;
+ }
+ }
+ }
+
+ if ((int)num > maxChannelNumber)
+ maxChannelNumber = num;
+ if ((int)num < minChannelNumber)
+ minChannelNumber = num;
+
+ fillChannelList();
+}
+
+
+
+void DvbPanel::catSelected( QIconViewItem *it )
+{
+ if ( !it ) return;
+
+ if ( it->text()==i18n("All") )
+ currentCategory = "All";
+ else if ( it->text()==i18n("TV") )
+ currentCategory = "TV";
+ else if ( it->text()==i18n("Radio") )
+ currentCategory = "Radio";
+ else
+ currentCategory = it->text();
+ fillChannelList();
+}
+
+
+
+void DvbPanel::catContextMenu( QIconViewItem *it, const QPoint &p )
+{
+ bool ok;
+ QString name, icon;
+ int i=0, ret;
+
+ QPopupMenu *pop = new QPopupMenu();
+ if ( !it ) {
+ pop->insertItem( i18n("New Category..."), 0 );
+ }
+ else {
+ pop->insertItem( i18n("Change Icon..."), 1 );
+ if ( it->text()!=i18n("All") && it->text()!=i18n("Radio") && it->text()!=i18n("TV") )
+ pop->insertItem( i18n("Delete Category..."), 2 );
+ }
+ i = pop->exec( p );
+ switch ( i ) {
+ case 0 :
+ name = KInputDialog::getText( i18n("New Category"), i18n("Enter a name for this category:"), QString::null, &ok);
+ for ( QIconViewItem *qitem = iconView->firstItem(); qitem; qitem = qitem->nextItem() ) {
+ if ( qitem->text()==name )
+ ok = false;
+ }
+ if ( ok ) {
+ KIconViewItem* item = new DIconViewItem(this, iconView, name, KGlobal::iconLoader()->loadIcon("kaffeine", KIcon::NoGroup, KIcon::SizeSmallMedium));
+ item->setDropEnabled( true );
+ dvbConfig->addCategory( name, "kaffeine" );
+ }
+ break;
+ case 1 :
+ icon = KIconDialog::getIcon();
+ if ( !icon.isEmpty() ) {
+ it->setPixmap( KGlobal::iconLoader()->loadIcon(icon, KIcon::NoGroup, KIcon::SizeSmallMedium) );
+ dvbConfig->changeIconCategory( it->text(), icon );
+ }
+ break;
+ case 2 :
+ ret = KMessageBox::questionYesNo( mainWidget, i18n("Do you really want to delete this category?") );
+ if ( ret==KMessageBox::Yes ) {
+ dvbConfig->removeCategory( it->text() );
+ delete it;
+ currentCategory = "All";
+ fillChannelList();
+ }
+ break;
+ }
+ delete pop;
+}
+
+
+
+void DvbPanel::moveChannel( const QString &cat, const QString &name )
+{
+ int i;
+ ChannelDesc *chan;
+ QListViewItem *it;
+
+ for ( i=0; i<(int)channels.count(); i++ ) {
+ chan = channels.at(i);
+ if ( chan->name==name ) {
+ if ( cat==i18n("All") )
+ chan->category = "";
+ else
+ chan->category = cat;
+ it = channelsCb->currentItem();
+ if ( it && currentCategory!="All" && currentCategory!="TV" && currentCategory!="Radio" )
+ delete it;
+ break;
+ }
+ }
+}
+
+
+
+void DvbPanel::dumpEvents()
+{
+ EventSource *esrc;
+ EventTsid *et;
+ EventSid *es;
+ QPtrList<EventDesc> *esEvents;
+ EventDesc *desc;
+ int i, k, j, m, n;
+ QString s;
+
+ QFile f( QDir::homeDirPath()+"/kaffeine_dvb_events.txt" );
+ if ( f.open(IO_WriteOnly|IO_Truncate) ) {
+ fprintf( stderr, "Creating events file.\n");
+ QTextStream tt( &f );
+ tt << "Saved: "+QDateTime::currentDateTime().toString( "dd-MM-yyyy hh:mm:ss" )+"\n";
+ k= 0;
+ for( i=0; i<events.getNSource(); i++ ) {
+ if ( !(esrc=events.getNEventSource( i )) )
+ continue;
+ tt << esrc->getSource()+QString(" : %1 TS with events.\n").arg( esrc->getNTsid() );
+ for ( m=0; m<esrc->getNTsid(); m++ ) {
+ if ( !(et=esrc->getNEventTsid( m )) )
+ continue;
+ tt << QString("TSID %1 : %2 services with events\n").arg( et->getTsid() ).arg( et->getNSid() );
+ for ( n=0; n<et->getNSid(); n++ ) {
+ if ( !(es=et->getNEventSid( n )) )
+ continue;
+ tt << QString(" SID %1 : %2 events\n").arg( es->getSid() ).arg( es->getNDesc() );
+ k+= es->getNDesc();
+ }
+ }
+ }
+ tt << "Number of events : "+s.setNum( k )+"\n";
+ fprintf( stderr, "Number of events : %d\n", k );
+ tt << "-------------------------\n";
+ tt << "\n";
+ for( i=0; i<events.getNSource(); i++ ) {
+ if ( !(esrc=events.getNEventSource( i )) )
+ continue;
+ for ( m=0; m<esrc->getNTsid(); m++ ) {
+ if ( !(et=esrc->getNEventTsid( m )) )
+ continue;
+ for ( n=0; n<et->getNSid(); n++ ) {
+ if ( !(es=et->getNEventSid( n )) )
+ continue;
+ esEvents = es->getEvents();
+ es->lock();
+ for ( j=0; j<(int)esEvents->count(); j++ ) {
+ if ( !(desc=esEvents->at( j )) )
+ continue;
+ tt << "Source: "+desc->source+"\n";
+ tt << QString("Network ID: %1\n").arg(desc->nid);
+ tt << QString("Transport Stream ID: %1\n").arg(desc->tsid);
+ tt << QString("Service ID: %1\n").arg(desc->sid);
+ tt << QString("Event ID: %1\n").arg(desc->eid);
+ tt << "Title: "+desc->title+"\n";
+ tt << "Subtitle: "+desc->subtitle+"\n";
+ tt << desc->startDateTime.toString( "dd-MM-yyyy hh:mm:ss" )+"\n";
+ tt << desc->duration.toString( "hh:mm:ss" )+"\n";
+ s = "";
+ for ( k=0; k<(int)desc->shortEvents.count(); k++ ) {
+ s = s + desc->shortEvents.at(k)->name;
+ if (!desc->shortEvents.at(k)->name.isEmpty() && !desc->shortEvents.at(k)->text.isEmpty()) {
+ s = s + " : ";
+ s = s + desc->shortEvents.at(k)->text;
+ s = s+". ";
+ }
+ }
+ for ( k=0; k<(int)desc->extEvents.count(); k++ )
+ s = s+ *desc->extEvents.at(k);
+ tt << s+"\n";
+ tt << "\n";
+ }
+ es->unlock();
+ }
+ }
+ }
+ f.close();
+ }
+ else fprintf( stderr, "Can't create events file!\n");
+}
+
+
+
+void DvbPanel::channelClicked( QListViewItem *it )
+{
+ QPtrListIterator<ChannelDesc> iter( channels );
+ ChannelDesc *itdesc, *desc=0;
+ DvbStream *d = 0;
+
+ if ( !it )
+ return;
+
+ iter.toFirst();
+ while ( (itdesc=iter.current())!=0 ) {
+ if ( itdesc->name==it->text(1) ) {
+ desc = itdesc;
+ break;
+ }
+ ++iter;
+ }
+
+ if ( !desc )
+ return;
+
+ for (int j = 0; j < (int)dvb.count(); j ++) {
+ if (dvb.at(j)->canSource(desc)) {
+ d = dvb.at(j);
+ break;
+ }
+ }
+
+ osdMode = 0;
+ dvbOSD( *desc, d );
+}
+
+
+
+void DvbPanel::resetOSD()
+{
+ osdMode = 0;
+}
+
+
+
+void DvbPanel::dvbOSD()
+{
+ DvbStream *d = 0;
+
+ if (browseDvbStream != -1 && osdMode != 0) {
+ dvbOSDSkip(0);
+ return;
+ }
+
+ for (int i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasLive() ) {
+ d = dvb.at(i);
+ break;
+ }
+ }
+
+ if ( d )
+ dvbOSD( d->getLiveChannel(), d );
+}
+
+
+
+void DvbPanel::dvbOSDZap()
+{
+ ChannelDesc *chan = 0;
+
+ if (browseDvbStream == -1)
+ return;
+
+ osdMode = 0;
+
+ for (int i=0; i<(int)channels.count(); i++) {
+ if ((int) channels.at(i)->num == browseDvbStream) {
+ chan = channels.at(i);
+ break;
+ }
+ }
+
+ if (!chan)
+ return;
+
+ dvbZap(chan);
+}
+
+
+
+void DvbPanel::dvbOSDNext()
+{
+ browseDvbTimeShift = -1;
+ osdMode = 0;
+
+ dvbOSDSkip(1);
+}
+
+
+
+void DvbPanel::dvbOSDSkip(int skip, int timeShift /* = 0 */)
+{
+ DvbStream *d = 0;
+ ChannelDesc *chan = 0;
+
+ int mychan = -1;
+
+ if (browseDvbStream == -1)
+ mychan = dvbConfig->lastChannel;
+ else
+ mychan = browseDvbStream + skip;
+
+ if (mychan < minChannelNumber)
+ mychan = maxChannelNumber;
+ else if (mychan > maxChannelNumber)
+ mychan = minChannelNumber;
+
+ for (int i = 0; i < (int)channels.count(); i ++) {
+ if ((int) channels.at(i)->num == mychan) {
+ chan = channels.at(i);
+ break;
+ }
+ }
+
+ if (!chan)
+ return;
+
+ for (int j = 0; j < (int)dvb.count(); j ++) {
+ if (dvb.at(j)->canSource(chan)) {
+ d = dvb.at(j);
+ break;
+ }
+ }
+
+ if (!d)
+ return;
+
+ browseDvbStream = chan->num;
+
+ dvbOSD(*chan, d, timeShift);
+}
+
+
+
+void DvbPanel::dvbOSDPrev()
+{
+ browseDvbTimeShift = -1;
+ osdMode = 0;
+
+ dvbOSDSkip(-1);
+}
+
+
+
+void DvbPanel::dvbOSDHide()
+{
+ browseDvbStream = -1;
+ browseDvbTimeShift = -1;
+}
+
+
+
+void DvbPanel::dvbOSDAdvance()
+{
+ osdMode = 0;
+
+ dvbOSDSkip(0, 1);
+}
+
+
+
+void DvbPanel::dvbOSDRetreat()
+{
+ osdMode = 0;
+
+ dvbOSDSkip(0, -1);
+}
+
+
+
+void DvbPanel::dvbOSD(ChannelDesc liveChannel, DvbStream *d, int timeShift /* = 0 */)
+{
+ QStringList list;
+ EventSource *esrc;
+ EventSid *es;
+ QPtrList<EventDesc> *esEvents;
+ EventDesc *desc;
+ QString s;
+ int i, j, k;
+ int first=0;
+
+ if ( !d || liveChannel.name.isEmpty() )
+ return;
+
+ if ( osdMode==2 ) {
+ osdTimer.stop();
+ osdMode = 0;
+ list.append( "STOP" );
+ emit showDvbOSD( s.setNum( liveChannel.num )+" - "+liveChannel.name, list );
+ return;
+ }
+
+ if ( osdMode==1 )
+ osdTimer.stop();
+
+ if ( osdMode==0 ) {
+ if ( d->liveIsRecording() )
+ list.append( "R" );
+ if ( d->timeShiftMode() )
+ list.append( "T" );
+ }
+ else
+ list.append( "E" );
+
+ int myshift = 0;
+
+ if (browseDvbTimeShift == -1)
+ myshift = 0;
+ else
+ myshift = browseDvbTimeShift + timeShift;
+
+ if (myshift < 0)
+ myshift = 0;
+
+ browseDvbTimeShift = myshift;
+
+ k = 0;
+
+ esrc = events.getEventSource( liveChannel.tp.source );
+ es = esrc->getEventSid( liveChannel.tp.nid, liveChannel.tp.tsid, liveChannel.sid );
+ if ( !es )
+ goto end;
+ es->lock();
+ esEvents = es->getEvents();
+
+ for ( j=myshift; j<(myshift+2); j++ ) {
+ desc = esEvents->at( j );
+ if ( !desc )
+ continue;
+
+ if ( !desc->title.isEmpty() ) {
+ s = desc->startDateTime.toString( "hh:mm" );
+ s = s+" - ";
+ s = s+desc->title;
+ if ( !osdMode && !first && !myshift ) {
+ QDateTime dt = QDateTime::currentDateTime();
+ int secs = desc->startDateTime.secsTo( dt );
+ i = QTime().secsTo( desc->duration );
+ if ( i!=0 )
+ i = secs*100/i;
+ if ( i>100 )
+ i = 100;
+ list.append( QString("BAR")+QString().setNum( i ) );
+ ++first;
+ }
+ list.append( s );
+ k++;
+ }
+ else if ( osdMode )
+ list.append( "" );
+ if ( osdMode==0 ) {
+ if ( k>1 )
+ break;
+ else
+ continue;
+ }
+ list.append( desc->subtitle );
+ s = "";
+ for ( i=0; i<(int)desc->shortEvents.count(); i++ ) {
+ s = s + desc->shortEvents.at(i)->name;
+ if (!desc->shortEvents.at(i)->name.isEmpty() && !desc->shortEvents.at(i)->text.isEmpty()) {
+ s+= " : ";
+ s+= desc->shortEvents.at(i)->text;
+ s+= ". ";
+ }
+ }
+ for ( i=0; i<(int)desc->extEvents.count(); i++ )
+ s+= *desc->extEvents.at(i);
+ list.append( s );
+ break;
+ }
+ es->unlock();
+
+end:
+ if ( osdMode==0 )
+ osdTimer.start( 5000, true );
+ osdMode++;
+ emit showDvbOSD( s.setNum( liveChannel.num )+" - "+liveChannel.name, list );
+}
+
+
+
+void DvbPanel::enableLiveDvb( bool on )
+{
+ channelsCb->setEnabled( on );
+}
+
+
+
+void DvbPanel::checkFirstRun()
+{
+ if ( dvbConfig->firstRun() )
+ showConfigDialog();
+}
+
+
+
+void DvbPanel::setConfig()
+{
+ int i;
+ int error = 0;
+ KIconViewItem* item = NULL;
+ DvbStream *d;
+
+ QString s = locateLocal("appdata", "");
+ dvbConfig = new DVBconfig( s );
+ item = new DIconViewItem(this, iconView, i18n("All"), KGlobal::iconLoader()->loadIcon(dvbConfig->allIcon, KIcon::NoGroup, KIcon::SizeSmallMedium));
+ iconView->setFixedHeight( item->height()+iconView->horizontalScrollBar()->height() );
+ item->setDropEnabled( true );
+ item = new DIconViewItem(this, iconView, i18n("Radio"), KGlobal::iconLoader()->loadIcon(dvbConfig->radioIcon, KIcon::NoGroup, KIcon::SizeSmallMedium));
+ item->setDropEnabled( false );
+ item = new DIconViewItem(this, iconView, i18n("TV"), KGlobal::iconLoader()->loadIcon(dvbConfig->tvIcon, KIcon::NoGroup, KIcon::SizeSmallMedium));
+ item->setDropEnabled( false );
+
+ KTrader::OfferList offers = KTrader::self()->query("KaffeineDvbPlugin");
+ KTrader::OfferList::Iterator it = offers.begin();
+ if ( it!=offers.end() ) {
+ KService::Ptr ptr = (*it);
+ plugName = ptr->desktopEntryName();
+ plug = KParts::ComponentFactory::createPartInstanceFromService<KaffeineDvbPlugin>(ptr, 0, ptr->name().ascii(), 0, 0, 0, &error);
+ if (error > 0) {
+ fprintf( stderr, "Loading of DVB plugin failed: %s\n", KLibLoader::self()->lastErrorMessage().ascii() );
+ plug = NULL;
+ }
+ else {
+ fprintf( stderr, "DVB plugin loaded\n.");
+ }
+ }
+
+ for ( i=0; i<(int)dvbConfig->categories.count(); i++ ) {
+ item = new DIconViewItem(this, iconView, dvbConfig->categories.at(i)->name, KGlobal::iconLoader()->loadIcon(dvbConfig->categories.at(i)->icon, KIcon::NoGroup, KIcon::SizeSmallMedium));
+ item->setDropEnabled( true );
+ }
+
+ for ( i=0; i<(int)dvbConfig->devList.count(); i++ ) {
+ d = new DvbStream( dvbConfig->devList.at(i), dvbConfig->defaultCharset, &events );
+ d->setPlug( plug );
+ dvb.append( d );
+ connect( d, SIGNAL(shifting(bool)), this, SLOT(setShiftLed(bool)) );
+ connect( d, SIGNAL(isBroadcasting(bool)), this, SLOT(setBroadcastLed(bool)) );
+ connect( d, SIGNAL(timerEnded(RecTimer*)), this, SLOT(killTimer(RecTimer*)) );
+ connect( d, SIGNAL(isRecording(bool)), this, SLOT(setRecordLed(bool)) );
+ connect( d, SIGNAL(playDvb()), this, SLOT(pipeOpened()) );
+ }
+ fifoName = QDir::homeDirPath()+"/.kaxtv.ts";
+ QFile f( fifoName );
+ if ( f.exists() )
+ f.remove();
+ if ( (mkfifo( fifoName.ascii(), 0644 ))<0 ) {
+ perror( fifoName.latin1() );
+ fifoName = "";
+ }
+ fifoName1 = QDir::homeDirPath()+"/.kaxtv1.ts";
+ QFile f1( fifoName1 );
+ if ( f1.exists() )
+ f1.remove();
+ if ( (mkfifo( fifoName1.ascii(), 0644 ))<0 ) {
+ perror( fifoName1.latin1() );
+ fifoName1 = "";
+ }
+ currentFifo = fifoName;
+ getTimerList();
+ timersTimer.start( 5000 );
+ getChannelList();
+ rtp = new Ts2Rtp();
+ rtp->setSocket( dvbConfig->broadcastAddress, dvbConfig->broadcastPort, dvbConfig->senderPort );
+ cleaner = new Cleaner( dvbConfig->shiftDir, dvbConfig->recordDir );
+ split->setSizes( dvbConfig->splitSizes );
+ recallChannel = dvbConfig->lastChannel;
+}
+
+
+
+void DvbPanel::showConfigDialog()
+{
+ int ret;
+
+loop:
+ if ( !dvbConfig->haveData() ) {
+ ret = KMessageBox::questionYesNo( mainWidget, i18n("<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!<br>\
+ Check your internet connection, and say Yes to try again.<br>\
+ Or say No to cancel.<br>\
+ If you already have this archive, copy it to ~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes.<br><br>Should I try again?</qt>") );
+ if ( ret==KMessageBox::Yes )
+ goto loop;
+ return;
+ }
+
+ DvbConfigDialog dlg( dvbConfig, mainWidget, plug );
+ connect( dlg.dumpBtn, SIGNAL(clicked()), this, SLOT(dumpEvents()) );
+ ret = dlg.exec();
+ disconnect( dlg.dumpBtn, SIGNAL(clicked()), this, SLOT(dumpEvents()) );
+ if ( ret==DvbConfigDialog::Rejected )
+ return;
+ rtp->setSocket( dvbConfig->broadcastAddress, dvbConfig->broadcastPort, dvbConfig->senderPort );
+ cleaner->setPaths( dvbConfig->shiftDir, dvbConfig->recordDir );
+}
+
+
+
+QPtrList<Transponder> DvbPanel::getSourcesStatus()
+{
+ int i, j;
+ QStringList list;
+ QPtrList<Transponder> ss;
+ Transponder t;
+
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ list = dvb.at(i)->getSources();
+ for ( j=0; j<(int)list.count(); j++ ) {
+ if ( dvb.at(i)->hasRec() || dvb.at(i)->hasBroadcast() )
+ t = dvb.at(i)->getCurrentTransponder();
+ else {
+ t = Transponder();
+ t.source = list[j];
+ }
+ ss.append( new Transponder( t ) );
+ }
+ }
+ return ss;
+}
+
+
+
+void DvbPanel::fillChannelList( ChannelDesc *ch )
+{
+ int i, j;
+ ChannelDesc *chan;
+ KListViewItem *it, *visible=0;
+ bool cont=false;
+ QPtrList<Transponder> trans = getSourcesStatus();
+ trans.setAutoDelete( true );
+
+ searchLE->clear();
+ channelsCb->clear();
+ for ( i=0; i<(int)channels.count(); i++ ) {
+ chan = channels.at(i);
+ for ( j=0; j<(int)trans.count(); j++ ) {
+ cont = false;
+ if ( trans.at(j)->source==chan->tp.source ) {
+ if ( trans.at(j)->freq ) {
+ if ( chan->tp==*trans.at(j) ) break;
+ }
+ else
+ break;
+ }
+ cont = true;
+ }
+ if ( cont )
+ continue;
+ if ( currentCategory=="TV" ) {
+ if ( chan->type!=1 )
+ continue;
+ }
+ else if ( currentCategory=="Radio" ) {
+ if ( chan->type!=2 )
+ continue;
+ }
+ else if ( currentCategory!="All" && chan->category!=currentCategory )
+ continue;
+ it = new KListViewItem( channelsCb, QString().sprintf("%04d", chan->num), chan->name, chan->tp.source );
+ if ( ch && ch==chan )
+ visible = it;
+ it->setDragEnabled( true );
+ chan->pix.load( dvbConfig->dvbConfigIconsDir+chan->name );
+ if ( !chan->pix.isNull() )
+ it->setPixmap( 1, chan->pix );
+ else {
+ if ( chan->type==1 ) {
+ if ( chan->fta )
+ it->setPixmap( 1, tvcPix );
+ else
+ it->setPixmap( 1, tvPix );
+ }
+ else {
+ if ( chan->fta )
+ it->setPixmap( 1, racPix );
+ else
+ it->setPixmap( 1, raPix );
+ }
+ }
+ }
+ channelsCb->visibleItems = channelsCb->childCount();
+ trans.clear();
+ if ( visible ) {
+ channelsCb->ensureItemVisible( visible );
+ channelsCb->setSelected( visible, true );
+ }
+}
+
+
+
+DvbStream* DvbPanel::getWorkingDvb( int mode, ChannelDesc *chan )
+{
+ int i, ret;
+ QValueList<int> working; // notTuned=0, hasLive=1, hasBroadcast=2, hasRec=3, can'tDoChannel=4
+
+ for ( i=0; i<(int)dvb.count(); i++ )
+ working.append( 0 );
+
+ // fill in working status
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( !dvb.at(i)->canSource( chan ) ) {
+ working[i] = 4;
+ continue;
+ }
+ if ( dvb.at(i)->isTuned() ) {
+ if ( dvb.at(i)->getCurrentTransponder()==chan->tp ) {
+ return dvb.at(i); // use that one since it's already tuned on the good mplex
+ }
+ else if ( dvb.at(i)->hasRec() )
+ working[i] = 3;
+ else if ( dvb.at(i)->hasBroadcast() )
+ working[i] = 2;
+ else
+ working[i] = 1;
+ }
+ else
+ working[i] = 0;
+ }
+ ret = 0;
+ // search for least working card
+ for ( i=1; i<(int)working.count(); i++ ) {
+ if ( working[i]<working[0] ) {
+ working[0] = working[i];
+ ret = i;
+ }
+ }
+ if ( working[0]<mode )
+ return dvb.at(ret);
+ else
+ return 0;
+}
+
+
+
+void DvbPanel::setBroadcast()
+{
+ int ret, i;
+ QPtrList<ChannelDesc> list;
+ bool live=false;
+ DvbStream *d;
+
+ BroadcastEditor dlg( mainWidget, &channels, &list );
+ ret = dlg.exec();
+ if ( ret==BroadcastEditor::Rejected )
+ return;
+
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasBroadcast() )
+ dvb.at(i)->stopBroadcast();
+ }
+ if ( ! list.count() ) {
+ return;
+ }
+
+ d = getWorkingDvb( 2, list.at(0) );
+
+ if ( d )
+ ret = d->canStartBroadcast( live, list.at(0) );
+ else
+ ret = -1;
+ if ( ret==0 ) {
+ if ( live ) {
+ stopLive();
+ emit dvbStop();
+ }
+ if ( !d->startBroadcast( &list, rtp ) ) {
+ KMessageBox::information( mainWidget, i18n("Broadcasting failed.") );
+ }
+ }
+ else
+ KMessageBox::information( mainWidget, i18n("Can't start broadcasting.") );
+}
+
+
+
+void DvbPanel::checkTimers()
+{
+ int i, j, ret;
+ bool live=false;
+ RecTimer *t;
+ ChannelDesc *chan;
+ QDateTime cur=QDateTime::currentDateTime();
+ DvbStream *d;
+
+ for ( i=0; i<(int)timers.count(); i++ ) {
+ t = timers.at(i);
+ if ( t->running )
+ continue;
+ if ( t->begin<=cur && cur<t->begin.addSecs(QTime().secsTo(t->duration)) ) {
+ chan = 0;
+ for ( j=0; j<(int)channels.count(); j++ ) {
+ if ( channels.at(j)->name==t->channel ) {
+ chan = channels.at(j);
+ break;
+ }
+ }
+ if ( !chan )
+ continue;
+ d = getWorkingDvb( 3, chan );
+ live = false;
+ if ( d )
+ ret = d->canStartTimer( live, chan );
+ else
+ ret = -1;
+ if ( ret==0 ) {
+ if ( live ) {
+ stopLive();
+ emit dvbStop();
+ }
+ if ( d->startTimer( chan, dvbConfig->recordDir, dvbConfig->sizeFile, t, dvbConfig->filenameFormat ) ) {
+ KProcess proc;
+ proc << QDir::homeDirPath()+"/bin/kaffeine_recording";
+ proc << "On";
+ proc.start( KProcess::DontCare );
+ t->running = 1;
+ if ( timersDialog )
+ emit timersChanged();
+ saveTimerList();
+ i--;
+ }
+ else
+ fprintf( stderr, "start timer failed!!!\n" );
+ }
+ else
+ fprintf( stderr, "Cant start timer !!!\n" );
+ }
+ else if ( t->mode ) {
+ if (t->begin.addSecs(t->duration.hour()*3600+t->duration.minute()*60+60)<cur) {
+ updateModeTimer( t );
+ if ( timersDialog )
+ emit timersChanged();
+ }
+ }
+ }
+}
+
+
+
+void DvbPanel::setRecord()
+{
+ ChannelDesc curchan;
+ QString s="";
+ int ret, i, r=0;
+ bool live=false;
+ RecTimer *t, *rt;
+ EventDesc *desc;
+ DvbStream *d=0;
+
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasLive() ) {
+ d = dvb.at(i);
+ curchan = d->getLiveChannel();
+ break;
+ }
+ }
+ if ( !d ) {
+ recordBtn->setOn( false );
+ showTimers();
+ return;
+ }
+
+ desc = events.getEventDesc( curchan.tp.source, curchan.tp.nid, curchan.tp.tsid, curchan.sid, 0 );
+
+ if ( desc )
+ s = desc->title;
+
+ if ( s.isEmpty() ) {
+ if ( !dvbConfig->filenameFormat.contains("%chan") )
+ s = curchan.name;
+ if ( !dvbConfig->filenameFormat.contains("%date") )
+ s+="_"+QDateTime::currentDateTime().toString( "yyyyMMdd-hhmmss" );
+ }
+
+ rt = new RecTimer();
+ rt->name = s;
+ rt->channel = curchan.name;
+ rt->begin = QDateTime::currentDateTime();
+ rt->duration = QTime( 0,0,0).addSecs( dvbConfig->instantDuration*60 ) ;
+ rt->running = 1;
+ rt->mode = 0;
+
+ ret = d->canStartTimer( live, &curchan );
+ if ( ret==0 ) {
+ if ( d->startTimer( &curchan, dvbConfig->recordDir, dvbConfig->sizeFile, rt, dvbConfig->filenameFormat ) ) {
+ KProcess proc;
+ proc << QDir::homeDirPath()+"/bin/kaffeine_recording";
+ proc << "On";
+ proc.start( KProcess::DontCare );
+
+ for ( i=0; i<(int)timers.count(); i++ ) {
+ t = timers.at(i);
+ if ( rt->begin>t->begin )
+ r=i+1;
+ }
+ timers.insert( r, rt );
+ if ( timersDialog )
+ emit timersChanged();
+ saveTimerList();
+ emit showOSD( i18n("Instant Record successfully started"), 5000, 3 );
+ }
+ else {
+ KMessageBox::information( mainWidget, i18n("Instant Recording failed to start.") );
+ fprintf( stderr, "DvbPanel::setRecord:start timer failed!\n" );
+ delete rt;
+ }
+ }
+ else {
+ delete rt;
+ for ( i=0; i<(int)timers.count(); i++ ) {
+ t = timers.at(i);
+ if ( d->liveIsRecording() && t->running && curchan.name == t->channel ) {
+ d->updateTimer( t, 0 );
+ emit showOSD( i18n("Recording successfully stopped"), 5000, 3 );
+ return;
+ }
+ }
+ showTimers();
+ }
+}
+
+
+
+void DvbPanel::setRecordLed( bool on )
+{
+ int i;
+ bool rec=false;
+
+ if ( on ) {
+ recordLed->on();
+ fillChannelList();
+ }
+ else {
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasRec() ) {
+ rec = true;
+ break;
+ }
+ }
+ if ( !rec )
+ recordLed->off();
+ else
+ recordLed->on();
+ fillChannelList();
+ }
+
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->liveIsRecording() ) {
+ recordBtn->setOn( true );
+ return;
+ }
+ }
+ recordBtn->setOn( false );
+}
+
+
+void DvbPanel::setBroadcastLed( bool on )
+{
+ int i;
+ bool broad=false;
+
+ if ( on ) {
+ broadcastLed->on();
+ fillChannelList();
+ }
+ else {
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasBroadcast() ) {
+ broad = true;
+ break;
+ }
+ }
+ if ( !broad )
+ broadcastLed->off();
+ else
+ broadcastLed->on();
+ fillChannelList();
+ }
+}
+
+
+
+void DvbPanel::killTimer( RecTimer *t )
+{
+ int i;
+
+ for ( i=0; i<(int)timers.count(); i++ ) {
+ if ( timers.at(i)==t ) {
+ KProcess proc;
+ proc << QDir::homeDirPath()+"/bin/kaffeine_recording";
+ if ( recordLed->state()==KLed::On )
+ proc << "On";
+ else
+ proc << "Off";
+ proc << KProcess::quote( t->fullPath );
+ proc.start( KProcess::DontCare );
+
+ if ( t->mode )
+ updateModeTimer( t );
+ else
+ timers.remove( t );
+ if ( timersDialog )
+ emit timersChanged();
+ return;
+ }
+ }
+}
+
+
+
+void DvbPanel::updateModeTimer( RecTimer *t )
+{
+ int stop=0, r=0, i;
+
+ if ( t->mode==CronTimer::Daily )
+ t->begin = t->begin.addDays(1);
+ else if ( t->mode==CronTimer::Weekly )
+ t->begin = t->begin.addDays(7);
+ else if ( t->mode==CronTimer::Monthly )
+ t->begin = t->begin.addMonths(1);
+ else while ( !stop ) {
+ t->begin = t->begin.addDays(1);
+ if ( (t->begin.date().dayOfWeek()==1) && (t->mode&CronTimer::Monday) ) stop++;
+ else if ( (t->begin.date().dayOfWeek()==2) && (t->mode&CronTimer::Tuesday) ) stop++;
+ else if ( (t->begin.date().dayOfWeek()==3) && (t->mode&CronTimer::Wednesday) ) stop++;
+ else if ( (t->begin.date().dayOfWeek()==4) && (t->mode&CronTimer::Thursday) ) stop++;
+ else if ( (t->begin.date().dayOfWeek()==5) && (t->mode&CronTimer::Friday) ) stop++;
+ else if ( (t->begin.date().dayOfWeek()==6) && (t->mode&CronTimer::Saturday) ) stop++;
+ else if ( (t->begin.date().dayOfWeek()==7) && (t->mode&CronTimer::Sunday) ) stop++;
+ }
+
+ RecTimer *nt = new RecTimer();
+ nt->name = t->name;
+ nt->channel = t->channel;
+ nt->begin = t->begin;
+ nt->duration = t->duration;
+ nt->running = 0;
+ nt->mode = t->mode;
+ timers.remove( t );
+ for ( i=0; i<(int)timers.count(); i++ ) {
+ t = timers.at(i);
+ if ( nt->begin>t->begin )
+ r=i+1;
+ }
+ timers.insert( r, nt );
+}
+
+
+
+void DvbPanel::showTimers()
+{
+ int i;
+ QStringList list;
+ QMap<QString,QString> map;
+
+ if ( channels.count()==0 ) {
+ KMessageBox::sorry( 0, i18n("You may want to define some channel first!") );
+ return;
+ }
+ for ( QPtrListIterator<ChannelDesc> it(channels); it.current(); ++it )
+ map[it.current()->name] = it.current()->name;
+ QMap<QString,QString>::Iterator it;
+ QMap<QString,QString>::Iterator end(map.end());
+ for ( it = map.begin(); it != end; ++it )
+ list.append( it.data() );
+
+ timersDialog = new KRecord( list, &timers, mainWidget, dvbConfig->timerSize );
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ connect( timersDialog, SIGNAL(updateTimer(RecTimer*,int)), dvb.at(i), SLOT(updateTimer(RecTimer*,int)) );
+ }
+ connect( this, SIGNAL(timersChanged()), timersDialog, SLOT(refresh()) );
+ timersDialog->exec();
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ disconnect( timersDialog, SIGNAL(updateTimer(RecTimer*,int)), dvb.at(i), SLOT(updateTimer(RecTimer*,int)) );
+ }
+ disconnect( this, SIGNAL(timersChanged()), timersDialog, SLOT(refresh()) );
+ dvbConfig->timerSize = timersDialog->size();
+ delete timersDialog;
+ timersDialog = 0;
+ saveTimerList();
+}
+
+
+
+int DvbPanel::getSNR( int device )
+{
+ if ( device<0 || device>=(int)dvb.count() )
+ return -1;
+ return dvb.at(device)->getSNR();
+}
+
+
+void DvbPanel::dvbNewTimer( QString name, QString channel, QString datetime, QString duration )
+{
+ newTimer( channel, name, QDateTime::fromString( datetime, Qt::ISODate ), QTime::fromString( duration ), false );
+}
+
+
+
+void DvbPanel::newTimer( QString channel, QString name, QDateTime begin, QTime duration, bool warn )
+{
+ int i, r=0;
+ RecTimer *t;
+ RecTimer *rt = new RecTimer();
+
+ rt->name = name.replace("/","_").replace(">","_").replace("<","_").replace(":","_").replace('"',"_").replace("\\","_").replace("|","_");
+ rt->channel = channel;
+ rt->begin = begin.addSecs( -(dvbConfig->beginMargin*60) );
+ rt->duration = duration.addSecs( (dvbConfig->beginMargin+dvbConfig->endMargin)*60 ) ;
+ rt->running = 0;
+ rt->mode = 0;
+
+ for ( i=0; i<(int)timers.count(); i++ ) {
+ t = timers.at(i);
+ if ( rt->begin>t->begin )
+ r=i+1;
+ }
+ timers.insert( r, rt );
+ if ( warn )
+ KMessageBox::information( 0, i18n("Timer successfully created.") );
+}
+
+
+
+void DvbPanel::scanner()
+{
+ int ret;
+
+loop:
+ if ( !dvbConfig->haveData() ) {
+ ret = KMessageBox::questionYesNo( mainWidget, i18n("<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!<br>\
+ Check your internet connection, and say Yes to try again.<br>\
+ Or say No to cancel.<br>\
+ If you already have this archive, copy it to ~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes.<br><br>Should I try again?</qt>") );
+ if ( ret==KMessageBox::Yes )
+ goto loop;
+ return;
+ }
+
+ if ( !dvbConfig->haveData() )
+ return;
+ ScanDialog dlg( &dvb, &channels, dvbConfig->scanSize, dvbConfig->dvbConfigDir, dvbConfig->defaultCharset );
+ dlg.exec();
+ dvbConfig->scanSize = dlg.size();
+ fillChannelList();
+ saveChannelList();
+}
+
+
+
+void DvbPanel::showEvents()
+{
+ events.doClean( false );
+ KEvents dlg( &channels, &dvb, &events, mainWidget, dvbConfig->epgSize );
+ connect( &dlg, SIGNAL(addTimer(QString,QString,QDateTime,QTime)), this, SLOT(newTimer(QString,QString,QDateTime,QTime)) );
+ connect( &dlg, SIGNAL(zapTo(const QString &)), this, SLOT(channelSelected(const QString &)) );
+ dlg.exec();
+ dvbConfig->epgSize = dlg.size();
+ disconnect( &dlg, SIGNAL(addTimer(QString,QString,QDateTime,QTime)), this, SLOT(newTimer(QString,QString,QDateTime,QTime)) );
+ disconnect( &dlg, SIGNAL(zapTo(const QString &)), this, SLOT(channelSelected(const QString &)) );
+ events.doClean( true );
+}
+
+
+
+void DvbPanel::setShiftLed( bool on )
+{
+ if ( on ) {
+ shiftLed->on();
+ diskTimer.start( 300000 );
+ }
+ else {
+ shiftLed->off();
+ diskTimer.stop();
+ }
+}
+
+
+
+void DvbPanel::channelSelected( const QString &name )
+{
+ QPtrListIterator<ChannelDesc> iter( channels );
+ ChannelDesc *itdesc;
+
+ iter.toFirst();
+ while ( (itdesc=iter.current())!=0 ) {
+ if ( itdesc->name==name ) {
+ dvbZap( itdesc );
+ break;
+ }
+ ++iter;
+ }
+}
+
+
+
+void DvbPanel::channelSelected( QListViewItem *it )
+{
+ QPtrListIterator<ChannelDesc> iter( channels );
+ ChannelDesc *itdesc;
+
+ if ( !it )
+ return;
+
+ iter.toFirst();
+ while ( (itdesc=iter.current())!=0 ) {
+ if ( itdesc->name==it->text(1) ) {
+ dvbZap( itdesc );
+ break;
+ }
+ ++iter;
+ }
+}
+
+
+
+bool DvbPanel::nextTrack( MRL& )
+{
+ next();
+ return false;
+}
+
+
+
+bool DvbPanel::previousTrack( MRL& )
+{
+ previous();
+ return false;
+}
+
+
+
+bool DvbPanel::currentTrack( MRL& )
+{
+ playLastChannel();
+ return false;
+}
+
+
+
+bool DvbPanel::trackNumber( int num, MRL& )
+{
+ playNumChannel( num );
+ return false;
+}
+
+
+
+void DvbPanel::recallZap()
+{
+ emit showMe( this );
+ playNumChannel( recallChannel );
+}
+
+
+
+void DvbPanel::playNumChannel( int num )
+{
+ int j;
+ bool ok=false;
+
+ if ( !channelsCb->isEnabled() )
+ return;
+
+ for ( j=0; j<(int)channels.count(); j++ ) {
+ if ( (int)channels.at(j)->num==num ) {
+ ok = true;
+ break;
+ }
+ }
+
+ if ( ok )
+ dvbZap( channels.at( j ) );
+}
+
+
+
+bool DvbPanel::playbackFinished( MRL& )
+{
+ return false;
+}
+
+
+
+void DvbPanel::playLastChannel()
+{
+ /*int ret, i, j;
+ QPtrList<ChannelDesc> list;
+ bool live=false, ok=false;
+ DvbStream *d;
+
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasBroadcast() )
+ dvb.at(i)->stopBroadcast();
+ }
+ ++dvbConfig->lastChannel;
+ if ( dvbConfig->lastChannel>channels.count() )
+ dvbConfig->lastChannel = 1;
+ for ( j=0; j<(int)channels.count(); j++ ) {
+ if ( (int)channels.at(j)->num==dvbConfig->lastChannel ) {
+ ok = true;
+ list.append( channels.at(j) );
+ break;
+ }
+ }
+ if ( ! list.count() ) {
+ QTimer::singleShot( 2000, this, SLOT(playLastChannel()) );
+ return;
+ }
+ d = getWorkingDvb( 2, list.at(0) );
+ if ( d )
+ ret = d->canStartBroadcast( live, list.at(0) );
+ else
+ ret = -1;
+ if ( ret==0 ) {
+ if ( live ) {
+ stopLive();
+ emit dvbStop();
+ }
+ if ( !d->startBroadcast( &list, rtp ) ) {
+ fprintf( stderr, "Broadcasting failed.\n" );
+ }
+ else {
+ fprintf( stderr, "Tuning to: %s / autocount: %lu\n", channels.at(j)->name.ascii(), autocount );
+ ++autocount;
+ }
+ }
+ else
+ fprintf( stderr, "Can't start broadcasting.\n");
+
+ QTimer::singleShot( 2000, this, SLOT(playLastChannel()) );
+ return;*/
+
+
+
+
+ int j;
+ bool ok=false;
+
+ if ( !channelsCb->isEnabled() )
+ return;
+
+ for ( j=0; j<(int)channels.count(); j++ ) {
+ if ( (int)channels.at(j)->num==dvbConfig->lastChannel ) {
+ ok = true;
+ break;
+ }
+ }
+ if ( !ok )
+ return;
+
+ dvbZap( channels.at(j) );
+}
+
+
+
+void DvbPanel::next()
+{
+ if ( !channelsCb->isEnabled() )
+ return;
+
+ QListViewItem* nextItem;
+
+ QListViewItem* playingItem = channelsCb->findItem( QString().sprintf("%04d", dvbConfig->lastChannel), 0 );
+
+ if ( !playingItem == 0 ) // yes, it's in the current category
+ {
+ if ( playingItem == channelsCb->lastItem() )
+ nextItem = channelsCb->firstChild(); // wrap around
+ else
+ nextItem = playingItem->itemBelow();
+ }
+ else // not in current category, user has switched category, use first in current cat
+ nextItem = channelsCb->firstChild();
+
+ channelsCb->setSelected( nextItem, true );
+ channelSelected( nextItem );
+
+}
+
+
+
+void DvbPanel::previous()
+{
+ if ( !channelsCb->isEnabled() )
+ return;
+
+ QListViewItem* prevItem;
+
+ QListViewItem* playingItem = channelsCb->findItem( QString().sprintf("%04d", dvbConfig->lastChannel), 0 );
+
+ if ( !playingItem == 0 ) // yes, it's in the current category
+ {
+ if ( playingItem == channelsCb->firstChild() )
+ prevItem = channelsCb->lastItem(); // wrap around
+ else
+ prevItem = playingItem->itemAbove();
+ }
+ else // not in current category, user has switched category, use first in current cat
+ prevItem = channelsCb->firstChild();
+
+ channelsCb->setSelected( prevItem, true );
+ channelSelected( prevItem );
+}
+
+
+
+void DvbPanel::dvbZap( ChannelDesc *chan )
+{
+ int i;
+ DvbStream *d=0;
+
+ if ( currentFifo.isEmpty() || isTuning )
+ return;
+
+ isTuning = true;
+ emit setTimeShiftFilename( "" );
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->getCurrentTransponder()==chan->tp ) {
+ d = dvb.at(i);
+ break;
+ }
+ }
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasLive() ) {
+ dvb.at(i)->preStopLive();
+ emit dvbPause( false );
+ dvb.at(i)->stopLive( chan );
+ break;
+ }
+ }
+ finalZap( d, chan );
+}
+
+
+
+void DvbPanel::pipeOpened()
+{
+ tuningTimer.start( 1000, true );
+}
+
+
+
+void DvbPanel::setTuning()
+{
+ tuningTimer.stop();
+ stopTuningTimer.stop();
+ isTuning = false;
+}
+
+
+
+void DvbPanel::finalZap( DvbStream *d, ChannelDesc *chan )
+{
+ QString s, t;
+ int i;
+ DvbStream *d1=d, *d2=0;
+
+ emit setCurrentPlugin( this );
+
+ fprintf( stderr, "Tuning to: %s / autocount: %lu\n", chan->name.latin1(), autocount );
+ QTime tm;
+ tm.start();
+ if ( !d1 ) {
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( !dvb.at(i)->canSource( chan ) )
+ continue;
+ if ( dvb.at(i)->isTuned() ) {
+ if ( dvb.at(i)->getCurrentTransponder()==chan->tp ) {
+ d1 = dvb.at(i);
+ break;
+ }
+ else d2 = dvb.at(i);
+ }
+ else {
+ d1 = dvb.at(i);
+ break;
+ }
+ }
+ if ( !d1 && d2 )
+ d1 = d2;
+ }
+
+ if ( !d1 ) {
+ emit dvbStop();
+ isTuning = false;
+ return;
+ }
+
+ int ret = d1->goLive( chan, currentFifo );
+
+ switch ( ret ) {
+ case DvbStream::ErrIsRecording :
+ emit showOSD( i18n("Still recording."), 5000, 3 );
+ break;
+ case DvbStream::ErrIsBroadcasting :
+ emit showOSD( i18n("Still broadcasting."), 5000, 3 );
+ break;
+ case DvbStream::ErrCantTune :
+ emit showOSD( i18n("Can't tune dvb!"), 5000, 3 );
+ break;
+ case DvbStream::ErrCantSetPids :
+ emit showOSD( i18n("Can't set pid(s)"), 5000, 3 );
+ break;
+ case DvbStream::ErrCamUsed :
+ emit showOSD( i18n("No CAM free"), 5000, 3 );
+ break;
+ }
+
+ fprintf( stderr, "Tuning delay: %d ms\n", tm.elapsed() );
+ osdMode = 0;
+ if ( ret<1 ) {
+ emit dvbOpen( currentFifo, s.setNum( chan->num)+" - "+chan->name, chan->vpid );
+ showOsdTimer.start( 2000, true );
+ ++autocount;
+ stopTuningTimer.start( 5000, true );
+ if ( currentFifo==fifoName ) {
+ if ( !fifoName1.isEmpty() )
+ currentFifo = fifoName1;
+ }
+ else {
+ if ( !fifoName.isEmpty() )
+ currentFifo = fifoName;
+ }
+ if ( channelsCb->visibleItems<5 ) {
+ resetSearch();
+ }
+
+ if ( d1->liveIsRecording() )
+ recordBtn->setOn( true );
+ else
+ recordBtn->setOn( false );
+ }
+ else {
+ recordBtn->setOn( false );
+ isTuning = false;
+ emit dvbStop();
+ }
+ if ( dvbConfig->lastChannel!=(int)chan->num ) {
+ recallChannel = dvbConfig->lastChannel;
+ dvbConfig->lastChannel = chan->num;
+ }
+ //QTimer::singleShot( 3000, this, SLOT(playLastChannel()) );
+}
+
+
+
+void DvbPanel::pauseLiveTV()
+{
+ int i;
+ DvbStream *d=0;
+
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasLive() ) {
+ d = dvb.at(i);
+ break;
+ }
+ }
+ if ( !d )
+ return;
+
+ timeShiftFileName = dvbConfig->shiftDir+"DVBLive-"+QDateTime::currentDateTime().toString("yyyyMMddThhmmss")+".m2t";
+ if ( d->doPause( timeShiftFileName ) )
+ emit setTimeShiftFilename( timeShiftFileName );
+}
+
+
+
+bool DvbPanel::timeShiftMode()
+{
+ int i;
+
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasLive() ) {
+ return dvb.at(i)->timeShiftMode();
+ break;
+ }
+ }
+ return false;
+}
+
+
+
+void DvbPanel::stopLive()
+{
+ int i;
+ ChannelDesc chan;
+
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasLive() ) {
+ recallChannel = dvb.at(i)->getLiveChannel().num;
+ dvb.at(i)->preStopLive();
+ dvb.at(i)->stopLive( &chan );
+ break;
+ }
+ }
+ recordBtn->setOn( false );
+ emit setTimeShiftFilename( "" );
+}
+
+
+// TV | vpid(stream_type) | apid1(lang)(ac3),apid2, | ttpid | sid | tsid | type(S,C,T)source | freq | sr | pol | fecH | inv | mod | fecL | bw | trans | guard | hier | number / subpid1(type)(pageid)(ancid)(lang),subpid2..., | category | nid |
+bool DvbPanel::getChannelList()
+{
+ bool ret=false;
+ QString s, c, t, u, type;
+ int pos, tpos;
+ ChannelDesc *chan;
+ QString src="";
+ int ns;
+ KListViewItem *it;
+ QPixmap pix;
+
+ maxChannelNumber = 0;
+ minChannelNumber = -1;
+
+ int sort = dvbConfig->readDvbChanOrder();
+ if ( sort ) {
+ int column = sort&1;
+ int order = sort>>1;
+ switch (order){
+ case 1:
+ channelsCb->setSorting ( column, FALSE );
+ break;
+ case 0:
+ channelsCb->setSorting ( column, TRUE );
+ break;
+ }
+ }
+
+ QFile f( locateLocal("appdata", "channels.dvb" ) );
+ if ( f.open(IO_ReadOnly) ) {
+ QTextStream tt( &f );
+ while ( !tt.eof() ) {
+ s = tt.readLine();
+ if ( s.startsWith("#") ) {
+ if ( s.contains("KaxTV") )
+ break;
+ continue;
+ }
+ chan = new ChannelDesc();
+ pos = s.find("|");
+ c = s.left( pos );
+ if ( c=="TV" || c=="TVC" )
+ chan->type=1;
+ else
+ chan->type=2;
+ if ( c=="TVC" || c=="RAC" )
+ chan->fta=1;
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ chan->name = s.left( pos );
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ c = s.left( pos );
+ s = s.right( s.length()-pos-1 );
+ tpos = c.find("(");
+ if ( tpos>0 )
+ chan->vpid = c.left(tpos).toUShort();
+ else
+ chan->vpid = c.toUShort();
+ if( tpos>0 ) {
+ t = c.right( c.length()-tpos-1);
+ t.remove(")");
+ chan->vType = t.toUShort();
+ }
+ else
+ chan->vType = 2;
+ if ( !chan->vpid )
+ chan->vType = 0;
+ pos = s.find("|");
+ c = s.left( pos );
+ s = s.right( s.length()-pos-1 );
+ while ( (pos=c.find(","))!=-1 ) {
+ t = c.left(pos);
+ chan->napid++;
+ if ( t.contains("(ac3)") ) {
+ chan->apid[chan->napid-1].ac3=1;
+ t.remove("(ac3)");
+ }
+ if( (tpos=t.find("("))!=-1 ) {
+ t.remove(")");
+ chan->apid[chan->napid-1].lang=t.right( t.length()-tpos-1 );
+ t = t.left( tpos );
+ }
+ chan->apid[chan->napid-1].pid=t.toUShort();
+ c = c.right( c.length()-pos-1 );
+ }
+ pos = s.find("|");
+ chan->ttpid = s.left(pos).toUShort();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ chan->sid = s.left(pos).toUShort();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ chan->tp.tsid = s.left(pos).toUShort();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ c = s.left(pos);
+ if ( c.startsWith("T") ) {
+ chan->tp.type=FE_OFDM;
+ chan->tp.source = "Terrestrial";
+ }
+ else if ( c.startsWith("C") ) {
+ chan->tp.type=FE_QAM;
+ chan->tp.source = "Cable";
+ }
+ else if ( c.startsWith("S") ) {
+ chan->tp.type=FE_QPSK;
+ c.remove( 0, 1 );
+ chan->tp.source = c;
+ }
+ else {
+ chan->tp.type=FE_ATSC;
+ chan->tp.source = "Atsc";
+ }
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ chan->tp.freq = s.left(pos).toULong();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ chan->tp.sr = s.left(pos).toULong();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ c = s.left( pos );
+ chan->tp.pol = c[0].latin1();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ switch ( s.left(pos).toInt() ) {
+ case 0 : chan->tp.coderateH = FEC_NONE; break;
+ case 12 : chan->tp.coderateH = FEC_1_2; break;
+ case 23 : chan->tp.coderateH = FEC_2_3; break;
+ case 34 : chan->tp.coderateH = FEC_3_4; break;
+ case 45 : chan->tp.coderateH = FEC_4_5; break;
+ case 56 : chan->tp.coderateH = FEC_5_6; break;
+ case 67 : chan->tp.coderateH = FEC_6_7; break;
+ case 78 : chan->tp.coderateH = FEC_7_8; break;
+ case 89 : chan->tp.coderateH = FEC_8_9; break;
+ case -1 : chan->tp.coderateH = FEC_AUTO;
+ }
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ switch ( s.left(pos).toInt() ) {
+ case 0 : chan->tp.inversion = INVERSION_OFF; break;
+ case 1 : chan->tp.inversion = INVERSION_ON; break;
+ case -1 : chan->tp.inversion = INVERSION_AUTO;
+ }
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ switch ( s.left(pos).toInt() ) {
+ case 8 : chan->tp.modulation = QPSK; break;
+ case 16 : chan->tp.modulation = QAM_16; break;
+ case 32 : chan->tp.modulation = QAM_32; break;
+ case 64 : chan->tp.modulation = QAM_64; break;
+ case 128 : chan->tp.modulation = QAM_128; break;
+ case 256 : chan->tp.modulation = QAM_256; break;
+ case 108 : chan->tp.modulation = VSB_8; break;
+ case 116 : chan->tp.modulation = VSB_16; break;
+ case -1 : chan->tp.modulation = QAM_AUTO;
+ }
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ switch ( s.left(pos).toInt() ) {
+ case 0 : chan->tp.coderateL = FEC_NONE; break;
+ case 12 : chan->tp.coderateL = FEC_1_2; break;
+ case 23 : chan->tp.coderateL = FEC_2_3; break;
+ case 34 : chan->tp.coderateL = FEC_3_4; break;
+ case 45 : chan->tp.coderateL = FEC_4_5; break;
+ case 56 : chan->tp.coderateL = FEC_5_6; break;
+ case 67 : chan->tp.coderateL = FEC_6_7; break;
+ case 78 : chan->tp.coderateL = FEC_7_8; break;
+ case 89 : chan->tp.coderateL = FEC_8_9; break;
+ case -1 : chan->tp.coderateL = FEC_AUTO;
+ }
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ switch ( s.left(pos).toInt() ) {
+ case 8 : chan->tp.bandwidth = BANDWIDTH_8_MHZ; break;
+ case 7 : chan->tp.bandwidth = BANDWIDTH_7_MHZ; break;
+ case 6 : chan->tp.bandwidth = BANDWIDTH_6_MHZ; break;
+ case -1 : chan->tp.bandwidth = BANDWIDTH_AUTO;
+ }
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ switch ( s.left(pos).toInt() ) {
+ case 2 : chan->tp.transmission = TRANSMISSION_MODE_2K; break;
+ case 8 : chan->tp.transmission = TRANSMISSION_MODE_8K; break;
+ case -1 : chan->tp.transmission = TRANSMISSION_MODE_AUTO;
+ }
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ switch ( s.left(pos).toInt() ) {
+ case 32 : chan->tp.guard = GUARD_INTERVAL_1_32; break;
+ case 16 : chan->tp.guard = GUARD_INTERVAL_1_16; break;
+ case 8 : chan->tp.guard = GUARD_INTERVAL_1_8; break;
+ case 4 : chan->tp.guard = GUARD_INTERVAL_1_4; break;
+ case -1 : chan->tp.guard = GUARD_INTERVAL_AUTO;
+ }
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ switch ( s.left(pos).toInt() ) {
+ case 0 : chan->tp.hierarchy = HIERARCHY_NONE; break;
+ case 1 : chan->tp.hierarchy = HIERARCHY_1; break;
+ case 2 : chan->tp.hierarchy = HIERARCHY_2; break;
+ case 4 : chan->tp.hierarchy = HIERARCHY_4; break;
+ case -1 : chan->tp.hierarchy = HIERARCHY_AUTO;
+ }
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ chan->num = s.left(pos).toUInt();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ c = s.left( pos );
+ s = s.right( s.length()-pos-1 );
+ while ( (pos=c.find(","))!=-1 ) {
+ t = c.left(pos);
+ tpos=t.find("(");
+ ns = (int)chan->nsubpid;
+ chan->subpid[ns].pid = t.left(tpos).toUShort();
+ t = t.right( t.length()-tpos-1 );
+ tpos=t.find(")");
+ chan->subpid[ns].type = t.left(tpos).toUShort();
+ t = t.right( t.length()-tpos-2 );
+ tpos=t.find(")");
+ chan->subpid[ns].page = t.left(tpos).toUShort();
+ t = t.right( t.length()-tpos-2 );
+ tpos=t.find(")");
+ chan->subpid[ns].id = t.left(tpos).toUShort();
+ t = t.right( t.length()-tpos-2 );
+ tpos=t.find(")");
+ chan->subpid[ns].lang = t.left(tpos);
+ c = c.right( c.length()-pos-1 );
+ chan->nsubpid++;
+ }
+ pos = s.find("|");
+ chan->category = s.left( pos );
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ chan->tp.nid = s.left(pos).toUShort();
+
+ if ( chan->tp.source.isEmpty() ) {
+ delete chan;
+ continue;
+ }
+
+ chan->pix.load( dvbConfig->dvbConfigIconsDir+chan->name );
+ it = new KListViewItem( channelsCb, QString().sprintf("%04d", chan->num), chan->name, chan->tp.source );
+ it->setDragEnabled( true );
+ if ( !chan->pix.isNull() )
+ it->setPixmap( 1, chan->pix );
+ else {
+ if ( chan->type==1 ) {
+ if ( chan->fta )
+ it->setPixmap( 1, tvcPix );
+ else
+ it->setPixmap( 1, tvPix );
+ }
+ else {
+ if ( chan->fta )
+ it->setPixmap( 1, racPix );
+ else
+ it->setPixmap( 1, raPix );
+ }
+ }
+ channels.append( chan );
+ if ( chan->num<=0 )
+ chan->num = channels.count();
+
+ if ( (int)chan->num > maxChannelNumber )
+ maxChannelNumber = chan->num;
+ if ( minChannelNumber == -1 || (int)chan->num < minChannelNumber )
+ minChannelNumber = chan->num;
+
+ }
+ ret = true;
+ f.close();
+ }
+ return ret;
+}
+
+
+
+bool DvbPanel::saveChannelList()
+{
+ bool ret=false;
+ int i, k;
+ QString s;
+ ChannelDesc *chan=0;
+
+ QFile f( locateLocal("appdata", "channels.dvb" ) );
+ if ( f.open(IO_WriteOnly|IO_Truncate) ) {
+ QTextStream tt( &f );
+ tt<<"#Generated by Kaffeine 0.5\n";
+ for( i=0; i<(int)channels.count(); i++ ) {
+ chan = channels.at(i);
+ if ( chan->type==1 ) {
+ if ( chan->fta )
+ tt<<"TVC|";
+ else
+ tt<<"TV|";
+ }
+ else {
+ if ( chan->fta )
+ tt<<"RAC|";
+ else
+ tt<<"RA|";
+ }
+ tt<< chan->name+"|";
+ tt<< s.setNum(chan->vpid);
+ if ( chan->vType ) {
+ tt<< "(";
+ tt<< s.setNum(chan->vType);
+ tt<< ")";
+ }
+ tt<< "|";
+ for ( k=0; k<chan->napid; k++ ) {
+ tt<< s.setNum(chan->apid[k].pid);
+ if ( !chan->apid[k].lang.isEmpty() )
+ tt<< "("+chan->apid[k].lang+")";
+ if ( chan->apid[k].ac3 )
+ tt<< "(ac3)";
+ tt<< ",";
+ }
+ tt<< "|";
+ tt<< s.setNum(chan->ttpid)+"|";
+ tt<< s.setNum(chan->sid)+"|";
+ tt<< s.setNum(chan->tp.tsid)+"|";
+ switch ( chan->tp.type ) {
+ case FE_QPSK : tt<< "S"; tt<< chan->tp.source; break;
+ case FE_QAM : tt<< "Cable"; break;
+ case FE_OFDM : tt<< "Terrestrial"; break;
+ case FE_ATSC : tt<< "Atsc"; break;
+ }
+ tt<< "|";
+ tt<< s.setNum(chan->tp.freq)+"|";
+ tt<< s.setNum(chan->tp.sr)+"|";
+ if ( chan->tp.pol=='h' )
+ tt<< "h|";
+ else
+ tt<< "v|";
+ switch ( chan->tp.coderateH ) {
+ case FEC_NONE : tt<< "0|"; break;
+ case FEC_1_2 : tt<< "12|"; break;
+ case FEC_2_3 : tt<< "23|"; break;
+ case FEC_3_4 : tt<< "34|"; break;
+ case FEC_4_5 : tt<< "45|"; break;
+ case FEC_5_6 : tt<< "56|"; break;
+ case FEC_6_7 : tt<< "67|"; break;
+ case FEC_7_8 : tt<< "78|"; break;
+ case FEC_8_9 : tt<< "89|"; break;
+ case FEC_AUTO : tt<< "-1|";
+ }
+ switch ( chan->tp.inversion ) {
+ case INVERSION_OFF : tt<< "0|"; break;
+ case INVERSION_ON : tt<< "1|"; break;
+ case INVERSION_AUTO : tt<< "-1|";
+ }
+ switch ( chan->tp.modulation ) {
+ case QPSK : tt<< "8|"; break;
+ case QAM_16 : tt<< "16|"; break;
+ case QAM_32 : tt<< "32|"; break;
+ case QAM_64 : tt<< "64|"; break;
+ case QAM_128 : tt<< "128|"; break;
+ case QAM_256 : tt<< "256|"; break;
+ case VSB_8 : tt<< "108|"; break;
+ case VSB_16 : tt<< "116|"; break;
+ case QAM_AUTO : tt<< "-1|";
+ }
+ switch ( chan->tp.coderateL ) {
+ case FEC_NONE : tt<< "0|"; break;
+ case FEC_1_2 : tt<< "12|"; break;
+ case FEC_2_3 : tt<< "23|"; break;
+ case FEC_3_4 : tt<< "34|"; break;
+ case FEC_4_5 : tt<< "45|"; break;
+ case FEC_5_6 : tt<< "56|"; break;
+ case FEC_6_7 : tt<< "67|"; break;
+ case FEC_7_8 : tt<< "78|"; break;
+ case FEC_8_9 : tt<< "89|"; break;
+ case FEC_AUTO : tt<< "-1|";
+ }
+ switch ( chan->tp.bandwidth ) {
+ case BANDWIDTH_8_MHZ : tt<< "8|"; break;
+ case BANDWIDTH_7_MHZ : tt<< "7|"; break;
+ case BANDWIDTH_6_MHZ : tt<< "6|"; break;
+ case BANDWIDTH_AUTO : tt<< "-1|";
+ }
+ switch ( chan->tp.transmission ) {
+ case TRANSMISSION_MODE_8K : tt<< "8|"; break;
+ case TRANSMISSION_MODE_2K : tt<< "2|"; break;
+ case TRANSMISSION_MODE_AUTO : tt<< "-1|";
+ }
+ switch ( chan->tp.guard ) {
+ case GUARD_INTERVAL_1_32 : tt<< "32|"; break;
+ case GUARD_INTERVAL_1_16 : tt<< "16|"; break;
+ case GUARD_INTERVAL_1_8 : tt<< "8|"; break;
+ case GUARD_INTERVAL_1_4 : tt<< "4|"; break;
+ case GUARD_INTERVAL_AUTO : tt<< "-1|";
+ }
+ switch ( chan->tp.hierarchy ) {
+ case HIERARCHY_NONE : tt<< "0|"; break;
+ case HIERARCHY_1 : tt<< "1|"; break;
+ case HIERARCHY_2 : tt<< "2|"; break;
+ case HIERARCHY_4 : tt<< "4|"; break;
+ case HIERARCHY_AUTO : tt<< "-1|";
+ }
+ tt<< s.setNum(chan->num)+"|";
+ for ( k=0; k<chan->nsubpid; k++ ) {
+ tt<< s.setNum(chan->subpid[k].pid);
+ tt<< "("+s.setNum(chan->subpid[k].type)+")";
+ tt<< "("+s.setNum(chan->subpid[k].page)+")";
+ tt<< "("+s.setNum(chan->subpid[k].id)+")";
+ tt<< "("+chan->subpid[k].lang+")";
+ tt<< ",";
+ }
+ tt<< "|";
+ tt<< chan->category+"|";
+ tt<< s.setNum(chan->tp.nid)+"|\n";
+ }
+ ret = true;
+ f.close();
+ }
+ return ret;
+}
+
+
+
+bool DvbPanel::getTimerList()
+{
+ bool ret=false;
+ QString s;
+ int pos;
+ RecTimer *t;
+
+ QFile f( locateLocal("appdata", "timers.dvb" ) );
+ if ( f.open(IO_ReadOnly) ) {
+ QTextStream tt( &f );
+ while ( !tt.eof() ) {
+ s = tt.readLine();
+ if ( s.startsWith("#") )
+ continue;
+ t = new RecTimer();
+ pos = s.find("|");
+ t->name = s.left( pos );
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ t->channel = s.left( pos );
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ t->begin = QDateTime::fromString( s.left( pos ), Qt::ISODate );
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ t->duration = QTime::fromString( s.left( pos ) );
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ //t->filetype = s.left( pos ).toInt();
+ t->mode = 0;
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ t->mode = s.left( pos ).toInt();
+ t->running = 0;
+ timers.append( t );
+ }
+ ret = true;
+ f.close();
+ }
+ return ret;
+}
+
+
+
+bool DvbPanel::saveTimerList()
+{
+ bool ret=false;
+ int i;
+ QString s;
+ RecTimer *t;
+
+ QFile f( locateLocal("appdata", "timers.dvb" ) );
+ if ( f.open(IO_WriteOnly|IO_Truncate) ) {
+ QTextStream tt( &f );
+ tt<<"#Generated by Kaffeine 0.5\n";
+ for( i=0; i<(int)timers.count(); i++ ) {
+ t = timers.at(i);
+ if ( t->running && !t->mode )
+ continue;
+ tt<< t->name+"|";
+ tt<< t->channel+"|";
+ tt<< t->begin.toString("yyyy-MM-ddThh:mm:ss")+"|";
+ tt<< t->duration.toString()+"|";
+ tt<< s.setNum(0/*t->filetype*/)+"|";
+ tt<< s.setNum(t->mode)+"|";
+ tt<< "\n";
+ }
+ ret = true;
+ f.close();
+ }
+ return ret;
+}
+
+
+
+bool DvbPanel::close()
+{
+ int ret=0, i;
+ bool rec = false;
+
+ for ( i=0; i<(int)dvb.count(); i++ ) {
+ if ( dvb.at(i)->hasRec() ) {
+ rec = true;
+ break;
+ }
+ }
+
+ if ( rec ) {
+ ret = KMessageBox::questionYesNo( 0, i18n("Kaffeine is still recording. Do you really want to quit?") );
+ if ( ret!=KMessageBox::Yes )
+ return false;
+ }
+ else if ( timers.count() ) {
+ ret = KMessageBox::questionYesNo( 0, i18n("Kaffeine has queued timers. Do you really want to quit?") );
+ if ( ret!=KMessageBox::Yes )
+ return false;
+ }
+ emit dvbStop();
+ stopLive();
+ return true;
+}
+
+
+
+void DvbPanel::saveConfig()
+{
+ saveTimerList();
+ saveChannelList();
+ dvbConfig->splitSizes = split->sizes();
+ dvbConfig->saveDvbChanOrder( channelsCb->sortOrder(), channelsCb->sortColumn() );
+ dvbConfig->saveConfig();
+ //delete dvbConfig;
+}
+
+
+DvbPanel::~DvbPanel()
+{
+ dvb.clear();
+ delete rtp;
+ delete cleaner;
+ if ( plug ) {
+ KService::Ptr service = KService::serviceByDesktopName( plugName );
+ KLibLoader::self()->unloadLibrary( service->library().ascii() );
+ }
+ events.saveEpg();
+}
+
+#include "dvbpanel.moc"
diff --git a/kaffeine/src/input/dvb/dvbpanel.h b/kaffeine/src/input/dvb/dvbpanel.h
new file mode 100644
index 0000000..5545040
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbpanel.h
@@ -0,0 +1,242 @@
+/*
+ * dvbpanel.h
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DVBPANEL_H
+#define DVBPANEL_H
+
+#include <qframe.h>
+#include <qcombobox.h>
+#include <qtoolbutton.h>
+#include <qptrlist.h>
+#include <qtimer.h>
+#include <qsplitter.h>
+#include <qvbox.h>
+
+#include <kapp.h>
+#include <kpushbutton.h>
+#include <kled.h>
+#include <klistview.h>
+#include <kiconview.h>
+#include <klineedit.h>
+
+#include "scandialog.h"
+#include "dvbconfig.h"
+#include "krecord.h"
+#include "ts2rtp.h"
+#include "cleaner.h"
+#include "dvbevents.h"
+
+
+
+class ChannelDesc;
+class DvbStream;
+class DvbPanel;
+class KaffeineInput;
+class KaffeineDvbPlugin;
+
+
+
+class DListView : public KListView
+{
+ Q_OBJECT
+public:
+ DListView( QWidget *parent );
+
+ int visibleItems;
+
+protected:
+ virtual QDragObject* dragObject();
+};
+
+
+
+class DIconViewItem : public KIconViewItem
+{
+public:
+ DIconViewItem( DvbPanel *pan, QIconView *parent, const QString &text, const QPixmap &icon );
+protected:
+ void dropped( QDropEvent *e, const QValueList<QIconDragItem> & );
+private:
+ DvbPanel *panel;
+};
+
+
+
+class DvbPanel : public KaffeineInput
+{
+ Q_OBJECT
+
+public:
+
+ DvbPanel( QWidget *parent, QObject *objParent, const char *name=0);
+ ~DvbPanel();
+ bool getChannelList();
+ bool saveChannelList();
+ bool timeShiftMode();
+ void setConfig();
+ void enableLiveDvb( bool on );
+ void checkFirstRun();
+ void moveChannel( const QString &cat, const QString &name );
+
+ // Reimplemented from KaffeineInput
+ QWidget *wantPlayerWindow();
+ QWidget *inputMainWidget();
+ void toggleLayout( bool );
+ bool close();
+ bool nextTrack( MRL& );
+ bool previousTrack( MRL& );
+ bool currentTrack( MRL& );
+ bool trackNumber( int, MRL& );
+ bool playbackFinished( MRL& );
+ void getTargets( QStringList &uiNames, QStringList &iconNames, QStringList &targetNames );
+ void togglePanel();
+ bool execTarget( const QString& );
+ void saveConfig();
+ //***************************************
+
+ QPtrList<ChannelDesc> channels;
+ QPtrList<RecTimer> timers;
+ QPtrList<DvbStream> dvb;
+ QString fifoName, fifoName1, currentFifo;
+ QString timeShiftFileName;
+ Ts2Rtp *rtp;
+ QVBox *mainWidget;
+ QVBox *playerBox, *pbox;
+
+public slots:
+
+ void playLastChannel();
+ void playNumChannel( int num );
+ void stopLive();
+ void setShiftLed( bool on );
+ void setRecordLed( bool on );
+ void setBroadcastLed( bool on );
+ void setRecord();
+ void setBroadcast();
+ void pauseLiveTV();
+ void killTimer( RecTimer *t );
+ void showEvents();
+ void showTimers();
+ void scanner();
+ void showConfigDialog();
+ void next();
+ void previous();
+ void recallZap();
+ void dvbOSD();
+
+ void dvbOSDNext();
+ void dvbOSDPrev();
+ void dvbOSDSkip(int skip, int timeShift = 0);
+ void dvbOSDZap();
+ void dvbOSDHide();
+
+ void dvbOSDAdvance();
+ void dvbOSDRetreat();
+
+ void dvbNewTimer( QString name, QString channel, QString datetime, QString duration );
+ int getSNR( int device );
+ void diskStatus();
+
+private:
+
+ void setupActions();
+ bool getTimerList();
+ bool saveTimerList();
+ void fillChannelList( ChannelDesc *ch=0 );
+ QPtrList<Transponder> getSourcesStatus();
+ void updateModeTimer( RecTimer *t );
+ DvbStream* getWorkingDvb( int mode, ChannelDesc *chan );
+
+ void dvbOSD(ChannelDesc liveChannel, DvbStream *d, int timeShift = 0);
+ DvbStream* getLiveDVBStream();
+
+ QPixmap tvPix, raPix, tvcPix, racPix;
+ QSplitter *split;
+ QFrame *panel;
+ KIconView *iconView;
+ DListView *channelsCb;
+ QToolButton *broadcastBtn, *recordBtn;
+ QToolButton *dateBtn, *infoBtn, *channelsBtn, *configBtn, *osdBtn, *recallBtn;
+ KLed *shiftLed, *recordLed, *broadcastLed;
+ QTimer timersTimer;
+ DVBconfig *dvbConfig;
+ KRecord *timersDialog;
+ int updown;
+ unsigned long autocount;
+ int currentChannelNumber;
+ Cleaner *cleaner;
+ int osdMode;
+ QTimer osdTimer;
+ QTimer showOsdTimer;
+ QString currentCategory;
+ bool isTuning;
+ QTimer tuningTimer, stopTuningTimer;
+ QTimer diskTimer;
+ KLineEdit *searchLE;
+ QToolButton *searchBtn;
+ int recallChannel;
+
+ int browseDvbStream;
+ int maxChannelNumber, minChannelNumber;
+ int browseDvbTimeShift;
+
+ KaffeineDvbPlugin *plug;
+ QString plugName;
+
+ EventTable events;
+
+private slots:
+
+ void searchChannel( const QString &text );
+ void resetSearch();
+ void checkTimers();
+ bool editChannel( QString &name );
+ void channelSelected( QListViewItem *it );
+ void channelClicked( QListViewItem *it );
+ void channelSelected( const QString &name );
+ void channelPopup( QListViewItem *it, const QPoint &pos, int col );
+ void dvbZap( ChannelDesc *chan );
+ void finalZap( DvbStream *d, ChannelDesc *chan );
+ void newTimer( QString channel, QString name, QDateTime begin, QTime duration, bool warn=true );
+ void dumpEvents();
+ void resetOSD();
+ void catContextMenu( QIconViewItem*, const QPoint& );
+ void catSelected( QIconViewItem* );
+ void channelNumberChanged( QListViewItem* );
+ void pipeOpened();
+ void setTuning();
+
+signals:
+
+ void zap( ChannelDesc* );
+ void playDvb();
+ void timersChanged();
+ void dvbOpen( const QString &filename, const QString &chanName, int haveVideo );
+ void dvbStop();
+ void dvbPause( bool pauseLive );
+ void setTimeShiftFilename( const QString& );
+ void showOSD( const QString &text, int duration, int priority );
+ void showDvbOSD( const QStringList& );
+ void showDvbOSD( const QString&, const QStringList& );
+
+ void updateTimer(RecTimer*, int);
+};
+
+#endif /* DVBPANEL_H */
diff --git a/kaffeine/src/input/dvb/dvbsection.h b/kaffeine/src/input/dvb/dvbsection.h
new file mode 100644
index 0000000..e86e834
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbsection.h
@@ -0,0 +1,26 @@
+/*
+ * dvbsection.h
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DVBSECTION_H
+#define DVBSECTION_H
+
+#include "kaffeinedvbsection.h"
+
+#endif /* DVBSECTION_H */
diff --git a/kaffeine/src/input/dvb/dvbsi.cpp b/kaffeine/src/input/dvb/dvbsi.cpp
new file mode 100644
index 0000000..395d796
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbsi.cpp
@@ -0,0 +1,866 @@
+/*
+ * dvbsi.cpp
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/poll.h>
+
+#include <qdir.h>
+
+#include <kapplication.h>
+
+#include "dvbsi.h"
+
+#define TIMER_EVENT_SCAN_END 100
+
+
+
+NitSection::NitSection( QPtrList<Transponder> *tp, bool *end, bool *ok, int anum, int tnum ) : KaffeineDVBsection( anum, tnum )
+{
+ ended = end;
+ transponders = tp;
+ start();
+}
+
+
+
+NitSection::~NitSection()
+{
+ stop();
+}
+
+
+
+void NitSection::stop()
+{
+ if ( !wait(10000) ) {
+ terminate();
+ wait();
+ }
+}
+
+
+
+void NitSection::run()
+{
+ getSection( 0x10, 0x40, 60000 );
+ *ended = true;
+}
+
+
+
+bool NitSection::getSection( int pid, int tid, int timeout )
+{
+ unsigned char buf[4096];
+ int i, n=0;
+ int skip=0;
+ int last=1, current=0, loop=0;
+ QValueList<int> list;
+
+ if ( !setFilter( pid, tid, timeout ) )
+ return false;
+
+ do {
+ if ( poll(pf,1,timeout)>0 ){
+ if ( pf[0].revents & POLLIN ){
+ n = read( fdDemux, buf, 4096 );
+ skip = 0;
+ }
+ else
+ skip++;
+ }
+ else
+ skip++;
+
+ if ( skip || n<4 ) {
+ fprintf(stderr,"\nInvalid section length or timeout: pid=%d\n\n", pid);
+ stopFilter();
+ return false;
+ }
+
+ last = getBits(buf,56,8);
+ current = getBits(buf,48,8);
+ for ( i=0; i<(int)list.count(); i++ ) {
+ if ( current==list[i] ) {
+ i = -1;
+ break;
+ }
+ }
+ if ( i>-1 )
+ list.append( current );
+ else {
+ loop++; // missing section ?
+ continue;
+ }
+ switch ( getBits(buf,0,8) ) {
+ case 0x40 :
+ fprintf(stderr,"Reading NIT: pid=%d\n", pid);
+ tableNIT( buf );
+ break;
+ default:
+ break;
+ }
+ loop = 0;
+ } while ( (int)list.count()<=last && loop<=last );
+
+ stopFilter();
+ return true;
+}
+
+
+
+bool NitSection::tableNIT( unsigned char* buf )
+{
+ int length, loop, i, j;
+ Transponder *trans, *curtrans;
+
+ loop = getBits(buf,68,12);
+ buf +=10+loop;
+ length = getBits(buf,4,12);
+ buf +=2;
+
+ while ( length>0 ) {
+ trans = new Transponder();
+ trans->source = transponders->at(0)->source;
+ trans->tsid = getBits(buf,0,16);
+ loop = getBits(buf,36,12);
+ buf +=6;
+ length -=(6+loop);
+ while ( loop>0 ) {
+ switch ( getBits(buf,0,8) ) {
+ case 0x43 :
+ satelliteDesc( buf, trans );
+ break;
+ case 0x44 :
+ cableDesc( buf, trans );
+ break;
+ case 0x5a :
+ terrestrialDesc( buf, trans );
+ break;
+ case 0x62 :
+ fprintf(stderr," Found frequency list.\n");
+ freqListDesc( buf, trans );
+ break;
+ default :
+ break;
+ }
+ loop -=( getBits(buf,8,8)+2 );
+ buf +=( getBits(buf,8,8)+2 );
+ }
+ if ( trans->freq==0 ) {
+ delete trans;
+ continue;
+ }
+ curtrans = 0;
+ for ( i=0; i<(int)transponders->count(); i++ ) {
+ if ( trans->tsid==transponders->at(i)->tsid || trans->sameAs( transponders->at(i) ) ) {
+ curtrans = transponders->at(i);
+ break;
+ }
+ }
+ if ( !curtrans )
+ transponders->append( trans );
+ else {
+ for ( i=0; i<(int)trans->freqlist.count(); i++ ) {
+ for ( j=0; j<(int)curtrans->freqlist.count(); j++ ) {
+ if ( curtrans->freqlist[j]==trans->freqlist[i] ) {
+ j = -1;
+ break;
+ }
+ }
+ if ( j!=-1 ) {
+ fprintf(stderr," Appending freq %lu to %lu\n", trans->freqlist[i], curtrans->freq );
+ curtrans->freqlist.append( trans->freqlist[i] );
+ }
+ }
+ delete trans;
+ }
+ }
+
+ return true;
+}
+
+
+
+void NitSection::satelliteDesc( unsigned char* buf, Transponder *trans )
+{
+ QString s, t;
+
+ trans->type = FE_QPSK;
+ s = t.setNum( getBits(buf,16,32), 16 );
+ trans->freq = s.toInt();
+ trans->freq /=100;
+ if ( getBits(buf,65,2) )
+ trans->pol = 'v';
+ else
+ trans->pol = 'h';
+ s = t.setNum( getBits(buf,72,28), 16 );
+ trans->sr = s.toInt();
+ trans->sr /=10;
+ switch ( getBits(buf,100,4) ) {
+ case 1 : trans->coderateH = FEC_1_2; break;
+ case 2 : trans->coderateH = FEC_2_3; break;
+ case 3 : trans->coderateH = FEC_3_4; break;
+ case 4 : trans->coderateH = FEC_5_6; break;
+ case 5 : trans->coderateH = FEC_7_8; break;
+ case 6 : trans->coderateH = FEC_8_9; break;
+ case 7 : trans->coderateH = FEC_NONE; break;
+ }
+}
+
+
+
+void NitSection::cableDesc( unsigned char* buf, Transponder *trans )
+{
+ QString s, t;
+
+ trans->type = FE_QAM;
+ s = t.setNum( getBits(buf,16,32), 16 );
+ trans->freq = s.toInt();
+ trans->freq /=10;
+ switch ( getBits(buf,64,8) ) {
+ case 1 : trans->modulation = QAM_16; break;
+ case 2 : trans->modulation = QAM_32; break;
+ case 3 : trans->modulation = QAM_64; break;
+ case 4 : trans->modulation = QAM_128; break;
+ case 5 : trans->modulation = QAM_256; break;
+ }
+ s = t.setNum( getBits(buf,72,28), 16 );
+ trans->sr = s.toInt();
+ trans->sr /=10;
+ switch ( getBits(buf,100,4) ) {
+ case 1 : trans->coderateH = FEC_1_2; break;
+ case 2 : trans->coderateH = FEC_2_3; break;
+ case 3 : trans->coderateH = FEC_3_4; break;
+ case 4 : trans->coderateH = FEC_5_6; break;
+ case 5 : trans->coderateH = FEC_7_8; break;
+ case 6 : trans->coderateH = FEC_8_9; break;
+ case 7 : trans->coderateH = FEC_NONE; break;
+ }
+}
+
+
+
+void NitSection::terrestrialDesc( unsigned char* buf, Transponder *trans )
+{
+ trans->type = FE_OFDM;
+ trans->freq = getBits(buf,16,32)/100;
+ trans->bandwidth = (fe_bandwidth_t)(BANDWIDTH_8_MHZ + getBits(buf,48,3));
+ switch ( getBits(buf,56,2) ) {
+ case 0 : trans->modulation = QPSK; break;
+ case 1 : trans->modulation = QAM_16; break;
+ case 2 : trans->modulation = QAM_64; break;
+ }
+ trans->hierarchy = (fe_hierarchy_t)(HIERARCHY_NONE + getBits(buf,58,3));
+ switch ( getBits(buf,61,3) ) {
+ case 0 : trans->coderateH = FEC_1_2; break;
+ case 1 : trans->coderateH = FEC_2_3; break;
+ case 2 : trans->coderateH = FEC_3_4; break;
+ case 3 : trans->coderateH = FEC_5_6; break;
+ case 4 : trans->coderateH = FEC_7_8; break;
+ }
+ switch ( getBits(buf,64,3) ) {
+ case 0 : trans->coderateL = FEC_1_2; break;
+ case 1 : trans->coderateL = FEC_2_3; break;
+ case 2 : trans->coderateL = FEC_3_4; break;
+ case 3 : trans->coderateL = FEC_5_6; break;
+ case 4 : trans->coderateL = FEC_7_8; break;
+ }
+ trans->guard = (fe_guard_interval_t)(GUARD_INTERVAL_1_32 + getBits(buf,67,2));
+ switch ( getBits(buf,69,2) ) {
+ case 0 : trans->transmission = TRANSMISSION_MODE_2K; break;
+ case 1 : trans->transmission = TRANSMISSION_MODE_8K; break;
+ }
+}
+
+
+
+void NitSection::freqListDesc( unsigned char* buf, Transponder *trans )
+{
+ unsigned char len, type;
+ unsigned char *b=buf;
+ QString s, t;
+ unsigned long freq;
+
+ len = getBits(b,8,8);
+ type = getBits(b,22,2);
+ len-= 1;
+ b+= 3;
+ while ( len>0 ) {
+ switch ( type ) {
+ case 1: // satellite
+ s = t.setNum( getBits(b,0,32), 16 );
+ freq = s.toInt();
+ freq /=100;
+ fprintf( stderr, " %lu\n", freq );
+ trans->freqlist.append( freq );
+ break;
+ case 2: // cable
+ s = t.setNum( getBits(b,0,32), 16 );
+ freq = s.toInt();
+ freq /=10;
+ fprintf( stderr, " %lu\n", freq );
+ trans->freqlist.append( freq );
+ break;
+ case 3: // terrestrial
+ freq = getBits(b,0,32)/100;
+ fprintf( stderr, " %lu\n", freq );
+ trans->freqlist.append( freq );
+ break;
+ }
+ len-= 4;
+ b+= 4;
+ }
+}
+
+
+
+DVBsi::DVBsi( bool *ok, int anum, int tnum, DvbStream *d, const QString &charset ) : KaffeineDVBsection( anum, tnum, charset )
+{
+ channels.setAutoDelete( true );
+ transponders.setAutoDelete( true );
+ isRunning = false;
+ dvb = d;
+ adapter = anum;
+ tuner = tnum;
+ ns = 0;
+}
+
+
+
+DVBsi::~DVBsi()
+{
+ isRunning = false;
+ wait();
+ channels.clear();
+ transponders.clear();
+}
+
+
+
+void DVBsi::serviceDesc( unsigned char* buf, ChannelDesc *desc )
+{
+ unsigned int i, j;
+
+ desc->type = getBits(buf,16,8);
+ i = getBits(buf,24,8);
+ desc->provider = getText( buf+4, i ).stripWhiteSpace();
+ j = getBits(buf+i,32,8);
+ desc->name = getText( buf+5+i, j ).stripWhiteSpace();
+ if ( desc->name.isEmpty() )
+ desc->name = "Unknown";
+ fprintf(stderr,"%s: sid=%d\n", desc->name.latin1(), desc->sid );
+}
+
+
+
+bool DVBsi::tableSDT( unsigned char* buf )
+{
+ int length, loop;
+ ChannelDesc *desc;
+ QString s;
+ unsigned short tsid;
+ unsigned short nid;
+
+ tsid = getBits(buf+3,0,16);
+ nid = getBits(buf+8,0,16);
+ length = getBits(buf,12,12);
+ length -=8;
+ buf +=11;
+
+ while ( length>4 ) {
+ desc = new ChannelDesc();
+ channels.append( desc );
+ desc->tp.tsid = tsid;
+ desc->tp.nid = nid;
+ desc->sid = getBits(buf,0,16);
+ //desc->fta = getBits(buf,27,1 );
+ loop = getBits(buf,28,12);
+ buf +=5;
+ length -=(5+loop);
+ while ( loop>0 ) {
+ switch ( getBits(buf,0,8) ) {
+ case 0x48 :
+ serviceDesc( buf, desc );
+ break;
+ default :
+ break;
+ }
+ loop -=( getBits(buf,8,8)+2 );
+ buf +=( getBits(buf,8,8)+2 );
+ }
+ }
+ return true;
+}
+
+
+
+bool DVBsi::tablePMT( unsigned char* buf )
+{
+ int length, loop;
+ int type;
+ int sid;
+ int i;
+ int pid=0;
+ ChannelDesc *desc=0;
+ QString lang;
+ int ns;
+ unsigned char st;
+ bool audio, ac3;
+
+
+ sid = getBits(buf+3,0,16);
+ for ( i=indexChannels; i<(int)channels.count(); i++ ) {
+ if ( channels.at( i )->sid==sid ) {
+ desc = channels.at( i );
+ break;
+ }
+ }
+
+ if ( !desc )
+ return false;
+
+ length = getBits(buf,12,12);
+ loop = getBits(buf+10,4,12);
+ length -=(9+loop);
+ buf +=12;
+
+ while ( loop>0 ) {
+ switch ( getBits(buf,0,8) ) {
+ case 0x09 :
+ desc->fta = 1;
+ break;
+ default :
+ break;
+ }
+ loop -=( getBits(buf,8,8)+2 );
+ buf +=( getBits(buf,8,8)+2 );
+ }
+
+ while ( length>4 ) {
+ audio=ac3=false;
+ type = getBits(buf,0,8);
+ pid = getBits(buf,11,13);
+ if ( type==1/*mpeg1*/ || type==2/*mpeg2*/ || type==16/*mpeg4*/ || type==27/*h264*/ ) {
+ desc->type=1;
+ desc->vpid = pid;
+ desc->vType = type;
+ }
+ if ( type==3 || type==4 ) {
+ audio = true;
+ }
+ loop = getBits(buf,28,12);
+ buf +=5;
+ length -=(5+loop);
+ while ( loop>0 ) {
+ switch ( getBits(buf,0,8) ) {
+ case 0x09 :
+ desc->fta = 1;
+ break;
+ case 0x0A :
+ lang = langDesc( buf );
+ break;
+ case 0x56 :
+ if ( type==6 )
+ desc->ttpid = pid;
+ break;
+ case 0x59 : // DVB subtitle descriptor
+ ns = (int)desc->nsubpid;
+ if ( type==6 && ns<desc->maxsubpid ) {
+ st = getBits(buf+5,0,8);
+ if ( st>=0x10 && st<=0x23 ) {
+ desc->subpid[ns].type = st;
+ desc->subpid[ns].pid = pid;
+ desc->subpid[ns].page = getBits(buf+6,0,16);
+ desc->subpid[ns].id = getBits(buf+8,0,16);
+ desc->subpid[ns].lang = langDesc(buf);
+ fprintf( stderr, "\nDVB SUB on %s page_id: %d anc_id: %d lang: %s\n\n",
+ desc->name.latin1(), desc->subpid[ns].page, desc->subpid[ns].id,
+ desc->subpid[ns].lang.latin1() );
+ desc->nsubpid++;
+ }
+ }
+ break;
+ case 0x6a :
+ audio = true;
+ ac3 = true;
+ break;
+ default :
+ break;
+ }
+ loop -=( getBits(buf,8,8)+2 );
+ buf +=( getBits(buf,8,8)+2 );
+ }
+ if ( audio && desc->napid<desc->maxapid ) {
+ if ( !desc->vpid )
+ desc->type=2;
+ desc->apid[(int)desc->napid].pid = pid;
+ if ( ac3 )
+ desc->apid[(int)desc->napid].ac3 = 1;
+ if ( !lang.isEmpty() )
+ desc->apid[(int)desc->napid].lang = lang;
+ desc->napid++;
+ }
+ }
+
+ return true;
+}
+
+
+
+bool DVBsi::tablePAT( unsigned char *buf )
+{
+ int length, i, sid, tsid, pmt;
+ bool got;
+ ChannelDesc *desc;
+
+ tsid = getBits(buf+3,0,16);
+ length = getBits(buf,12,12);
+ length -=5;
+ buf +=8;
+
+ while ( length>4 ) {
+ sid = getBits(buf,0,16);
+ pmt = getBits(buf,19,13);
+ buf +=4;
+ length -=4;
+ got = false;
+ for ( i=indexChannels; i<(int)channels.count(); i++ ) {
+ if ( channels.at( i )->sid==sid ) {
+ channels.at( i )->pmtpid = pmt;
+ got = true;
+ break;
+ }
+ }
+ if ( !got && sid!=0 ) {
+ desc = new ChannelDesc();
+ channels.append( desc );
+ desc->tp.tsid = tsid;
+ desc->sid = sid;
+ desc->pmtpid = pmt;
+ desc->name = QString("TSID:%1-SID:%2").arg(tsid).arg(sid);
+ }
+ }
+
+ return true;
+}
+
+
+
+bool DVBsi::getSection( int pid, int tid, int timeout, int sid )
+{
+ unsigned char buf[4096];
+ int i, n=0;
+ int skip=0;
+ int last=1, current=0, loop=0;
+ QValueList<int> list, sidList;
+ int cursid;
+
+ if ( !setFilter( pid, tid, timeout ) )
+ return false;
+
+ do {
+ if ( poll(pf,1,timeout)>0 ){
+ if ( pf[0].revents & POLLIN ){
+ n = read( fdDemux, buf, 4096 );
+ skip = 0;
+ }
+ else
+ skip++;
+ }
+ else
+ skip++;
+
+ if ( skip || n<4 ) {
+ fprintf(stderr,"\nInvalid section length or timeout: pid=%d\n\n", pid);
+ stopFilter();
+ return false;
+ }
+
+ cursid = getBits(buf+3,0,16);
+ if ( sid && cursid!=sid && !sidList.contains(cursid) ) {
+ sidList.append( cursid );
+ continue;
+ }
+
+ last = getBits(buf,56,8);
+ current = getBits(buf,48,8);
+ for ( i=0; i<(int)list.count(); i++ ) {
+ if ( current==list[i] ) {
+ i = -1;
+ break;
+ }
+ }
+ if ( i>-1 )
+ list.append( current );
+ else {
+ loop++; // missing section ?
+ continue;
+ }
+ switch ( getBits(buf,0,8) ) {
+ case 0x42 :
+ fprintf(stderr,"Reading SDT: pid=%d\n", pid);
+ tableSDT( buf );
+ break;
+ case 0x00 :
+ fprintf(stderr,"Reading PAT: pid=%d\n", pid);
+ tablePAT( buf );
+ break;
+ case 0x02 :
+ fprintf(stderr,"Reading PMT: pid=%d\n", pid);
+ tablePMT( buf );
+ break;
+ default:
+ break;
+ }
+ loop = 0;
+ } while ( (int)list.count()<=last && loop<=last );
+
+ stopFilter();
+ return true;
+}
+
+
+
+void DVBsi::stop()
+{
+ if ( !isRunning )
+ return;
+
+ isRunning = false;
+ if ( !wait(10000) ) {
+ if ( ns ) {
+ ns->stop();
+ delete ns;
+ ns = 0;
+ }
+ terminate();
+ wait();
+ if ( scanMode<2 )
+ dvb->stopScan();
+ }
+}
+
+
+
+void DVBsi::out( bool stopscan )
+{
+ if ( ns ) {
+ ns->stop();
+ delete ns;
+ ns = 0;
+ }
+ if ( stopscan )
+ dvb->stopScan();
+ KApplication::kApplication()->postEvent( this, new QTimerEvent( TIMER_EVENT_SCAN_END ) );
+}
+
+
+
+void DVBsi::go( QPtrList<Transponder> trans, int mode )
+{
+ int i;
+
+ if ( isRunning )
+ return;
+
+ scanMode = mode;
+ transponders.clear();
+ for ( i=0; i<(int)trans.count(); i++ )
+ transponders.append( new Transponder( *trans.at(i) ) );
+ channels.clear();
+ isRunning = true;
+ start();
+}
+
+
+
+void DVBsi::timerEvent( QTimerEvent *e )
+{
+ switch ( e->timerId() ) {
+ case TIMER_EVENT_SCAN_END :
+ emit end( true );
+ break;
+ }
+}
+
+
+
+void DVBsi::run()
+{
+ int i, j=0, k=0;
+ ChannelDesc chan;
+ Transponder trans;
+ unsigned short tsid, nid;
+ bool nitEnded=true, ok;
+
+ progressTransponder = 0;
+
+ if ( scanMode<2 ) {
+ dvb->stopScan();
+ for ( i=0; i<(int)transponders.count(); i++ ) {
+ if ( !isRunning ) {
+ out();
+ return;
+ }
+ chan.tp = *transponders.at(i);
+ usleep( 100000 );
+ if ( !dvb->tuneDvb( &chan, false ) ) {
+ for ( k=0; k<(int)chan.tp.freqlist.count(); k++ ) {
+ chan.tp.freq = chan.tp.freqlist[k];
+ fprintf(stderr,"Trying alternate frequency\n");
+ if ( dvb->tuneDvb( &chan, false ) ) {
+ k = -1;
+ transponders.at(i)->freq = chan.tp.freq;
+ break;
+ }
+ else
+ usleep( 400000 );
+ }
+ if ( k>-1 ) {
+ fprintf(stderr,"dvbsi: Cant tune DVB\n");
+ progressTransponder++;
+ usleep( 400000 );
+ continue;
+ }
+ }
+
+ indexChannels = j;
+ fprintf(stderr,"Transponders: %d/%d\n", i+1, transponders.count() );
+ if ( scanMode ) {
+ nitEnded = false;
+ ns = new NitSection( &transponders, &nitEnded, &ok, adapter, tuner ); //NIT
+ }
+ if ( !getSection( 0x11, 0x42 ) ) //SDT
+ continue;
+ if ( !isRunning ) {
+ out();
+ return;
+ }
+ getSection( 0x00, 0x00 ); //PAT
+ for ( ; j<(int)channels.count(); j++ ) {
+ if ( channels.at( j )->pmtpid==0 ) {
+ channels.at(j)->completed = 1;
+ continue;
+ }
+ if ( !isRunning ) {
+ out();
+ return;
+ }
+ getSection( channels.at( j )->pmtpid, 0x02, 5000, channels.at( j )->sid ); //PMTs
+ tsid = channels.at(j)->tp.tsid;
+ nid = channels.at(j)->tp.nid;
+ channels.at(j)->tp = *transponders.at(i);
+ if ( channels.at(j)->tp.tsid==0 )
+ channels.at(j)->tp.tsid = tsid;
+ channels.at(j)->tp.nid = nid;
+ channels.at(j)->tp.snr = dvb->getSNR();
+ channels.at(j)->completed = 1;
+ }
+ while( !nitEnded ) {
+ if ( !ok ) {
+ ns->stop();
+ break;
+ }
+ else
+ msleep( 50 );
+ }
+ if ( scanMode ) {
+ delete ns;
+ ns = 0;
+ }
+ dvb->stopScan();
+ progressTransponder++;
+ }
+ fprintf(stderr,"Transponders: %d\n", transponders.count());
+ }
+ else if ( scanMode==2 ) {
+ indexChannels = 0;
+ trans = dvb->getCurrentTransponder();
+ getSection( 0x11, 0x42 ); //SDT
+ getSection( 0x00, 0x00 ); //PAT
+ for ( j=0; j<(int)channels.count(); j++ ) {
+ if ( channels.at( j )->pmtpid==0 ) {
+ channels.at(j)->completed = 1;
+ continue;
+ }
+ if ( !isRunning ) {
+ out(false);
+ return;
+ }
+ getSection( channels.at( j )->pmtpid, 0x02, 5000, channels.at( j )->sid ); //PMTs
+ tsid = channels.at(j)->tp.tsid;
+ nid = channels.at(j)->tp.nid;
+ channels.at(j)->tp = trans;
+ channels.at(j)->tp.tsid = tsid;
+ channels.at(j)->tp.nid = nid;
+ channels.at(j)->tp.snr = dvb->getSNR();
+ channels.at(j)->completed = 1;
+ }
+ }
+ fprintf(stderr,"dvbsi: The end :)\n");
+ isRunning = false;
+ listChannels();
+ KApplication::kApplication()->postEvent( this, new QTimerEvent( TIMER_EVENT_SCAN_END ) );
+}
+
+
+
+bool DVBsi::listChannels()
+{
+ QString s,t;
+ int i, valid=0;
+ bool ac3;
+
+ for ( i=0; i<(int)channels.count(); i++ ) {
+ ac3 = false;
+ if ( channels.at( i )->vType<16 )
+ continue;
+ /*if ( channels.at( i )->nsubpid==0 )
+ continue;
+ if ( channels.at( i )->pmtpid==0 )
+ continue;
+ if ( channels.at(i)->name.isEmpty() )
+ continue;
+ if ( channels.at( i )->type<1 )
+ continue;
+ if ( channels.at( i )->type>2 )
+ continue;
+ if ( channels.at( i )->type==1 && channels.at(i)->vpid==0 )
+ continue;
+ if ( channels.at( i )->type==1 && channels.at(i)->napid==0 )
+ continue;
+ if ( channels.at( i )->type==2 && channels.at(i)->napid==0 )
+ continue;
+ if ( channels.at( i )->type==2 && channels.at(i)->vpid!=0 )
+ continue;*/
+
+ s = "|"+channels.at(i)->name;
+ s = s+"|"+t.setNum(channels.at(i)->tp.freq);
+ s = s+"|"+channels.at(i)->tp.pol;
+ s = s+"|"+t.setNum(channels.at(i)->tp.sr);
+ fprintf(stderr, "%s\n", s.latin1() );
+ valid++;
+ }
+ fprintf(stderr, "Channels found: %d\n", valid );
+ return true;
+}
+
+#include "dvbsi.moc"
diff --git a/kaffeine/src/input/dvb/dvbsi.h b/kaffeine/src/input/dvb/dvbsi.h
new file mode 100644
index 0000000..df1f6e7
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbsi.h
@@ -0,0 +1,98 @@
+/*
+ * dvbsi.h
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DVBSI_H
+#define DVBSI_H
+
+#include "dvbsection.h"
+#include "dvbstream.h"
+
+
+
+class NitSection : public KaffeineDVBsection
+{
+
+public:
+
+ NitSection( QPtrList<Transponder> *tp, bool *end, bool *ok, int anum, int tnum );
+ ~NitSection();
+ bool getSection( int pid, int tid, int timeout=5000 );
+ bool tableNIT( unsigned char* buf );
+ void satelliteDesc( unsigned char* buf, Transponder *trans );
+ void cableDesc( unsigned char* buf, Transponder *trans );
+ void terrestrialDesc( unsigned char* buf, Transponder *trans );
+ void freqListDesc( unsigned char* buf, Transponder *trans );
+ void stop();
+
+ bool *ended;
+ QPtrList<Transponder> *transponders;
+
+protected:
+
+ virtual void run();
+};
+
+
+
+class DVBsi : public QObject, public KaffeineDVBsection
+{
+ Q_OBJECT
+
+public:
+
+ DVBsi( bool *ok, int anum, int tnum, DvbStream *d, const QString &charset );
+ ~DVBsi();
+ bool getSection( int pid, int tid, int timeout=5000, int sid=0 );
+ bool listChannels();
+ bool tableSDT( unsigned char* buf );
+ bool tablePAT( unsigned char *buf );
+ bool tablePMT( unsigned char* buf );
+ void serviceDesc( unsigned char* buf, ChannelDesc *desc );
+
+ QPtrList<ChannelDesc> channels;
+ QPtrList<Transponder> transponders;
+ DvbStream *dvb;
+ int indexChannels;
+ int progressTransponder;
+ int adapter, tuner;
+
+public slots:
+
+ void go( QPtrList<Transponder> trans, int mode=1 );
+ void stop();
+
+protected:
+
+ virtual void run();
+ virtual void timerEvent( QTimerEvent *e );
+
+private:
+
+ void out( bool stopscan=true );
+
+ int scanMode;
+ NitSection *ns;
+
+signals:
+
+ void end( bool );
+};
+
+#endif /* DVBSI_H */
diff --git a/kaffeine/src/input/dvb/dvbstream.cpp b/kaffeine/src/input/dvb/dvbstream.cpp
new file mode 100644
index 0000000..302c0d0
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbstream.cpp
@@ -0,0 +1,1390 @@
+/*
+ * dvbstream.cpp
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <sys/stat.h>
+#include <resolv.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <signal.h>
+#include <values.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <errno.h>
+#include <math.h>
+
+#include <linux/dvb/dmx.h>
+
+#include <qdir.h>
+#include <qprogressdialog.h>
+
+#include <klocale.h>
+#include <kapplication.h>
+
+#include "dvbstream.h"
+#include "dvbevents.h"
+#include "gdvb.h"
+#include "dvbcam.h"
+#include "kaffeinedvbplugin.h"
+
+#define MAXTUNETRY 1
+
+
+
+DvbStream::DvbStream( Device *d, const QString &charset, EventTable *et )
+{
+ dvbDevice = d;
+ isRunning = false;
+ timeShifting = false;
+ waitPause = 0;
+ delOut = 0;
+ fdFrontend = fdDvr = 0;
+ ndmx = 0;
+ currentTransponder = Transponder();
+ frontendName = QString("/dev/dvb/adapter%1/frontend%2").arg( dvbDevice->adapter ).arg( dvbDevice->tuner );
+ dvrName = QString("/dev/dvb/adapter%1/dvr%2").arg( dvbDevice->adapter ).arg( dvbDevice->tuner );
+ demuxName = QString("/dev/dvb/adapter%1/demux%2").arg( dvbDevice->adapter ).arg( dvbDevice->tuner );
+
+ out.setAutoDelete( true );
+
+ QString deviceType="NONE";
+ switch ( dvbDevice->type ) {
+ case FE_QPSK: deviceType = "DVBS"; break;
+ case FE_OFDM: deviceType = "DVBT"; break;
+ case FE_QAM: deviceType = "DVBC"; break;
+ case FE_ATSC: deviceType = "DVBA"; break;
+ }
+ dvbEvents = new DVBevents( deviceType, dvbDevice->adapter, dvbDevice->tuner, charset, et );
+
+ camProbed = false;
+ cam = NULL;
+ plug = NULL;
+
+ connect( &statusTimer, SIGNAL(timeout()), this, SLOT(checkStatus()) );
+}
+
+
+
+void DvbStream::setPlug( KaffeineDvbPlugin *p )
+{
+ plug = p;
+}
+
+
+
+void DvbStream::probeCam()
+{
+ int ci_type=0;
+ if ( camProbed )
+ return;
+ if ( (ci_type=DvbCam::probe( dvbDevice->adapter, 0 ))>0 )
+ cam = new DvbCam( dvbDevice->adapter, 0, dvbDevice->tuner, ci_type );
+ camProbed = true;
+}
+
+
+
+QStringList DvbStream::getSources( bool all )
+{
+ if ( !all ) {
+ if ( dvbDevice->type==FE_OFDM )
+ return QStringList( "Terrestrial" );
+ if ( dvbDevice->type==FE_QAM )
+ return QStringList( "Cable" );
+ if ( dvbDevice->type==FE_ATSC )
+ return QStringList( "Atsc" );
+ }
+ QStringList source;
+ int i;
+ if ( dvbDevice->type==FE_QPSK ) {
+ for ( i=0; i<dvbDevice->numLnb; i++ )
+ source+= dvbDevice->lnb[i].source;
+ }
+ else {
+ QString s = dvbDevice->source;
+ source+= s.remove(0,2);
+ }
+ return source;
+}
+
+
+
+bool DvbStream::canSource( ChannelDesc *chan )
+{
+ if ( chan->tp.type!=dvbDevice->type ) {
+ return false;
+ }
+ if ( dvbDevice->type!=FE_QPSK ) {
+ if ( chan->tp.type==dvbDevice->type )
+ return true;
+ else
+ return false;
+ }
+ int i;
+ for ( i=0; i<dvbDevice->numLnb; i++ ) {
+ if ( dvbDevice->lnb[i].source.contains(chan->tp.source) )
+ return true;
+ }
+ return false;
+}
+
+
+
+int DvbStream::getSatPos( const QString &src )
+{
+ int i;
+
+ if ( dvbDevice->type!=FE_QPSK )
+ return -1;
+
+ for ( i=0; i<dvbDevice->numLnb; i++ )
+ if ( dvbDevice->lnb[i].source.contains(src) )
+ return i;
+ return -1;
+}
+
+
+
+bool DvbStream::openFe()
+{
+ if ( fdFrontend ) {
+ fprintf(stderr,"openFe: fdFrontend != 0\n");
+ return false;
+ }
+ fdFrontend = open( frontendName.ascii(), O_RDWR );
+ if ( fdFrontend<0 ) {
+ perror("openFe:");
+ fdFrontend = 0;
+ return false;
+ }
+ return true;
+}
+
+
+
+bool DvbStream::closeFe()
+{
+ if ( !fdFrontend )
+ return true;
+ if ( close( fdFrontend )<0 ) {
+ perror("closeFe: ");
+ return false;
+ }
+ fprintf(stderr,"Frontend closed\n");
+ fdFrontend = 0;
+ currentTransponder = Transponder();
+ return true;
+}
+
+
+
+void DvbStream::connectStatus( bool con )
+{
+ if ( con )
+ statusTimer.start( 1000 );
+ else
+ statusTimer.stop();
+}
+
+
+
+ChannelDesc DvbStream::getLiveChannel()
+{
+ int i;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( out.at(i)->hasLive() )
+ return out.at(i)->channel;
+ }
+ return ChannelDesc();
+}
+
+
+
+bool DvbStream::hasLive()
+{
+ int i;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( out.at(i)->hasLive() )
+ return true;
+ }
+ return false;
+}
+
+
+
+bool DvbStream::hasRec()
+{
+ int i;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( out.at(i)->hasRec() )
+ return true;
+ }
+ return false;
+}
+
+
+
+bool DvbStream::hasBroadcast()
+{
+ int i;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( out.at(i)->hasBroadcast() )
+ return true;
+ }
+ return false;
+}
+
+
+
+bool DvbStream::liveIsRecording()
+{
+ int i;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( out.at(i)->hasLive() ) {
+ if ( out.at(i)->hasRec() )
+ return true;
+ else
+ return false;
+ }
+ }
+ return false;
+}
+
+
+
+Transponder DvbStream::getCurrentTransponder()
+{
+ return currentTransponder;
+}
+
+
+
+unsigned long DvbStream::getCurrentFreq()
+{
+ return currentTransponder.freq;
+}
+
+
+
+bool DvbStream::isTuned()
+{
+ if ( fdFrontend )
+ return true;
+ else
+ return false;
+}
+
+
+
+bool DvbStream::tuneDvb( ChannelDesc *chan, bool dvr )
+{
+ unsigned long lof=0;
+ int res, hiband=0;
+ struct dvb_frontend_parameters feparams;
+ struct dvb_frontend_info fe_info;
+ fe_status_t status;
+ unsigned long freq=chan->tp.freq;
+ unsigned long srate=chan->tp.sr;
+ int lnbPos = getSatPos( chan->tp.source );
+ int rotorMove = 0;
+ int loop=0, i;
+
+ closeFe();
+ if ( !openFe() )
+ return false;
+
+ if ( (res = ioctl( fdFrontend, FE_GET_INFO, &fe_info ) < 0) ) {
+ perror("FE_GET_INFO: ");
+ return false;
+ }
+
+ probeCam();
+
+ fprintf(stderr, "Using DVB device %d:%d \"%s\"\n", dvbDevice->adapter, dvbDevice->tuner, fe_info.name);
+
+ freq*=1000;
+ srate*=1000;
+
+ switch( fe_info.type ) {
+ case FE_OFDM : {
+ if (freq < 1000000)
+ freq*=1000UL;
+ feparams.frequency=freq;
+ feparams.u.ofdm.bandwidth=chan->tp.bandwidth;
+ feparams.u.ofdm.code_rate_HP=chan->tp.coderateH;
+ feparams.u.ofdm.code_rate_LP=chan->tp.coderateL;
+ feparams.u.ofdm.constellation=chan->tp.modulation;
+ feparams.u.ofdm.transmission_mode=chan->tp.transmission;
+ feparams.u.ofdm.guard_interval=chan->tp.guard;
+ feparams.u.ofdm.hierarchy_information=chan->tp.hierarchy;
+ fprintf(stderr,"tuning DVB-T to %lu Hz\n", freq);
+ fprintf(stderr,"inv:%d bw:%d fecH:%d fecL:%d mod:%d tm:%d gi:%d hier:%d\n", chan->tp.inversion,
+ chan->tp.bandwidth, chan->tp.coderateH, chan->tp.coderateL, chan->tp.modulation,
+ chan->tp.transmission, chan->tp.guard, chan->tp.hierarchy );
+ break;
+ }
+ case FE_QAM : {
+ fprintf(stderr,"tuning DVB-C to %lu\n", freq);
+ feparams.frequency=freq;
+ feparams.u.qam.symbol_rate = srate;
+ feparams.u.qam.fec_inner = chan->tp.coderateH;
+ feparams.u.qam.modulation = chan->tp.modulation;
+ fprintf(stderr,"inv:%d sr:%lu fecH:%d mod:%d\n", chan->tp.inversion,
+ srate, chan->tp.coderateH, chan->tp.modulation );
+ break;
+ }
+ case FE_QPSK : {
+ fprintf(stderr,"tuning DVB-S to %lu %c %lu\n", freq, chan->tp.pol, srate);
+ if (freq > 2200000) {
+ if ( dvbDevice->lnb[lnbPos].switchFreq ) { // Dual LO
+ if ( freq<(dvbDevice->lnb[lnbPos].switchFreq*1000) ) {
+ lof = dvbDevice->lnb[lnbPos].loFreq*1000;
+ }
+ else {
+ lof = dvbDevice->lnb[lnbPos].hiFreq*1000;
+ hiband = 1;
+ }
+ }
+ else {
+ if ( dvbDevice->lnb[lnbPos].hiFreq ) { // C Band Multipoint
+ if ( (chan->tp.pol=='h') || (chan->tp.pol=='H') )
+ lof = (dvbDevice->lnb[lnbPos].hiFreq*1000);
+ else
+ lof = (dvbDevice->lnb[lnbPos].loFreq*1000);
+ }
+ else // Single LO
+ lof = (dvbDevice->lnb[lnbPos].loFreq*1000);
+ }
+ if ( freq<lof )
+ feparams.frequency = ( lof-freq );
+ else
+ feparams.frequency = ( freq-lof );
+ }
+ else
+ feparams.frequency=freq;
+
+ feparams.u.qpsk.symbol_rate=srate;
+ feparams.u.qpsk.fec_inner=chan->tp.coderateH;
+ fprintf(stderr,"inv:%d fecH:%d\n", chan->tp.inversion, chan->tp.coderateH );
+ if ( setDiseqc( lnbPos, chan, hiband, rotorMove, dvr )!=0 ) {
+ closeFe();
+ return false;
+ }
+ break;
+ }
+ case FE_ATSC : {
+ fprintf(stderr,"tuning ATSC to %lu\n", freq);
+ feparams.frequency=freq;
+ feparams.u.vsb.modulation = chan->tp.modulation;
+ fprintf(stderr,"inv:%d mod:%d\n", chan->tp.inversion, chan->tp.modulation );
+ break;
+ }
+ }
+ if ( chan->tp.inversion==INVERSION_AUTO ) {
+ if ( fe_info.caps & FE_CAN_INVERSION_AUTO )
+ feparams.inversion=chan->tp.inversion;
+ else {
+ fprintf(stderr,"Can NOT inversion_auto\n");
+ feparams.inversion=INVERSION_OFF;
+ }
+ }
+ else
+ feparams.inversion=chan->tp.inversion;
+
+ if ( rotorMove )
+ loop = 2;
+
+ while ( loop>-1 ) {
+ if (ioctl(fdFrontend,FE_SET_FRONTEND,&feparams) < 0) {
+ perror("ERROR tuning \n");
+ closeFe();
+ return false;
+ }
+ for ( i=0; i<(dvbDevice->tuningTimeout/100); i++ ) {
+ usleep( 100000 );
+ fprintf( stderr, "." );
+ if ( ioctl( fdFrontend, FE_READ_STATUS, &status )==-1 ) {
+ perror( "FE_READ_STATUS" );
+ break;
+ }
+ if ( status & FE_HAS_LOCK ) {
+ fprintf(stderr," LOCKED.");
+ loop = 0;
+ break;
+ }
+ }
+ fprintf(stderr,"\n");
+ --loop;
+ }
+
+ if ( !( status & FE_HAS_LOCK ) ) {
+ fprintf( stderr, "\nNot able to lock to the signal on the given frequency\n" );
+ closeFe();
+ return false;
+ }
+
+ if ( rotorMove )
+ dvbDevice->lnb[lnbPos].currentSource = chan->tp.source;
+
+ if ( !dvr )
+ return true;
+
+ if ( ( fdDvr = open( dvrName.ascii(), O_RDONLY|O_NONBLOCK)) < 0 ) {
+ perror("DVR DEVICE: ");
+ closeFe();
+ fdDvr = 0;
+ return false;
+ }
+ pfd.fd=fdDvr;
+ pfd.events=POLLIN|POLLPRI;
+
+ currentTransponder = chan->tp;
+ return true;
+}
+
+
+
+int DvbStream::setDiseqc( int switchPos, ChannelDesc *chan, int hiband, int &rotor, bool dvr )
+{
+ struct dvb_diseqc_master_cmd switchCmd[] = {
+ { { 0xe0, 0x10, 0x38, 0xf0, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xf2, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xf1, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xf3, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xf4, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xf6, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xf5, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xf7, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xf8, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xfa, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xf9, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xfb, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xfc, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xfe, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xfd, 0x00, 0x00 }, 4 },
+ { { 0xe0, 0x10, 0x38, 0xff, 0x00, 0x00 }, 4 },
+ };
+
+ int i;
+ int voltage18 = ( (chan->tp.pol=='H')||(chan->tp.pol=='h') );
+ int ci = 4 * switchPos + 2 * hiband + (voltage18 ? 1 : 0);
+
+ fprintf( stderr, "DiSEqC: switch pos %i, %sV, %sband (index %d)\n", switchPos, voltage18 ? "18" : "13", hiband ? "hi" : "lo", ci );
+ if ( ci < 0 || ci >= (int)(sizeof(switchCmd)/sizeof(struct dvb_diseqc_master_cmd)) )
+ return -EINVAL;
+
+ if ( ioctl(fdFrontend, FE_SET_TONE, SEC_TONE_OFF) )
+ perror("FE_SET_TONE failed");
+ usleep(15*1000);
+ if ( ioctl(fdFrontend, FE_SET_VOLTAGE, ci%2 ? SEC_VOLTAGE_18 : SEC_VOLTAGE_13) )
+ perror("FE_SET_VOLTAGE failed");
+
+ fprintf( stderr, "DiSEqC: %02x %02x %02x %02x %02x %02x\n", switchCmd[ci].msg[0], switchCmd[ci].msg[1], switchCmd[ci].msg[2], switchCmd[ci].msg[3], switchCmd[ci].msg[4], switchCmd[ci].msg[5] );
+ for ( i=0; i<2; ++i ) {
+ usleep(15*1000);
+ if ( ioctl(fdFrontend, FE_DISEQC_SEND_MASTER_CMD, &switchCmd[ci]) )
+ perror("FE_DISEQC_SEND_MASTER_CMD failed");
+ }
+
+ QString msg;
+ if ( dvbDevice->lnb[switchPos].rotorType!=0 && chan->tp.source!=dvbDevice->lnb[switchPos].currentSource ) {
+ int i, index=-1;
+ double angle=0.0, oldAngle=0.0;
+ fprintf( stderr, "Driving rotor to %s\n", chan->tp.source.ascii() );
+ for ( i=0; i<(int)dvbDevice->lnb[switchPos].source.count(); i++ ) {
+ if ( dvbDevice->lnb[switchPos].source[i]==chan->tp.source ) {
+ index = i;
+ break;
+ }
+ }
+ angle = getSourceAngle( chan->tp.source );
+ if ( dvbDevice->lnb[switchPos].rotorType==1 ) {
+ fprintf( stderr, "Rotor: gotoX=%f\n", angle );
+ gotoX( angle );
+ }
+ else {
+ int pos = dvbDevice->lnb[switchPos].position[index];
+ fprintf( stderr, "Rotor: gotoN=%d\n", pos );
+ rotorCommand( 9, pos );
+ }
+ if ( dvbDevice->lnb[switchPos].currentSource.isEmpty() ) {
+ rotor = 10;
+ msg = i18n("Moving rotor from unknown position...");
+ }
+ else {
+ oldAngle = getSourceAngle( dvbDevice->lnb[switchPos].currentSource );
+ fprintf( stderr, "old rotor pos: %f °\n", oldAngle );
+ fprintf( stderr, "new rotor pos: %f °\n", angle );
+ angle = fabs(angle-oldAngle);
+ fprintf( stderr, "Rotation angle: %f °\n", angle );
+ if ( voltage18 )
+ rotor = (int)(angle*dvbDevice->lnb[switchPos].speed18v)+1;
+ else
+ rotor = (int)(angle*dvbDevice->lnb[switchPos].speed13v)+1;
+ msg = i18n("Moving rotor...");
+ }
+ fprintf( stderr, "Rotation time: %d sec.\n", rotor );
+ }
+
+ if ( rotor ) {
+ int j;
+ if ( !dvr ) {
+ for ( j=0; j<(rotor*2); j++ ) {
+ usleep( 500000 );
+ }
+ }
+ else {
+ QProgressDialog progress( msg, i18n("Cancel"), rotor*2, 0, "progress", true );
+ for ( j=0; j<(rotor*2); j++ ) {
+ progress.setProgress( j );
+ qApp->processEvents();
+ if ( progress.wasCanceled() )
+ break;
+ usleep( 500000 );
+ }
+ progress.setProgress( rotor*2 );
+ qApp->processEvents();
+ }
+ }
+
+ for ( i=0; i<2; ++i ) {
+ usleep(15*1000);
+ if ( ioctl(fdFrontend, FE_DISEQC_SEND_BURST, (ci/4)%2 ? SEC_MINI_B : SEC_MINI_A) )
+ perror("FE_DISEQC_SEND_BURST failed");
+ }
+
+ usleep(15*1000);
+ if ( ioctl(fdFrontend, FE_SET_TONE, (ci/2)%2 ? SEC_TONE_ON : SEC_TONE_OFF) )
+ perror("FE_SET_TONE failed");
+
+ return 0;
+}
+
+
+
+double DvbStream::getSourceAngle( QString source )
+{
+ double angle=1.0;
+ int pos = source.findRev("-");
+ source.remove(0,pos+1);
+ source = source.upper();
+ if ( source.endsWith("W") )
+ angle = -1.0;
+ source.truncate( source.length()-1 );
+ angle*= source.toDouble();
+ return getAzimuth( angle );
+}
+
+
+
+#define TO_RADS (M_PI / 180.0)
+#define TO_DEC (180.0 / M_PI)
+
+double DvbStream::getAzimuth( double angle )
+{
+ double latitude = dvbDevice->usalsLatitude;
+ double longitude = dvbDevice->usalsLongitude;
+ double P, Ue, Us, az, x, el, Azimuth;
+
+ P = latitude*TO_RADS; // Earth Station Latitude
+ Ue = longitude*TO_RADS; // Earth Station Longitude
+ Us = angle*TO_RADS; // Satellite Longitude
+
+ az = M_PI+atan( tan( Us-Ue )/sin( P ) );
+ x = acos( cos(Us-Ue)*cos(P) );
+ el = atan( ( cos( x )-0.1513 )/sin( x ) );
+ Azimuth = atan( ( -cos(el)*sin(az) )/( sin(el)*cos(P)-cos(el)*sin(P)*cos(az)) )* TO_DEC;
+
+ return Azimuth;
+}
+
+
+
+void DvbStream::gotoX( double azimuth )
+{
+ double USALS=0.0;
+ int CMD1=0x00, CMD2=0x00;
+ int DecimalLookup[10] = { 0x00, 0x02, 0x03, 0x05, 0x06, 0x08, 0x0A, 0x0B, 0x0D, 0x0E };
+
+ if ( azimuth>0.0 )
+ CMD1 = 0xE0; // East
+ else
+ CMD1 = 0xD0; // West
+
+ USALS = fabs( azimuth );
+
+ while (USALS > 16) {
+ CMD1++;
+ USALS-= 16;
+ }
+ while (USALS >= 1.0) {
+ CMD2+=0x10;
+ USALS--;
+ }
+ USALS*= 10.0;
+ int rd = (int)USALS;
+ USALS-= rd;
+ if ( USALS>0.5 )
+ ++rd;
+ CMD2+= DecimalLookup[rd];
+
+ rotorCommand( 12, CMD1, CMD2 );
+}
+
+
+
+void DvbStream::rotorCommand( int cmd, int n1, int n2, int n3 )
+{
+ struct dvb_diseqc_master_cmd cmds[] = {
+ { { 0xe0, 0x31, 0x60, 0x00, 0x00, 0x00 }, 3 }, //0 Stop Positioner movement
+ { { 0xe0, 0x31, 0x63, 0x00, 0x00, 0x00 }, 3 }, //1 Disable Limits
+ { { 0xe0, 0x31, 0x66, 0x00, 0x00, 0x00 }, 3 }, //2 Set East Limit
+ { { 0xe0, 0x31, 0x67, 0x00, 0x00, 0x00 }, 3 }, //3 Set West Limit
+ { { 0xe0, 0x31, 0x68, 0x00, 0x00, 0x00 }, 4 }, //4 Drive Motor East continously
+ { { 0xe0, 0x31, 0x68,256-n1,0x00, 0x00 }, 4 }, //5 Drive Motor East nn steps
+ { { 0xe0, 0x31, 0x69,256-n1,0x00, 0x00 }, 4 }, //6 Drive Motor West nn steps
+ { { 0xe0, 0x31, 0x69, 0x00, 0x00, 0x00 }, 4 }, //7 Drive Motor West continously
+ { { 0xe0, 0x31, 0x6a, n1, 0x00, 0x00 }, 4 }, //8 Store nn
+ { { 0xe0, 0x31, 0x6b, n1, 0x00, 0x00 }, 4 }, //9 Goto nn
+ { { 0xe0, 0x31, 0x6f, n1, n2, n3 }, 4}, //10 Recalculate Position
+ { { 0xe0, 0x31, 0x6a, 0x00, 0x00, 0x00 }, 4 }, //11 Enable Limits
+ { { 0xe0, 0x31, 0x6e, n1, n2, 0x00 }, 5 }, //12 Gotoxx
+ { { 0xe0, 0x10, 0x38, 0xF4, 0x00, 0x00 }, 4 } //13 User
+ };
+
+ int i;
+ for ( i=0; i<2; ++i ) {
+ usleep(15*1000);
+ if ( ioctl( fdFrontend, FE_DISEQC_SEND_MASTER_CMD, &cmds[cmd] ) )
+ perror("Rotor : FE_DISEQC_SEND_MASTER_CMD failed");
+ }
+}
+
+
+
+bool DvbStream::setPids( DVBout *o )
+{
+ int i, dmx;
+ struct dmx_pes_filter_params pesFilterParams;
+ dmx_pes_type_t pestype = DMX_PES_OTHER;
+ QValueList<int> pidList;
+
+ pidList = o->pidsList();
+
+ for ( i=0; i<(int)pidList.count(); i++ ) {
+ if ( ( dmx = open( demuxName.ascii(), O_RDWR)) < 0 ) {
+ fprintf(stderr,"FD %i: ",i);
+ perror("DEMUX DEVICE: ");
+ return false;
+ }
+ else
+ o->dmx.append(dmx);
+ }
+
+ for ( i=0; i<(int)pidList.count(); i++ ) {
+ pesFilterParams.pid = pidList[i];
+ pesFilterParams.input = DMX_IN_FRONTEND;
+ pesFilterParams.output = DMX_OUT_TS_TAP;
+ pesFilterParams.pes_type = pestype;
+ pesFilterParams.flags = DMX_IMMEDIATE_START;
+ if ( ioctl( o->dmx[i], DMX_SET_PES_FILTER, &pesFilterParams) < 0) {
+ fprintf( stderr, "FILTER %i: ", pidList[i] );
+ perror("DMX SET PES FILTER");
+ }
+ }
+
+ ndmx +=pidList.count();
+
+ return true;
+}
+
+
+
+void DvbStream::removePids( DVBout *o )
+{
+ int i;
+
+ for ( i=0; i<(int)o->dmx.count(); i++ )
+ close( o->dmx[i] );
+ ndmx -=o->dmx.count();
+}
+
+
+
+void DvbStream::removeOut( DVBout *o )
+{
+ disconnect( o, SIGNAL(endRecord(DVBout*,RecTimer*,bool)), this, SLOT(recordEnded(DVBout*,RecTimer*,bool)) );
+ disconnect( o, SIGNAL(playDvb()), this, SLOT(receivePlayDvb()) );
+ disconnect( o, SIGNAL(shifting(bool)), this, SLOT(receiveShifting(bool)) );
+ delOut = o;
+ while ( delOut )
+ usleep(100);
+}
+
+
+
+bool DvbStream::checkStatus()
+{
+ int32_t strength;
+ fe_status_t festatus;
+ bool ret=true;
+
+ strength=0;
+ ioctl(fdFrontend,FE_READ_SIGNAL_STRENGTH,&strength);
+ emit signalStatus(strength*100/65535);
+
+ strength=0;
+ ioctl(fdFrontend,FE_READ_SNR,&strength);
+ emit snrStatus(strength*100/65535);
+
+ memset( &festatus, 0, sizeof(festatus) );
+ ioctl(fdFrontend,FE_READ_STATUS,&festatus);
+
+ if (festatus & FE_HAS_LOCK)
+ emit lockStatus( true );
+ else {
+ emit lockStatus( false );
+ ret = false;
+ }
+
+ return ret;
+}
+
+
+
+int DvbStream::getSNR()
+{
+ int32_t snr=0;
+ if ( fdFrontend ) {
+ ioctl( fdFrontend, FE_READ_SNR, &snr );
+ snr = snr*100/65535;
+ }
+ return snr;
+}
+
+
+
+bool DvbStream::hasVideo()
+{
+ if ( getLiveChannel().vpid )
+ return true;
+ return false;
+}
+
+
+
+void DvbStream::run()
+{
+ unsigned char buf[188];
+ int n, i, thWrite=0;
+ int WSIZE=188*8;
+ DVBout *o=0;
+
+ signal( SIGPIPE, SIG_IGN );
+
+ while ( isRunning ) {
+ if ( poll( &pfd, 1, 100 ) ) {
+ n = read( fdDvr, buf, 188 );
+ if ( n==188 ) {
+ memcpy( thBuf+thWrite, buf, n );
+ thWrite+=n;
+ if ( thWrite==WSIZE ) {
+ for ( i=0; i<(int)out.count(); i++ )
+ out.at(i)->process( thBuf, WSIZE );
+ thWrite = 0;
+ }
+ }
+ }
+ else
+ usleep(1000);
+
+ if ( waitPause>0 ) {
+ o = 0;
+ for ( i=0; i<(int)out.count(); i++ )
+ if ( out.at(i)->hasLive() )
+ o = out.at(i);
+ if ( o ) {
+ if ( o->doPause( timeShiftFileName ) )
+ waitPause = 0;
+ else
+ waitPause = -1;
+ }
+ else
+ waitPause = -1;
+ }
+
+ if ( delOut ) {
+ out.remove( delOut );
+ delOut = 0;
+ }
+ }
+
+ fprintf(stderr,"dvbstream::run() end\n");
+}
+
+
+
+bool DvbStream::doPause( const QString &name )
+{
+ //if ( !hasVideo() ) return false;
+
+ if ( !timeShifting ) {
+ timeShiftFileName = name;
+ waitPause = 1;
+ while ( waitPause>0 )
+ usleep(100);
+ if ( waitPause<0 )
+ return false;
+ else
+ receiveShifting( true );
+ return true;
+ }
+ return false;
+}
+
+
+
+bool DvbStream::timeShiftMode()
+{
+ return timeShifting;
+}
+
+
+
+void DvbStream::receiveShifting( bool b )
+{
+ timeShifting = b;
+ emit shifting( b );
+}
+
+
+
+bool DvbStream::running() const
+{
+ return isRunning;
+}
+
+
+
+void DvbStream::receivePlayDvb()
+{
+ KApplication::kApplication()->postEvent( this, new QTimerEvent( 500 ) );
+}
+
+
+
+void DvbStream::timerEvent( QTimerEvent* ev )
+{
+ switch ( ev->timerId() ) {
+ case 500:
+ emit playDvb();
+ }
+}
+
+
+
+void DvbStream::recordEnded( DVBout *o, RecTimer* t, bool kill )
+{
+ int i;
+
+ if ( kill ) {
+ removePids( o );
+ removeOut( o );
+ if ( out.count()==0 )
+ stop();
+ else if ( cam ) {
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( out.at(i)->channel.fta ) {
+ i=-1;
+ break;
+ }
+ }
+ if ( i!=-1 )
+ cam->stop();
+ }
+ }
+ recordingState();
+ if ( t )
+ emit timerEnded( t );
+}
+
+
+
+void DvbStream::recordingState()
+{
+ int i;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( out.at(i)->hasRec() ) {
+ emit isRecording( true );
+ return;
+ }
+ }
+ emit isRecording( false );
+}
+
+
+
+void DvbStream::updateTimer( RecTimer *t, int ms )
+{
+ int i;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( out.at(i)->recTimer==t ) {
+ if ( ms )
+ out.at(i)->changeTimer( ms );
+ else
+ out.at(i)->stopRec();
+ return;
+ }
+ }
+ if ( !ms )
+ emit timerEnded( t ); // not running
+}
+
+
+
+void DvbStream::stopBroadcast()
+{
+ int i;
+ DVBout *o=0;
+ QPtrList<DVBout> p;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ o = out.at(i);
+ o->stopBroadcast();
+ if ( !o->hasLive() && !o->hasRec() )
+ p.append( o );
+ }
+ for ( i=0; i<(int)p.count(); i++ ) {
+ removePids( p.at(i) );
+ removeOut( p.at(i) );
+ }
+ if ( out.count()==0 )
+ stop();
+ emit isBroadcasting( false );
+}
+
+
+
+int DvbStream::canStartBroadcast( bool &live, ChannelDesc *chan )
+{
+ int i, ret=0;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( (chan->tp!=out.at(i)->channel.tp) && out.at(i)->hasRec() )
+ return ErrIsRecording;
+ if ( cam && out.at(i)->hasRec() && out.at(i)->channel.fta && chan->fta && out.at(i)->channel.sid!=chan->sid )
+ return ErrCamUsed;
+ if ( out.at(i)->hasLive() && chan->tp!=out.at(i)->channel.tp )
+ live = true;
+ }
+ return ret;
+}
+
+
+
+bool DvbStream::startBroadcast( QPtrList<ChannelDesc> *list, Ts2Rtp *rtp )
+{
+ int i, j;
+ bool stop=false, newout;
+ DVBout *o=0;
+ int no=0;
+ ChannelDesc *chan=list->at(0);
+ QPtrList<ChannelDesc> broadcastList;
+ broadcastList.setAutoDelete( true );
+
+ if ( !isTuned() ) {
+ for ( i=0; i<MAXTUNETRY; i++ ) {
+ if ( tuneDvb( chan ) ) {
+ i = -1;
+ break;
+ }
+ else
+ usleep(100000);
+ }
+ if ( i<0 )
+ stop = true;
+ else
+ return false;
+ }
+
+ for ( i=0; i<(int)list->count(); i++ ) {
+ newout = false;
+ o = 0;
+ for ( j=0; j<(int)out.count(); j++ ) {
+ if ( out.at(j)->channel.name==list->at(i)->name )
+ o = out.at(j);
+ }
+
+ if ( !o ) {
+ o = new DVBout( *list->at(i), dvbDevice->adapter, dvbDevice->tuner, plug );
+ connect( o, SIGNAL(endRecord(DVBout*,RecTimer*,bool)), this, SLOT(recordEnded(DVBout*,RecTimer*,bool)) );
+ connect( o, SIGNAL(playDvb()), this, SLOT(receivePlayDvb()) );
+ connect( o, SIGNAL(shifting(bool)), this, SLOT(receiveShifting(bool)) );
+ out.append( o );
+ if ( !setPids( o ) ) {
+ removePids( o );
+ removeOut( o );
+ o = 0;
+ }
+ else
+ newout = true;
+ }
+
+ if ( o ) {
+ if ( !o->goBroadcast( rtp ) ) {
+ if ( newout ) {
+ removePids( o );
+ removeOut( o );
+ }
+ }
+ else {
+ broadcastList.append( new ChannelDesc( *list->at(i) ) );
+ no++;
+ }
+ }
+ }
+
+ if ( !no && stop )
+ stopFrontend();
+ else
+ rtp->addChannels( &broadcastList );
+
+ fprintf(stderr,"NOUT: %d\n", out.count() );
+
+ if ( !no )
+ return false;
+ else
+ startReading();
+ emit isBroadcasting( true );
+ return true;
+}
+
+
+
+int DvbStream::canStartTimer( bool &live, ChannelDesc *chan )
+{
+ int i, ret=0;
+ DVBout *o;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ o = out.at(i);
+ if ( (chan->tp!=o->channel.tp) && o->hasRec() )
+ return ErrIsRecording;
+ if ( (o->channel.name==chan->name) && o->hasRec() )
+ return ErrIsRecording;
+ if ( (chan->tp==o->channel.tp) && o->hasRec() ) {
+ if ( chan->fta && cam && o->channel.fta )
+ return ErrCamUsed;
+ }
+ if ( o->hasLive() ) {
+ if ( chan->tp!=o->channel.tp )
+ live = true;
+ else if ( cam && chan->fta && o->channel.fta )
+ live = true;
+ }
+ }
+ return ret;
+}
+
+
+
+bool DvbStream::startTimer( ChannelDesc *chan, QString path, int maxsize, RecTimer *t, QString name )
+{
+ int i;
+ bool stop=false, newout=false;
+ DVBout *o=0;
+ QPtrList<DVBout> p;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( out.at(i)->channel.name==chan->name )
+ o = out.at(i);
+ else {
+ if ( out.at(i)->hasBroadcast() && out.at(i)->channel.tp!=chan->tp ) {
+ p.append( out.at(i) );
+ }
+ }
+ }
+
+ for ( i=0; i<(int)p.count(); i++ ) {
+ p.at(i)->stopBroadcast();
+ removePids( p.at(i) );
+ removeOut( p.at(i) );
+ }
+
+ if ( p.count() ) {
+ emit isBroadcasting( false );
+ this->stop();
+ }
+
+ if ( !isTuned() ) {
+ for ( i=0; i<MAXTUNETRY; i++ ) {
+ if ( tuneDvb( chan ) ) {
+ i = -1;
+ break;
+ }
+ else
+ usleep(100000);
+ }
+ if ( i<0 )
+ stop = true;
+ else
+ return false;
+ }
+
+ if ( !o ) {
+ o = new DVBout( *chan, dvbDevice->adapter, dvbDevice->tuner, plug );
+ connect( o, SIGNAL(endRecord(DVBout*,RecTimer*,bool)), this, SLOT(recordEnded(DVBout*,RecTimer*,bool)) );
+ connect( o, SIGNAL(playDvb()), this, SLOT(receivePlayDvb()) );
+ connect( o, SIGNAL(shifting(bool)), this, SLOT(receiveShifting(bool)) );
+ out.append( o );
+ if ( !setPids( o ) ) {
+ if ( stop )
+ stopFrontend();
+ removePids( o );
+ removeOut( o );
+ return false;
+ }
+ newout = true;
+ }
+
+ if ( t->mode && !name.contains("%date") )
+ name+= "-%date";
+ name = name.replace( "%chan", chan->name ).replace("%date", t->begin.toString( "yyyyMMdd-hhmmss" ) ).replace("%name", t->name );
+ name = name.replace( "/", "_" ).replace( ">", "_" ).replace("<","_").replace(":","_").replace('"',"_").replace("\\","_").replace("|","_");
+ name = path+name;
+
+ if ( !o->goRec( name, maxsize, t ) ) {
+ if ( stop )
+ stopFrontend();
+ if ( newout ) {
+ removePids( o );
+ removeOut( o );
+ }
+ return false;
+ }
+
+ fprintf(stderr,"NOUT: %d\n", out.count() );
+ if ( chan->fta && cam && ( ((cam->running() && chan->sid!=cam->serviceId()) || !cam->running()) ) )
+ cam->restart( chan->sid );
+
+ startReading();
+
+ recordingState();
+ return true;
+}
+
+
+
+int DvbStream::goLive( ChannelDesc *chan, const QString &pipeName )
+{
+ int i;
+ bool stop=false;
+ DVBout *o=0;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( (chan->tp!=out.at(i)->channel.tp) && out.at(i)->hasRec() )
+ return ErrIsRecording;
+ if ( (chan->tp!=out.at(i)->channel.tp) && out.at(i)->hasBroadcast() )
+ return ErrIsBroadcasting;
+ if ( (chan->tp==out.at(i)->channel.tp) && (out.at(i)->hasBroadcast() || out.at(i)->hasRec())) {
+ if ( chan->fta && cam && cam->running() && (cam->serviceId()!=chan->sid) )
+ return ErrCamUsed;
+ }
+ if ( out.at(i)->channel.name==chan->name )
+ o = out.at(i);
+ }
+
+ if ( !isTuned() ) {
+ for ( i=0; i<MAXTUNETRY; i++ ) {
+ if ( tuneDvb( chan ) ) {
+ i = -1;
+ break;
+ }
+ else
+ usleep(100000);
+ }
+ if ( i<0 )
+ stop = true;
+ else
+ return ErrCantTune;
+ }
+
+ if ( !o ) {
+ o = new DVBout( *chan, dvbDevice->adapter, dvbDevice->tuner, plug );
+ connect( o, SIGNAL(endRecord(DVBout*,RecTimer*,bool)), this, SLOT(recordEnded(DVBout*,RecTimer*,bool)) );
+ connect( o, SIGNAL(playDvb()), this, SLOT(receivePlayDvb()) );
+ connect( o, SIGNAL(shifting(bool)), this, SLOT(receiveShifting(bool)) );
+ out.append( o );
+ if ( !setPids( o ) ) {
+ if ( stop )
+ stopFrontend();
+ removePids( o );
+ removeOut( o );
+ return ErrCantSetPids;
+ }
+ }
+
+ if ( o->hasRec() )
+ i = ErrDontSwitchAudio;
+ else
+ i = 0;
+
+ o->goLive( pipeName );
+ fprintf(stderr,"NOUT: %d\n", out.count() );
+
+ if ( chan->fta && cam && !cam->running() )
+ cam->restart( chan->sid );
+ startReading();
+
+ return i;
+}
+
+
+
+void DvbStream::preStopLive()
+{
+ int i;
+ DVBout *o;
+
+ for ( i=0; i<(int)out.count(); i++ ) {
+ o = out.at(i);
+ if ( o->hasLive() ) {
+ o->preStopLive();
+ break;
+ }
+ }
+}
+
+
+
+void DvbStream::stopLive( ChannelDesc *chan )
+{
+ int i;
+ DVBout *o;
+ QPtrList<DVBout> p;
+ bool camUsed = false;
+
+ fprintf(stderr,"Asked to stop\n");
+ for ( i=0; i<(int)out.count(); i++ ) {
+ o = out.at(i);
+ if ( o->hasLive() ) {
+ o->stopLive();
+ if ( !o->hasRec() && !o->hasBroadcast() ) {
+ p.append( o );
+ }
+ break;
+ }
+ }
+ for ( i=0; i<(int)p.count(); i++ ) {
+ removePids( p.at(i) );
+ removeOut( p.at(i) );
+ }
+ fprintf(stderr,"Live stopped\n");
+ if ( cam ) {
+ for ( i=0; i<(int)out.count(); i++ ) {
+ if ( out.at(i)->channel.fta )
+ camUsed = true;
+ }
+ }
+ if ( cam && !camUsed )
+ cam->stop();
+ if ( out.count()==0 && chan->tp!=currentTransponder )
+ stop();
+}
+
+
+
+void DvbStream::startReading()
+{
+ if ( !isRunning ) {
+ isRunning = true;
+ start();
+ dvbEvents->go( currentTransponder.source, currentTransponder.freq, true );
+ }
+}
+
+
+
+void DvbStream::stop()
+{
+ isRunning = false;
+ if ( !wait(10000) ) {
+ terminate();
+ wait();
+ fprintf(stderr,"dvbstream::run() terminated\n");
+ }
+ if ( cam )
+ cam->stop();
+ dvbEvents->stop();
+ stopFrontend();
+}
+
+
+
+void DvbStream::stopFrontend()
+{
+ if ( fdDvr ) {
+ close( fdDvr );
+ fprintf(stderr,"fdDvr closed\n");
+ fdDvr = 0;
+ }
+ closeFe();
+}
+
+
+
+void DvbStream::setScanning( bool b )
+{
+ connectStatus( b );
+}
+
+
+
+void DvbStream::stopScan()
+{
+ closeFe();
+}
+
+
+
+DvbStream::~DvbStream()
+{
+ stop();
+ if ( cam ) {
+ cam->stop();
+ delete cam;
+ }
+ delete dvbEvents;
+}
+
+#include "dvbstream.moc"
diff --git a/kaffeine/src/input/dvb/dvbstream.h b/kaffeine/src/input/dvb/dvbstream.h
new file mode 100644
index 0000000..a5deb52
--- /dev/null
+++ b/kaffeine/src/input/dvb/dvbstream.h
@@ -0,0 +1,163 @@
+/*
+ * dvbstream.h
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DVBSTREAM_H
+#define DVBSTREAM_H
+
+#include <sys/poll.h>
+#include <sys/stat.h>
+
+#include <qthread.h>
+#include <qptrlist.h>
+#include <qfile.h>
+#include <qobject.h>
+#include <qtimer.h>
+#include <qstringlist.h>
+
+#include "channeldesc.h"
+#include "dvbout.h"
+#include "ts2rtp.h"
+#include "dvbconfig.h"
+
+#define MAX_CHANNELS 8
+
+class DVBevents;
+class DvbCam;
+class KaffeineDvbPlugin;
+class EventTable;
+
+
+
+class DvbStream : public QObject, public QThread
+{
+ Q_OBJECT
+
+public :
+
+ enum { ErrDontSwitchAudio=-1, ErrCantTune=1, ErrCantSetPids=2, ErrIsRecording=3, ErrNoLive=4,
+ ErrCantOpenFile=5, ErrIsBroadcasting=6, ErrCamUsed=7 };
+
+ DvbStream( Device *d, const QString &charset, EventTable *et );
+ ~DvbStream();
+ int getAdapter() { return dvbDevice->adapter; }
+ int getTuner() { return dvbDevice->tuner; }
+ fe_type_t getType() {return dvbDevice->type; }
+ void setPlug( KaffeineDvbPlugin *p );
+ QStringList getSources( bool all=false );
+ bool canSource( ChannelDesc *chan );
+ bool tuneDvb( ChannelDesc *chan, bool dvr=true );
+ void stopFrontend();
+ virtual void run();
+ int goLive( ChannelDesc *chan, const QString &pipeName );
+ void preStopLive();
+ void stopLive( ChannelDesc *chan );
+ void stop();
+ void stopScan();
+ void setScanning( bool b );
+ bool hasVideo();
+ bool doPause( const QString &name );
+ bool timeShiftMode();
+ bool running() const;
+ ChannelDesc getLiveChannel();
+ Transponder getCurrentTransponder();
+ unsigned long getCurrentFreq();
+ bool isTuned();
+ bool startTimer( ChannelDesc *chan, QString path, int maxsize, RecTimer *t, QString filename );
+ int canStartTimer( bool &live, ChannelDesc *chan );
+ int canStartBroadcast( bool &live, ChannelDesc *chan );
+ bool startBroadcast( QPtrList<ChannelDesc> *list, Ts2Rtp *rtp );
+ void stopBroadcast();
+ bool hasRec();
+ bool hasBroadcast();
+ bool hasLive();
+ bool liveIsRecording();
+ int getSNR();
+
+ unsigned char thBuf[188*10];
+ struct pollfd pfd;
+ DVBevents *dvbEvents;
+
+public slots:
+
+ bool checkStatus();
+ void receivePlayDvb();
+ void recordEnded( DVBout *o, RecTimer *t, bool kill );
+ void receiveShifting( bool b );
+ void updateTimer( RecTimer *t, int ms );
+
+protected:
+
+ void timerEvent( QTimerEvent* ev );
+
+private :
+
+ int setDiseqc( int switchPos, ChannelDesc *chan, int hiband, int &rotor, bool dvr );
+ void rotorCommand( int cmd, int n1=0, int n2=0, int n3=0 );
+ void gotoX( double azimuth );
+ double getAzimuth( double angle );
+ double getSourceAngle( QString source );
+ int getSatPos( const QString &src );
+ bool setPids( DVBout *o );
+ void removePids( DVBout *o );
+ void removeOut( DVBout *o );
+ void recordingState();
+ void startReading();
+ void probeCam();
+ bool openFe();
+ bool closeFe();
+ void connectStatus( bool con );
+
+ QFile liveFile;
+ bool timeShifting;
+ QPtrList<DVBout> out;
+ Device *dvbDevice;
+ int waitPause;
+ DVBout *delOut;
+ Transponder currentTransponder;
+
+ QString frontendName;
+ QString dvrName;
+ QString demuxName;
+ int fdFrontend;
+ int ndmx;
+ int fdDvr, fdPipe;
+ bool isRunning;
+ QTimer statusTimer;
+ QString timeShiftFileName;
+ DvbCam *cam;
+ bool camProbed;
+ KaffeineDvbPlugin *plug;
+
+signals:
+
+ void playDvb();
+ void isRecording(bool);
+ void isBroadcasting(bool);
+ void timerEnded(RecTimer*);
+
+ void errorMsg( QString );
+ void snrStatus( int );
+ void signalStatus( int );
+ void lockStatus( bool );
+ void shifting( bool );
+
+};
+
+#endif /* DVBSTREAM_H */
diff --git a/kaffeine/src/input/dvb/gdvb.h b/kaffeine/src/input/dvb/gdvb.h
new file mode 100644
index 0000000..7f1951c
--- /dev/null
+++ b/kaffeine/src/input/dvb/gdvb.h
@@ -0,0 +1,30 @@
+/*
+ * gdvb.h
+ *
+ * Copyright (C) 2004-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef GDVB_H
+#define GDVB_H
+
+#define TS_SIZE 188
+#define MAX_AUDIO 6
+#define MAX_DVBSUB 3
+
+enum { OutLive=2, OutRec=4, OutRtp=8, OutTS=16 };
+
+#endif /* GDVB_H */
diff --git a/kaffeine/src/input/dvb/kaffeinedvb.rc b/kaffeine/src/input/dvb/kaffeinedvb.rc
new file mode 100644
index 0000000..0104b78
--- /dev/null
+++ b/kaffeine/src/input/dvb/kaffeinedvb.rc
@@ -0,0 +1,24 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="kaffeinedvb" version="5">
+<MenuBar>
+ <Menu name="dvb"><text>&amp;DVB</text>
+ <Action name="dvb_show_osd"/>
+ <Action name="dvb_browse_next" />
+ <Action name="dvb_browse_prev" />
+ <Action name="dvb_browse_zap" />
+ <Action name="dvb_browse_advance" />
+ <Action name="dvb_browse_retreat" />
+ <Separator/>
+ <Action name="dvb_instant_record"/>
+ <Separator/>
+ <Action name="dvb_recall"/>
+ <Separator/>
+ <Action name="dvb_show_epg"/>
+ <Action name="dvb_show_timers"/>
+ <Action name="dvb_show_broadcast"/>
+ <Separator/>
+ <Action name="dvb_channels"/>
+ <Action name="dvb_config"/>
+ </Menu>
+</MenuBar>
+</kpartgui>
diff --git a/kaffeine/src/input/dvb/kevents.cpp b/kaffeine/src/input/dvb/kevents.cpp
new file mode 100644
index 0000000..c24d1c4
--- /dev/null
+++ b/kaffeine/src/input/dvb/kevents.cpp
@@ -0,0 +1,478 @@
+/*
+ * kevents.cpp
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qlayout.h>
+#include <qfile.h>
+#include <qdir.h>
+#include <qpopupmenu.h>
+#include <qcursor.h>
+#include <qwhatsthis.h>
+#include <qcheckbox.h>
+#include <qtooltip.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+
+#include "kevents.h"
+#include "channeldesc.h"
+#include "dvbevents.h"
+#include "dvbstream.h"
+
+
+
+EListViewItem::EListViewItem( QListView *parent, QString chanName, QString eBegin, QString eDuration, QString eTitle, EventDesc *desc ) : KListViewItem( parent, chanName, eBegin, eDuration, eTitle )
+{
+ event = desc;
+}
+
+
+
+int EListViewItem::compare( QListViewItem *i, int col, bool ascending ) const
+{
+ EListViewItem *ei = (EListViewItem*)i;
+
+ if ( col != 1 )
+ return QListViewItem::compare( i, col, ascending );
+
+ if ( event->startDateTime<ei->event->startDateTime )
+ return -1;
+ if ( event->startDateTime==ei->event->startDateTime )
+ return 0;
+ return 1;
+}
+
+
+
+KEvents::KEvents( QPtrList<ChannelDesc> *chans, QPtrList<DvbStream> *d, EventTable *t, QWidget *parent, QSize size ) : QDialog( parent )
+{
+ dvb = d;
+ events = t;
+ channels = chans;
+
+ setCaption( i18n("Electronic Program Guide") );
+
+ QGridLayout *grid = new QGridLayout( this, 1, 1, 11, 6, "grid");
+ QHBoxLayout *hbox = new QHBoxLayout( 0, 0, 6, "hbox" );
+ QVBoxLayout *vbox = new QVBoxLayout( 0, 0, 6 , "vbox");
+
+ resetBtn = new KPushButton( i18n("Refresh"), this );
+ hbox->addWidget( resetBtn );
+ allBtn = new KPushButton( i18n("Scheduled"), this );
+ hbox->addWidget( allBtn );
+ currentNextBtn = new KPushButton( i18n("Current/Next"), this );
+ hbox->addWidget( currentNextBtn );
+ currentChannelEpgBtn = new KPushButton( i18n("Current Channel"), this );
+ hbox->addWidget( currentChannelEpgBtn );
+
+ QSpacerItem* spacer = new QSpacerItem( 20, 20, QSizePolicy::Expanding, QSizePolicy::Minimum );
+ hbox->addItem( spacer );
+
+ vbox->addLayout( hbox);
+
+ hbox = new QHBoxLayout();
+
+ searchBtn = new QToolButton( this );
+ searchBtn->setAutoRaise( true );
+ QToolTip::add( searchBtn, i18n("Electronic Program Guide Search"));
+ hbox->addWidget( searchBtn );
+
+ QLabel* filterLabel = new QLabel( i18n("Search") + ":", this );
+ hbox->addWidget( filterLabel );
+
+ searchLineEdit = new KLineEdit(this);
+ hbox->addWidget( searchLineEdit );
+
+ tvradioCb = new QCheckBox(i18n("TV "), this );
+ QToolTip::add( tvradioCb, i18n("Search TV Channels only (omit Radio)"));
+ tvradioCb->setChecked(true);
+ hbox->addWidget( tvradioCb);
+
+ titleCb = new QCheckBox(i18n("Titles "), this );
+ QToolTip::add( titleCb, i18n("Search Event Titles only (omit Description)"));
+ titleCb->setChecked(true);
+ hbox->addWidget( titleCb);
+
+ ftaCb = new QCheckBox(i18n("FTA "), this );
+ QToolTip::add( ftaCb, i18n("Search Free to Air Channels only (omit PayTV)"));
+ ftaCb->setChecked(false);
+ hbox->addWidget( ftaCb);
+
+ vbox->addLayout( hbox );
+
+ grid->addLayout( vbox, 0, 0 );
+
+ listView = new KListView( this, "listView" );
+ listView->addColumn( i18n( "Channel" ) );
+ listView->addColumn( i18n( "Begin" ) );
+ listView->addColumn( i18n( "Duration" ) );
+ listView->addColumn( i18n( "Title" ) );
+ listView->setResizePolicy( KListView::AutoOneFit );
+ listView->setAllColumnsShowFocus( TRUE );
+ listView->setFullWidth( TRUE );
+ grid->addWidget( listView, 1, 0 );
+ grid->setRowStretch( 1, 4 );
+
+ textBrow = new QTextBrowser( this );
+ grid->addWidget( textBrow, 2, 0 );
+ grid->setRowStretch( 2, 2 );
+
+ KIconLoader *icon = new KIconLoader();
+ resetBtn->setGuiItem( KGuiItem(i18n("Refresh"), icon->loadIconSet("reload", KIcon::Small) ) );
+ allBtn->setGuiItem( KGuiItem(i18n("Scheduled"), icon->loadIconSet("date", KIcon::Small) ) );
+ currentNextBtn->setGuiItem( KGuiItem(i18n("Current/Next"), icon->loadIconSet("toggle_log", KIcon::Small) ) );
+ currentChannelEpgBtn->setGuiItem( KGuiItem(i18n("Current Channel"), icon->loadIconSet("date", KIcon::Small) ) );
+ searchBtn->setIconSet( icon->loadIconSet("locationbar_erase", KIcon::Small) );
+
+ new EListViewItem( (QListView*)listView, "Une chaine", "99/99/99 99:99 9999", "99:99 99", "un titre de programme", 0 );
+
+ resize( size );
+ connect( resetBtn , SIGNAL( pressed() ), this, SLOT( reset() ) );
+ connect( allBtn , SIGNAL( clicked() ), this, SLOT( setScheduled() ) );
+ connect( currentNextBtn , SIGNAL( clicked() ), this, SLOT( setCurrentNext() ) );
+ connect( currentChannelEpgBtn, SIGNAL( clicked() ), this, SLOT( setCurrentChannelEpg() ) );
+ connect( searchBtn, SIGNAL( clicked() ), this, SLOT(resetSearch()) );
+ connect( searchLineEdit, SIGNAL( returnPressed() ), this, SLOT( epgSearch() ) );
+
+ connect( listView, SIGNAL( mouseButtonClicked(int,QListViewItem*,const QPoint&,int) ),
+ this, SLOT(mouseClickedSlot(int,QListViewItem*,const QPoint&,int)) );
+
+ connect( listView, SIGNAL(doubleClicked(QListViewItem*,const QPoint &,int)),
+ this, SLOT(zap(QListViewItem*,const QPoint &,int)) );
+
+ setMode( 1 );
+ delete icon;
+}
+
+void KEvents::resetSearch()
+{
+ searchLineEdit->clear();
+}
+
+void KEvents::checkEpgSearch(QString searchword)
+{
+ int i, j, k, m, n, l;
+ EventSource *esrc;
+ EventTsid *et;
+ EventSid *es;
+ EventDesc *desc;
+ EListViewItem *itt=0;
+ ChannelDesc *ch;
+ QString s, begin, duration, title;
+ bool found;
+
+ for( k=0; k<events->getNSource(); k++ ) {
+ if ( !(esrc=events->getNEventSource( k )) )
+ continue;
+ for ( m=0; m<esrc->getNTsid(); m++ ) {
+ if ( !(et=esrc->getNEventTsid( m )) )
+ continue;
+ for ( n=0; n<et->getNSid(); n++ ) {
+ if ( !(es=et->getNEventSid( n )) )
+ continue;
+ for ( j=0; j<es->getNDesc(); j++ ) {
+ if ( !(desc=es->getEventDesc( j )) )
+ continue;
+
+ if ( desc->title.isEmpty() )
+ continue;
+
+ for ( i=0; i<(int)channels->count(); i++ ) {
+ ch = channels->at(i);
+ if ( desc->source==ch->tp.source && desc->nid==ch->tp.nid && desc->sid==ch->sid && desc->tsid==ch->tp.tsid ) {
+ if(tvradioCb->isChecked() && ch->type==2)
+ break;
+
+ if(ftaCb->isChecked() && ch->fta==1)
+ break;
+
+ found=false;
+ if(desc->title.upper().find(searchword.upper())!=-1)
+ found=true;
+
+ if(!desc->subtitle.isEmpty()) {
+ if(desc->subtitle.upper().find(searchword.upper())!=-1)
+ found=true;
+ }
+
+ if(!titleCb->isChecked()) {
+ if(!found) {
+ for ( l=0; l<(int)desc->extEvents.count(); l++ ) {
+ s = *desc->extEvents.at(l);
+ if(!s.isEmpty()) {
+ if(s.upper().find(searchword.upper())!=-1) {
+ found=true;
+ s="";
+ break;
+ }
+ }
+ }
+ }
+ if(!found) {
+ for ( l=0; l<(int)desc->shortEvents.count(); l++ ) {
+ s = desc->shortEvents.at(l)->name;
+ if(!s.isEmpty()) {
+ if(s.upper().find(searchword.upper())!=-1) {
+ found=true;
+ s="";
+ break;
+ }
+ }
+ s = desc->shortEvents.at(l)->text;
+ if(!s.isEmpty()) {
+ if(s.upper().find(searchword.upper())!=-1) {
+ found=true;
+ s="";
+ break;
+ }
+ }
+ }
+ }
+ }
+ if(!found)
+ break;
+
+ begin = KGlobal::locale()->formatDateTime( desc->startDateTime );
+ duration = desc->duration.toString("hh:mm");
+ title = desc->title;
+
+ itt = new EListViewItem( (QListView*)listView, ch->name, begin, duration, title, desc );
+
+ if ( !ch->pix.isNull() )
+ itt->setPixmap( 0, ch->pix );
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+void KEvents::epgSearch()
+{
+
+ QString text = searchLineEdit->text();
+ if (text.stripWhiteSpace().isEmpty()) return;
+
+ listView->clear();
+ checkEpgSearch(text);
+}
+
+void KEvents::setCurrentChannelEpg()
+{
+ ChannelDesc curchan;
+ int i;
+ for ( i=0; i<(int)dvb->count(); i++ ) {
+ if ( dvb->at(i)->hasLive() ) {
+ curchan = dvb->at(i)->getLiveChannel();
+ break;
+ }
+ }
+ if ( !curchan.name.isEmpty() )
+ setMode( 2, curchan.name );
+
+}
+
+void KEvents::zap( QListViewItem* it, const QPoint &p, int col )
+{
+ QPoint pt=p;
+ int c=col;
+ c++;
+
+ if ( it->text(0) != QString::null )
+ emit zapTo( it->text(0) );
+}
+
+
+
+void KEvents::mouseClickedSlot( int btn, QListViewItem *it, const QPoint &p, int c )
+{
+ int i=c;
+ QPoint pt=p;
+ QString s;
+
+ if ( !it )
+ return;
+ EListViewItem *ei = (EListViewItem*)it;
+
+ switch ( btn ) {
+ case Qt::RightButton : {
+ QPopupMenu *pop = new QPopupMenu();
+ pop->insertItem( i18n("View All Programs"), 1 );
+ pop->insertSeparator();
+ pop->insertItem( i18n("Add to Timers"), 2 );
+ if ( ei->event->running==4 )
+ pop->setItemEnabled( 2, false );
+ i = 0;
+ i = pop->exec( QCursor::pos() );
+ switch ( i ) {
+ case 0 :
+ break;
+ case 1 :
+ setMode( 2, it->text(0) );
+ break;
+ case 2 :
+ emit addTimer( it->text(0), it->text(3), ei->event->startDateTime, ei->event->duration );
+ break;
+ }
+ delete pop;
+ break;
+ }
+ case Qt::LeftButton : {
+ s = "<qt><h3><font color=\"darkblue\">";
+ s = s+it->text(0)+"</font></h3>";
+ if ( !ei->event->title.isEmpty() ) {
+ s = s+"<b><font color=\"darkgreen\"><big>";
+ s = s+ei->event->title;
+ s = s+"</big></font></b><br>";
+ }
+ if ( !ei->event->subtitle.isEmpty() ) {
+ s = s+"<b><font color=\"#A69631\">";
+ s = s+ei->event->subtitle;
+ s = s+"</font></b><br>";
+ }
+ s = s+"<br><font color=\"darkred\">";
+ s = s+KGlobal::locale()->formatDateTime( ei->event->startDateTime, false )+"<br>";
+ s = s+ei->event->duration.toString("hh:mm");
+ s = s+"</font><br><br>";
+ for ( i=0; i<(int)ei->event->shortEvents.count(); i++ ) {
+ s = s+"<p>";
+ s = s + ei->event->shortEvents.at(i)->name;
+ if (!ei->event->shortEvents.at(i)->name.isEmpty() && !ei->event->shortEvents.at(i)->text.isEmpty()) {
+ s = s + " : ";
+ }
+ s = s + ei->event->shortEvents.at(i)->text;
+ s = s + "</p>";
+ }
+ for ( i=0; i<(int)ei->event->extEvents.count(); i++ ) {
+ s = s+ *ei->event->extEvents.at(i);
+ }
+ s = s+"</qt>";
+ textBrow->setText( s );
+ break;
+ }
+ }
+}
+
+
+
+void KEvents::setCurrentNext()
+{
+ setMode( 1 );
+}
+
+
+
+void KEvents::setScheduled()
+{
+ QListViewItem *it = listView->currentItem();
+ if ( !it )
+ return;
+ setMode( 2, it->text(0) );
+}
+
+
+
+void KEvents::setMode( int m, QString name )
+{
+ int i;
+
+ mode = m;
+ if ( !name.isEmpty() ) {
+ currentNextBtn->show();
+ allBtn->hide();
+ for ( i=0; i<(int)channels->count(); i++ ) {
+ if ( channels->at(i)->name==name ) {
+ chan = channels->at(i);
+ break;
+ }
+ }
+ }
+ else {
+ chan = 0;
+ currentNextBtn->hide();
+ allBtn->show();
+ }
+ reset();
+}
+
+
+
+void KEvents::reset()
+{
+ listView->clear();
+ checkNewEvent();
+}
+
+
+
+void KEvents::checkNewEvent()
+{
+ int i;
+ EventSource *esrc;
+ EventSid *es;
+ EventDesc *desc;
+ EListViewItem *itt=0;
+ ChannelDesc *ch;
+ QString s, t, channel, begin, duration, title;
+
+ if ( mode==2 ) {
+ if ( !chan )
+ return;
+ if ( !(esrc=events->getEventSource( chan->tp.source )) )
+ return;
+ if ( !(es=esrc->getEventSid( chan->tp.nid, chan->tp.tsid, chan->sid )) )
+ return;
+ i = 0;
+ while ( (desc=es->getEventDesc(i)) ) {
+ ++i;
+ begin = KGlobal::locale()->formatDateTime( desc->startDateTime );
+ duration = desc->duration.toString("hh:mm");
+ title = desc->title;
+ if ( title.isEmpty() )
+ continue;
+ itt = new EListViewItem( (QListView*)listView, chan->name, begin, duration, title, desc );
+ if ( !chan->pix.isNull() )
+ itt->setPixmap( 0, chan->pix );
+ }
+ return;
+ }
+
+ for ( i=0; i<(int)channels->count(); i++ ) {
+ ch = channels->at(i);
+ if ( (desc=events->getEventDesc( ch->tp.source, ch->tp.nid, ch->tp.tsid, ch->sid, 0 )) ) {
+ begin = KGlobal::locale()->formatDateTime( desc->startDateTime );
+ duration = desc->duration.toString("hh:mm");
+ title = desc->title;
+ if ( title.isEmpty() )
+ continue;
+ itt = new EListViewItem( (QListView*)listView, ch->name, begin, duration, title, desc );
+ if ( !ch->pix.isNull() )
+ itt->setPixmap( 0, ch->pix );
+ }
+ }
+}
+
+
+
+KEvents::~KEvents()
+{
+}
+
+#include "kevents.moc"
diff --git a/kaffeine/src/input/dvb/kevents.h b/kaffeine/src/input/dvb/kevents.h
new file mode 100644
index 0000000..3779452
--- /dev/null
+++ b/kaffeine/src/input/dvb/kevents.h
@@ -0,0 +1,98 @@
+/*
+ * kevents.h
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KEVENTS_H
+#define KEVENTS_H
+
+#include <qtimer.h>
+#include <qdialog.h>
+#include <qdatetime.h>
+#include <qtextbrowser.h>
+
+#include <klistview.h>
+#include <kpushbutton.h>
+#include <klineedit.h>
+
+class EventDesc;
+class DvbStream;
+class EventTable;
+class ChannelDesc;
+
+
+class EListViewItem : public KListViewItem
+{
+
+public:
+
+ EListViewItem( QListView *parent, QString chanName, QString eBegin, QString eDuration, QString eTitle, EventDesc *desc );
+ virtual int compare( QListViewItem *i, int col, bool ascending ) const;
+
+ EventDesc *event;
+};
+
+
+
+class KEvents : public QDialog
+{
+ Q_OBJECT
+
+public:
+
+ KEvents( QPtrList<ChannelDesc> *chans, QPtrList<DvbStream> *d, EventTable *t, QWidget *parent, QSize size );
+ ~KEvents();
+
+private slots:
+
+ void mouseClickedSlot( int btn, QListViewItem *it, const QPoint &p, int c );
+ void reset();
+ void setMode( int m, QString name="" );
+ void setScheduled();
+ void setCurrentNext();
+ void setCurrentChannelEpg();
+ void epgSearch();
+ void resetSearch();
+ void zap( QListViewItem* it, const QPoint &p, int col );
+
+private:
+ void checkEpgSearch(QString searchword);
+ void checkNewEvent();
+
+ QPtrList<DvbStream> *dvb;
+ EventTable *events;
+ KListView *listView;
+ KPushButton *resetBtn, *currentNextBtn, *allBtn, *currentChannelEpgBtn;
+ QToolButton *searchBtn;
+ QCheckBox *titleCb,*tvradioCb,*ftaCb;
+ QPtrList<ChannelDesc> *channels;
+ QTextBrowser *textBrow;
+ int mode;
+ ChannelDesc *chan;
+
+protected:
+
+ KLineEdit *searchLineEdit;
+
+signals:
+
+ void addTimer( QString channel, QString name, QDateTime begin, QTime duration );
+ void zapTo( const QString &channel );
+};
+
+#endif /* KEVENTS_H */
diff --git a/kaffeine/src/input/dvb/kgradprogress.cpp b/kaffeine/src/input/dvb/kgradprogress.cpp
new file mode 100644
index 0000000..092cfb3
--- /dev/null
+++ b/kaffeine/src/input/dvb/kgradprogress.cpp
@@ -0,0 +1,136 @@
+/*
+ * kgradprogress.cpp
+ *
+ * Copyright (C) 2003-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qpainter.h>
+#include <qlabel.h>
+
+#include "kgradprogress.h"
+
+
+
+KGradProgress::KGradProgress( QWidget *parent ) : QLabel( parent )
+{
+ barPix = 0;
+ colorUp = QColor( 0, 255, 0 );
+ colorDown = QColor( 255, 0, 0 );
+ current = 0;
+ setFrameStyle( QFrame::Box | QFrame::Plain );
+ setLineWidth(1);
+ setMidLineWidth(0);
+ setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
+}
+
+
+
+void KGradProgress::setProgress( int progress )
+{
+ current = progress;
+ draw();
+ repaint(false);
+}
+
+
+
+void KGradProgress::draw()
+{
+ int i, j;
+ int a, b;
+ int off = frameWidth();
+ int h = height() - ( 2*off );
+ int w = width() - ( 2*off );
+ int per;
+ QString s;
+ QFont f;
+
+ s = s.setNum( current )+"%";
+ per = current*w/100;
+
+ if ( barPix ) delete barPix;
+ barPix = new QPixmap( w, h, -1, QPixmap::BestOptim );
+ QPainter p( barPix );
+ p.fillRect( 0, 0, w, h, paletteBackgroundColor() );
+
+ for ( j=0; j<per; j++ ) {
+ if ( j<(w/2) ) {
+ a = 255;
+ b = 2*j*255/w;
+ }
+ else {
+ a = 255-(2*(j-w/2)*255/w);
+ b = 255;
+ }
+ p.setPen( QColor( a, b, 0 ) );
+ for ( i=0; i<h; i++ ) p.drawPoint( j+off, i+off );
+ }
+
+ f = font();
+ f.setPointSize( int(h/1.2) );
+ p.setFont( f );
+ p.setPen( QColor( 0, 0, 0 ) );
+ p.drawText( w/2, (h/2)+(f.pointSize()/2), s );
+ p.end();
+}
+
+
+
+void KGradProgress::resizeEvent( QResizeEvent *e )
+{
+ QSize s=e->size();
+ draw();
+}
+
+
+
+void KGradProgress::paintEvent(QPaintEvent *event)
+{
+ int x, y, w, h;
+
+ x = y = frameWidth();
+ w = width() - (2*x);
+ h = height() - (2*y);
+
+ QLabel::paintEvent( event );
+
+ bitBlt( this, x, y, barPix, 0, 0, w, h, CopyROP );
+}
+
+
+
+QSize KGradProgress::sizeHint()
+{
+ QLabel lab( "This is a progress bar.", 0 );
+ return QSize( lab.width(), int(font().pointSize()*1.2) );
+}
+
+
+
+QSizePolicy KGradProgress::sizePolicy()
+{
+ return QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::Preferred );
+}
+
+
+
+KGradProgress::~KGradProgress()
+{
+ delete barPix;
+}
+
+#include "kgradprogress.moc"
diff --git a/kaffeine/src/input/dvb/kgradprogress.h b/kaffeine/src/input/dvb/kgradprogress.h
new file mode 100644
index 0000000..a55591e
--- /dev/null
+++ b/kaffeine/src/input/dvb/kgradprogress.h
@@ -0,0 +1,59 @@
+/*
+ * kgradprocess.h
+ *
+ * Copyright (C) 2003-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KGRADPROGRESS_H
+#define KGRADPROGRESS_H
+
+#include <qlabel.h>
+#include <qpixmap.h>
+
+
+
+class KGradProgress : public QLabel
+{
+
+ Q_OBJECT
+
+public:
+
+ KGradProgress( QWidget *parent );
+ ~KGradProgress();
+ virtual void paintEvent(QPaintEvent *event);
+ virtual QSize sizeHint();
+ virtual QSizePolicy sizePolicy();
+
+public slots:
+
+ void setProgress( int progress );
+
+protected:
+
+ virtual void resizeEvent( QResizeEvent *e );
+
+private:
+
+ void draw();
+
+ QPixmap *barPix;
+ QColor colorDown, colorUp;
+ int current;
+};
+
+#endif /* KGRADPROGRESS_H */
diff --git a/kaffeine/src/input/dvb/krecord.cpp b/kaffeine/src/input/dvb/krecord.cpp
new file mode 100644
index 0000000..7e14036
--- /dev/null
+++ b/kaffeine/src/input/dvb/krecord.cpp
@@ -0,0 +1,295 @@
+/*
+ * krecord.cpp
+ *
+ * Copyright (C) 2004-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qfile.h>
+#include <qdir.h>
+#include <qframe.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+
+#include "krecord.h"
+
+
+
+KRecord::KRecord( QStringList chanList, QPtrList<RecTimer> *t, QWidget *parent, QSize size ) : QDialog( parent )
+{
+ timers = t;
+ channelsList = chanList;
+
+ QVBoxLayout *vb = new QVBoxLayout( 0, 0, 6 );
+ QLabel *lab = new QLabel( i18n("Timers list:"), this );
+ vb->addWidget( lab );
+
+ list = new KListView( this );
+ list->addColumn( "" );
+ list->addColumn( i18n( "Name" ) );
+ list->addColumn( i18n( "Channel" ) );
+ list->addColumn( i18n( "Begin" ) );
+ list->addColumn( i18n( "Duration" ) );
+ list->setResizePolicy( KListView::AutoOneFit );
+ list->setAllColumnsShowFocus( true );
+ list->setFullWidth( true );
+ QListViewItem * item = new QListViewItem( list, 0 );
+ item->setText( 0, "00" );
+ item->setText( 1, "Un nom assez long mais pas trop" );
+ item->setText( 2, "Une chaine du meme calibre" );
+ item->setText( 3, "00:00 00/00/00mm" );
+ item->setText( 4, "00:00mm" );
+ vb->addWidget( list );
+
+ QVBoxLayout *vb1 = new QVBoxLayout( 0, 0, 6 );
+ newBtn = new KPushButton(i18n("New"), this);
+ vb1->addWidget( newBtn );
+ editBtn = new KPushButton(i18n("Edit"), this);
+ vb1->addWidget( editBtn );
+ deleteBtn = new KPushButton(i18n("Delete"), this);
+ vb1->addWidget( deleteBtn );
+ vb1->addItem( new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding ) );
+
+ QHBoxLayout *hb = new QHBoxLayout( 0, 0, 6 );
+ hb->addLayout( vb );
+ hb->addLayout( vb1 );
+
+ QHBoxLayout *hb1 = new QHBoxLayout( 0 );
+ hb1->addItem( new QSpacerItem( 20, 20, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum ) );
+ okBtn = new KPushButton(i18n("Close"), this);
+ hb1->addWidget( okBtn );
+
+ QVBoxLayout *vb2 = new QVBoxLayout( this, 6, 6 );
+ vb2->addLayout( hb );
+ QFrame *line = new QFrame( this, "line1" );
+ line->setFrameStyle( QFrame::HLine );
+ line->setFrameShadow( QFrame::Sunken );
+ line->setFrameShape( QFrame::HLine );
+ vb2->addWidget( line );
+ vb2->addLayout( hb1 );
+
+ KIconLoader *icon = new KIconLoader();
+ newBtn->setGuiItem( KGuiItem(i18n("New"), icon->loadIconSet("filenew", KIcon::Small) ) );
+ editBtn->setGuiItem( KGuiItem(i18n("Edit"), icon->loadIconSet("edit", KIcon::Small) ) );
+ //editBtn->setEnabled( false );
+ deleteBtn->setGuiItem( KGuiItem(i18n("Stop/Delete"), icon->loadIconSet("editcut", KIcon::Small) ) );
+ okBtn->setGuiItem( KGuiItem(i18n("Close"), icon->loadIconSet("exit", KIcon::Small) ) );
+
+ isRecording = icon->loadIcon("player_record", KIcon::Small);
+ yesRepeat = icon->loadIcon("reload", KIcon::Small);
+
+ setCaption( i18n("Timers") );
+
+ connect( okBtn, SIGNAL(clicked()), this, SLOT(accept()) );
+ connect( newBtn, SIGNAL(clicked()), this, SLOT(newTimer()) );
+ connect( deleteBtn, SIGNAL(clicked()), this, SLOT(deleteTimer()) );
+ connect( editBtn, SIGNAL(clicked()), this, SLOT(editTimer()) );
+
+ refresh();
+ resize( size );
+ delete icon;
+}
+
+
+
+void KRecord::refresh()
+{
+ QListViewItem *after, *itt;
+ RecTimer *ti;
+ int i;
+ QString s;
+
+ list->clear();
+ list->setSorting( -1 );
+ for ( i=0; i<(int)timers->count(); i++ ) {
+ ti = timers->at(i);
+ after = where( ti );
+ /*if ( ti->running ) s = ">";
+ else s = "";
+ s = s+ti->name;*/
+ s = ti->name;
+ itt = new KListViewItem( (QListView*)list, "", s, ti->channel, KGlobal::locale()->formatDateTime( ti->begin ), ti->duration.toString("hh:mm") );
+ if ( ti->mode )
+ itt->setPixmap( 0, yesRepeat );
+ if ( ti->running )
+ itt->setPixmap( 1, isRecording );
+ if ( after )
+ itt->moveItem( after );
+ }
+}
+
+
+
+void KRecord::newTimer()
+{
+ QListViewItem *itt, *after;
+ RecTimer *t = new RecTimer();
+
+ t->running = 0;
+ t->mode = 0;
+
+ KTimerEditor dlg( true, channelsList, *t, this );
+ int ret=dlg.exec();
+ if ( ret==KTimerEditor::Accepted ) {
+ *t = dlg.timer;
+ after = where( t, true );
+ itt = new KListViewItem( (QListView*)list, "", t->name, t->channel, KGlobal::locale()->formatDateTime( t->begin ), t->duration.toString("hh:mm") );
+ if ( t->mode )
+ itt->setPixmap( 0, yesRepeat );
+ if ( t->running )
+ itt->setPixmap( 1, isRecording );
+ if ( after )
+ itt->moveItem( after );
+ }
+ else delete t;
+}
+
+
+
+void KRecord::editTimer()
+{
+ QListViewItem *it, *after;
+ int i=0;
+ RecTimer *t, *tn=0;
+
+ it = list->firstChild();
+ while ( it!=0 ) {
+ if ( it->isSelected() )
+ break;
+ it = it->nextSibling();
+ }
+ if ( !it )
+ return;
+
+ for ( i=0; i<(int)timers->count(); i++ ) {
+ t = timers->at(i);
+ if ( t->name==it->text(1) && t->channel==it->text(2) ) {
+ tn = t;
+ break;
+ }
+ }
+
+ if ( !tn )
+ return;
+
+ KTimerEditor dlg( false, channelsList, *tn, this );
+ int ret=dlg.exec();
+ if ( ret==KTimerEditor::Accepted ) {
+ for ( i=0; i<(int)timers->count(); i++ ) {
+ if ( timers->at(i)==tn ) {
+ if ( tn->running ) {
+ int ms = tn->begin.time().secsTo( QTime::currentTime() );
+ ms = ((dlg.timer.duration.hour()*3600+dlg.timer.duration.minute()*60)-ms)*1000;
+ if ( ms<2000 )
+ ms = 0;
+ tn->duration = dlg.timer.duration;
+ emit updateTimer( tn, ms );
+ if ( ms )
+ refresh();
+ }
+ else {
+ timers->remove( tn );
+ t = new RecTimer();
+ *t = dlg.timer;
+ after = where( t, true );
+ refresh();
+ }
+ break;
+ }
+ }
+ }
+}
+
+
+
+void KRecord::deleteTimer()
+{
+ QListViewItem *it;
+ int i=0, ret;
+ KIconLoader *icon = new KIconLoader();
+
+ it = list->firstChild();
+ while ( it!=0 ) {
+ if ( it->isSelected() ) {
+ if ( timers->at(i)->mode )
+ ret = KMessageBox::questionYesNoCancel( this, i18n("This timer is repeated. Do you want to skip the current job or delete the timer?"), i18n("Warning"), KGuiItem(i18n("Skip Current"), icon->loadIconSet("next", KIcon::Small) ), KGuiItem(i18n("Delete"), icon->loadIconSet("editcut", KIcon::Small) ) );
+ else
+ ret = KMessageBox::questionYesNo( this, i18n("Delete the selected timer?") );
+ if ( ret==KMessageBox::Yes ) {
+ emit updateTimer( timers->at(i), 0 );
+ }
+ else if ( ret==KMessageBox::No && timers->at(i)->mode ) {
+ timers->at(i)->mode=0;
+ emit updateTimer( timers->at(i), 0 );
+ }
+ break;
+ }
+ i++;
+ it = it->nextSibling();
+ }
+
+ delete icon;
+}
+
+
+
+QListViewItem* KRecord::where( RecTimer *rt, bool add )
+{
+ QListViewItem *it, *ret=0;
+ int i, r=0;
+ RecTimer *t;
+
+ for ( i=0; i<(int)timers->count(); i++ ) {
+ t = timers->at(i);
+ if ( rt->begin>t->begin )
+ r=i+1;
+ }
+ if ( add )
+ timers->insert( r, rt );
+ if ( !r )
+ return ret;
+
+ it = list->firstChild();
+ i=0;
+ while ( it!=0 ) {
+ if ( i==(r-1) ) {
+ ret = it;
+ break;
+ }
+ i++;
+ it = it->nextSibling();
+ }
+ return ret;
+}
+
+
+
+void KRecord::accept()
+{
+ done( Accepted );
+}
+
+
+
+KRecord::~KRecord()
+{
+}
+
+#include "krecord.moc"
diff --git a/kaffeine/src/input/dvb/krecord.h b/kaffeine/src/input/dvb/krecord.h
new file mode 100644
index 0000000..6a9f1f3
--- /dev/null
+++ b/kaffeine/src/input/dvb/krecord.h
@@ -0,0 +1,69 @@
+/*
+ * krecord.h
+ *
+ * Copyright (C) 2004-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KRECORD_H
+#define KRECORD_H
+
+#include <qdialog.h>
+#include <qpixmap.h>
+
+#include <kpushbutton.h>
+#include <klistview.h>
+
+#include "channeldesc.h"
+#include "ktimereditor.h"
+
+
+
+class KRecord : public QDialog
+{
+ Q_OBJECT
+
+public:
+
+ KRecord( QStringList chanList, QPtrList<RecTimer> *t, QWidget *parent, QSize size );
+ ~KRecord();
+
+ QStringList channelsList;
+
+protected slots:
+
+ virtual void accept();
+ void newTimer();
+ void editTimer();
+ void deleteTimer();
+ void refresh();
+
+private:
+
+ QListViewItem* where( RecTimer *rt, bool add=false );
+
+ KPushButton *newBtn, *editBtn, *deleteBtn, *okBtn;
+ KListView *list;
+ QPtrList<RecTimer> *timers;
+ QPixmap isRecording, yesRepeat;
+
+signals:
+
+ void updateTimer(RecTimer*, int);
+
+};
+
+#endif /* KRECORD_H */
diff --git a/kaffeine/src/input/dvb/ktimereditor.cpp b/kaffeine/src/input/dvb/ktimereditor.cpp
new file mode 100644
index 0000000..63993c0
--- /dev/null
+++ b/kaffeine/src/input/dvb/ktimereditor.cpp
@@ -0,0 +1,231 @@
+/*
+ * ktimereditor.cpp
+ *
+ * Copyright (C) 2004-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+
+#include "ktimereditor.h"
+
+
+
+KTimerEditor::KTimerEditor( bool newone, QStringList &chanList, RecTimer t, QWidget *parent ) : QDialog( parent )
+{
+ int i;
+
+ QGridLayout *grid = new QGridLayout( 0, 1, 1, 11, 6 );
+ QLabel *lab = new QLabel( i18n("Name:"), this );
+ grid->addWidget( lab, 0, 0 );
+ nameLe = new QLineEdit( this );
+ grid->addWidget( nameLe, 0, 1 );
+ lab = new QLabel( i18n("Channel:"), this );
+ grid->addWidget( lab, 1, 0 );
+ channelComb = new QComboBox( this );
+ grid->addWidget( channelComb, 1, 1 );
+ lab = new QLabel( i18n("Begin:"), this );
+ grid->addWidget( lab, 2, 0 );
+ begin = new QDateTimeEdit( this );
+ grid->addWidget( begin, 2, 1 );
+ lab = new QLabel( i18n("Duration:"), this );
+ grid->addWidget( lab, 3, 0 );
+ duration = new QTimeEdit( this );
+ grid->addWidget( duration, 3, 1 );
+ lab = new QLabel( i18n("End:"), this );
+ grid->addWidget( lab, 4, 0 );
+ end = new QDateTimeEdit( this );
+ grid->addWidget( end, 4, 1 );
+ repeatBtn = new KPushButton( this );
+ grid->addWidget( repeatBtn, 5, 0 );
+ repeatLab = new QLabel( this );
+ grid->addWidget( repeatLab, 5, 1 );
+
+ QFrame *line = new QFrame( this, "line1" );
+ line->setFrameStyle( QFrame::HLine );
+ line->setFrameShadow( QFrame::Sunken );
+ line->setFrameShape( QFrame::HLine );
+
+ QHBoxLayout *hb = new QHBoxLayout( 0, 0, 6 );
+ cancelBtn = new KPushButton( this );
+ hb->addWidget( cancelBtn );
+ hb->addItem( new QSpacerItem( 20, 20, QSizePolicy::MinimumExpanding, QSizePolicy::Minimum ) );
+ okBtn = new KPushButton( this );
+ okBtn->setDefault( true );
+ hb->addWidget( okBtn );
+
+ QVBoxLayout *vb = new QVBoxLayout( this, 6, 6 );
+ vb->addLayout( grid );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Minimum, QSizePolicy::MinimumExpanding ) );
+ vb->addWidget( line );
+ vb->addLayout( hb );
+
+ timer = t;
+
+
+ //begin->dateEdit()->setOrder( QDateEdit::DMY );
+ channelComb->insertStringList( chanList );
+
+ if ( newone ) {
+ begin->setDateTime( QDateTime::currentDateTime() );
+ duration->setTime( QTime(2,0,0) );
+ }
+ else {
+ nameLe->setText( timer.name );
+ for ( i=0; i<channelComb->count(); i++ ) {
+ if ( channelComb->text(i)==timer.channel ) {
+ channelComb->setCurrentItem(i);
+ break;
+ }
+ }
+ begin->setDateTime( timer.begin );
+ duration->setTime( timer.duration );
+ if ( timer.running ) {
+ nameLe->setEnabled( false );
+ channelComb->setEnabled( false );
+ begin->setEnabled( false );
+ repeatBtn->setEnabled( false );
+ }
+ }
+ switch ( timer.mode ) {
+ case CronTimer::Noone : repeatLab->setText( i18n("None") ); break;
+ case CronTimer::Daily : repeatLab->setText( i18n("Daily") ); break;
+ case CronTimer::Weekly : repeatLab->setText( i18n("Weekly") ); break;
+ case CronTimer::Monthly : repeatLab->setText( i18n("Monthly") ); break;
+ default : repeatLab->setText( i18n("Custom") );
+ }
+
+ KIconLoader *icon = new KIconLoader();
+ cancelBtn->setGuiItem( KStdGuiItem::cancel() );
+ okBtn->setGuiItem( KStdGuiItem::ok() );
+ repeatBtn->setGuiItem( KGuiItem(i18n("Repeat..."), icon->loadIconSet("reload", KIcon::Small) ) );
+
+ setCaption( i18n("Timer Editor") );
+
+ connect( okBtn, SIGNAL(clicked()), this, SLOT(accept()) );
+ connect( cancelBtn, SIGNAL(clicked()), this, SLOT(reject()) );
+ connect( repeatBtn, SIGNAL(clicked()), this, SLOT(setRepeat()) );
+ connect( begin, SIGNAL(valueChanged(const QDateTime&)), this, SLOT(setMaxEnd(const QDateTime&)) );
+ connect( end, SIGNAL(valueChanged(const QDateTime&)), this, SLOT(setDuration(const QDateTime&)) );
+ connect( duration, SIGNAL(valueChanged(const QTime&)), this, SLOT(setEnd(const QTime&)) );
+ setMaxEnd( begin->dateTime() );
+ delete icon;
+}
+
+
+
+void KTimerEditor::setMaxEnd( const QDateTime &dt )
+{
+ QDateTime max = dt.addSecs( 23*3600+59*60+59 );
+ end->dateEdit()->setMinValue( dt.date() );
+ end->dateEdit()->setMaxValue( max.date() );
+ setEnd( duration->time() );
+}
+
+
+
+void KTimerEditor::setDuration( const QDateTime &dt )
+{
+ disconnect( duration, SIGNAL(valueChanged(const QTime&)), this, SLOT(setEnd(const QTime&)) );
+ duration->setTime( QTime().addSecs( begin->dateTime().secsTo( dt ) ) );
+ connect( duration, SIGNAL(valueChanged(const QTime&)), this, SLOT(setEnd(const QTime&)) );
+}
+
+
+
+void KTimerEditor::setEnd( const QTime &t )
+{
+ disconnect( end, SIGNAL(valueChanged(const QDateTime&)), this, SLOT(setDuration(const QDateTime&)) );
+ end->setDateTime( begin->dateTime().addSecs( QTime().secsTo( t ) ) );
+ connect( end, SIGNAL(valueChanged(const QDateTime&)), this, SLOT(setDuration(const QDateTime&)) );
+}
+
+
+
+void KTimerEditor::setRepeat()
+{
+ CronTimer dlg( timer.mode, this );
+
+ if ( dlg.exec()==CronTimer::Accepted )
+ timer.mode = dlg.getMode();
+ switch ( timer.mode ) {
+ case CronTimer::Noone : repeatLab->setText( i18n("None") ); break;
+ case CronTimer::Daily : repeatLab->setText( i18n("Daily") ); break;
+ case CronTimer::Weekly : repeatLab->setText( i18n("Weekly") ); break;
+ case CronTimer::Monthly : repeatLab->setText( i18n("Monthly") ); break;
+ default : repeatLab->setText( i18n("Custom") );
+ }
+}
+
+
+
+void KTimerEditor::accept()
+{
+ if ( nameLe->text().stripWhiteSpace().isEmpty() ) {
+ KMessageBox::sorry( this, i18n("You must give it a name!") );
+ nameLe->setFocus();
+ return;
+ }
+
+ if ( nameLe->text().stripWhiteSpace().contains("/") )
+ goto stop;
+ if ( nameLe->text().stripWhiteSpace().contains(">") )
+ goto stop;
+ if ( nameLe->text().stripWhiteSpace().contains("<") )
+ goto stop;
+ if ( nameLe->text().stripWhiteSpace().contains("\\") )
+ goto stop;
+ if ( nameLe->text().stripWhiteSpace().contains(":") )
+ goto stop;
+ if ( nameLe->text().stripWhiteSpace().contains("\"") )
+ goto stop;
+ if ( nameLe->text().stripWhiteSpace().contains("|") )
+ goto stop;
+
+ if ( duration->time()<QTime(0,1) ) {
+ KMessageBox::sorry( this, i18n("Duration must be at least 1 minute!") );
+ duration->setFocus();
+ return;
+ }
+
+ timer.duration = duration->time();
+ if ( timer.running )
+ done( Accepted );
+
+ timer.name = nameLe->text().stripWhiteSpace();
+ timer.channel = channelComb->currentText();
+ timer.begin = begin->dateTime();
+ done( Accepted );
+ return;
+
+stop:
+ KMessageBox::sorry( this, i18n("Name must not contain any of the following characters: > < \\ / : \" |") );
+ nameLe->setFocus();
+ return;
+}
+
+
+
+KTimerEditor::~KTimerEditor()
+{
+}
+
+#include "ktimereditor.moc"
diff --git a/kaffeine/src/input/dvb/ktimereditor.h b/kaffeine/src/input/dvb/ktimereditor.h
new file mode 100644
index 0000000..dfe1683
--- /dev/null
+++ b/kaffeine/src/input/dvb/ktimereditor.h
@@ -0,0 +1,67 @@
+/*
+ * ktimereditor.h
+ *
+ * Copyright (C) 2004-2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KTIMEREDITOR_H
+#define KTIMEREDITOR_H
+
+#include <qdialog.h>
+#include <qcombobox.h>
+#include <qlineedit.h>
+#include <qdatetimeedit.h>
+#include <qlabel.h>
+
+#include <kpushbutton.h>
+
+#include "channeldesc.h"
+#include "gdvb.h"
+#include "crontimer.h"
+
+
+
+class KTimerEditor : public QDialog
+{
+ Q_OBJECT
+
+public:
+
+ KTimerEditor( bool newone, QStringList &chanList, RecTimer t, QWidget *parent );
+ ~KTimerEditor();
+
+ KPushButton *okBtn, *cancelBtn, *repeatBtn;
+ QLabel *repeatLab;
+ QLineEdit *nameLe;
+ QComboBox *channelComb;
+ QDateTimeEdit *begin, *end;
+ QTimeEdit *duration;
+ RecTimer timer;
+
+public slots:
+
+ void setRepeat();
+
+protected slots:
+
+ virtual void accept();
+ void setDuration( const QDateTime &dt );
+ void setEnd( const QTime &t );
+ void setMaxEnd( const QDateTime &dt );
+};
+
+#endif /* KTIMEREDITOR_H */
diff --git a/kaffeine/src/input/dvb/lib/Makefile.am b/kaffeine/src/input/dvb/lib/Makefile.am
new file mode 100644
index 0000000..aa4701c
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = libdvbapi libdvben50221 libucsi
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/Makefile.am b/kaffeine/src/input/dvb/lib/libdvbapi/Makefile.am
new file mode 100644
index 0000000..59f288b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/Makefile.am
@@ -0,0 +1,11 @@
+noinst_LTLIBRARIES = libdvbapi.la
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/dvb/lib
+
+libdvbapi_la_SOURCES = diseqc.c \
+ dvbca.c \
+ dvbdemux.c \
+ dvbfe.c \
+ dvbnet.c
+
+CFLAGS = -g -O2 -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -fPIC
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/diseqc.c b/kaffeine/src/input/dvb/lib/libdvbapi/diseqc.c
new file mode 100644
index 0000000..8c8771d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/diseqc.c
@@ -0,0 +1,141 @@
+/*
+ libdvbfe - a DVB frontend library
+
+ Copyright (C) 2005 Manu Abraham <manu@kromtek.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+ This library 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
+ Lesser General Public License for more details.
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <linux/dvb/frontend.h>
+#include "diseqc.h"
+#include <libdvbmisc/dvbmisc.h>
+
+
+int verbose = 1;
+
+int set_22k_tone(int fd, dvbfe_sec_tone_mode_t tone)
+{
+ int ret = 0;
+
+ if (fd > 0) {
+ switch (tone) {
+ case DVBFE_SEC_TONE_OFF:
+ ret = ioctl(fd, FE_SET_TONE, DVBFE_SEC_TONE_OFF);
+ break;
+ case DVBFE_SEC_TONE_ON:
+ ret = ioctl(fd, FE_SET_TONE, DVBFE_SEC_TONE_ON);
+ break;
+ default:
+ print(verbose, ERROR, 1, "Invalid command !");
+ break;
+ }
+ if (ret == -1)
+ print(verbose, ERROR, 1, "IOCTL failed !");
+ } else
+ print(verbose, ERROR, 1, "Device open error !");
+
+ return ret;
+}
+
+int set_tone_data_burst(int fd, dvbfe_sec_mini_cmd_t minicmd)
+{
+ int ret = 0;
+
+ if (fd > 0) {
+ switch (minicmd) {
+ case DVBFE_SEC_MINI_A:
+ ret = ioctl(fd, FE_DISEQC_SEND_BURST, DVBFE_SEC_MINI_A);
+ break;
+ case DVBFE_SEC_MINI_B:
+ ret = ioctl(fd, FE_DISEQC_SEND_BURST, DVBFE_SEC_MINI_B);
+ break;
+ default:
+ print(verbose, ERROR, 1, "Invalid command");
+ break;
+ }
+ if (ret == -1)
+ print(verbose, ERROR, 1, "IOCTL failed");
+ } else
+ print(verbose, ERROR, 1, "Device open error !");
+
+ return ret;
+}
+
+int set_polarization(int fd, dvbfe_sec_voltage_t polarization)
+{
+ int ret = 0;
+
+ if (fd > 0) {
+ switch (polarization) {
+ case DVBFE_SEC_VOLTAGE_13:
+ ret = ioctl(fd, FE_SET_VOLTAGE, DVBFE_SEC_VOLTAGE_13);
+ break;
+ case DVBFE_SEC_VOLTAGE_18:
+ ret = ioctl(fd, FE_SET_VOLTAGE, DVBFE_SEC_VOLTAGE_18);
+ break;
+ default:
+ print(verbose, ERROR, 1, "Invalid command");
+ break;
+ }
+ if (ret == -1)
+ print(verbose, ERROR, 1, "IOCTL failed");
+ } else
+ print(verbose, ERROR, 1, "Device open error !");
+
+ return ret;
+}
+
+int do_diseqc_cmd(int fd, uint8_t cmd, uint8_t address, uint8_t *data)
+{
+ int ret = 0;
+ uint8_t length;
+ struct diseqc_cmd diseqc_message;
+
+ memcpy(&diseqc_message.message[0], &msgtbl->command[1], 6);
+ length = msgtbl->command[0];
+ diseqc_message.length = length;
+
+ /* Set Address */
+ diseqc_message.message[2] = address;
+ switch (length) {
+ case 6:
+ /* Set Data */
+ diseqc_message.message[5] = data[2];
+ case 5:
+ /* Set Data */
+ diseqc_message.message[4] = data[1];
+ case 4:
+ /* Set Data */
+ diseqc_message.message[3] = data[0];
+ case 3:
+ /* Only cmd */
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ if (fd > 0) {
+ ret = ioctl(fd, cmd, &diseqc_message);
+ if (ret == -1)
+ print(verbose, ERROR, 1, "IOCTL failed");
+
+ } else
+ print(verbose, ERROR, 1, "Device open error !");
+
+ return ret;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/diseqc.h b/kaffeine/src/input/dvb/lib/libdvbapi/diseqc.h
new file mode 100644
index 0000000..fc8ffd4
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/diseqc.h
@@ -0,0 +1,171 @@
+/*
+ libdvbfe - a DVB frontend library
+
+ Copyright (C) 2005 Manu Abraham <manu@kromtek.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+ This library 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
+ Lesser General Public License for more details.
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#ifndef DISEQC_H
+#define DISEQC_H
+
+#include <stdlib.h>
+#include <stdint.h>
+
+/* Addresses */
+#define DISEQCxx_MASTER 0x00
+#define SMATV_MASTER 0x10
+#define LNB_MASTER 0x10
+#define SWITCHER_MASTER 0x10
+#define LNB 0x11
+#define LNB_LOOP 0x12
+#define SWITCHER_DC 0x14
+#define SWITCHER_DC_LOOP 0x15
+#define POL_CONTROLLER 0x21
+#define POSITIONER_MASTER 0x30
+#define POSITIONER_POLAR 0x31
+#define POSITIONER_ELEVATION 0x32
+
+/* Commands */
+#define DISEQC_SET_LOW_LO 0
+#define DISEQC10_SET_VERT_POL 1
+#define DISEQC10_SET_SAT_POS_A 2
+#define DISEQC10_SET_SWITCH_OPT_A 3
+#define DISEQC10_SET_HIGH_LO 4
+#define DISEQC10_SET_HORIZ_POL 5
+#define DISEQC10_SET_SAT_POS_B 6
+
+#define DISEQC10_SET_SWITCH_OPT_B 7
+#define DISEQC11_SET_SWITCH1_INP_A 8
+#define DISEQC11_SET_SWITCH2_INP_A 9
+#define DISEQC11_SET_SWITCH3_INP_A 10
+#define DISEQC11_SET_SWITCH4_INP_A 11
+#define DISEQC11_SET_SWITCH1_INP_B 12
+#define DISEQC11_SET_SWITCH2_INP_B 13
+#define DISEQC11_SET_SWITCH3_INP_B 14
+#define DISEQC11_SET_SWITCH4_INP_B 15
+
+#define DISEQCxx_SET_BUS_SLEEP 16
+#define DISEQCxx_SET_BUS_AWAKE 17
+#define DISEQC11_SET_CHAN_FREQ 18
+#define DISEQC11_SET_RCVR_CHAN 19
+#define DISEQC12_SET_MOTOR_HALT 20
+#define DISEQC12_SET_LIMITS_OFF 21
+#define DISEQC12_SET_LIMITS_ON 22
+#define DISEQC22_GET_MOTOR_STATE 23
+#define DISEQC12_SET_MOTOR_WEST 24
+#define DISEQC12_SET_MOTOR_EAST 25
+#define DISEQC12_SET_WEST_LIMIT 26
+#define DISEQC12_SET_EAST_LIMIT 27
+#define DISEQC12_STEP_MOTOR_UP 28 //???????
+#define DISEQC12_STEP_MOTOR_DOWN 29
+
+struct diseqc_cmd {
+ uint8_t message[6];
+ uint8_t length;
+};
+
+struct cmd_types {
+ uint8_t command[7];
+ char *cmd_descr;
+};
+
+typedef enum dvbfe_sec_voltage {
+ DVBFE_SEC_VOLTAGE_13,
+ DVBFE_SEC_VOLTAGE_18,
+ DVBFE_SEC_VOLTAGE_OFF
+} dvbfe_sec_voltage_t;
+
+typedef enum dvbfe_sec_tone_mode {
+ DVBFE_SEC_TONE_ON,
+ DVBFE_SEC_TONE_OFF
+} dvbfe_sec_tone_mode_t;
+
+typedef enum dvbfe_sec_mini_cmd {
+ DVBFE_SEC_MINI_A,
+ DVBFE_SEC_MINI_B
+} dvbfe_sec_mini_cmd_t;
+
+
+struct cmd_types msgtbl[] = {
+
+ { { 0x03, 0xe0, 0x00, 0x20, 0x00, 0x00, 0x00 }, "DISEQC_SET_LOW_LO" },
+ { { 0x03, 0xe0, 0x00, 0x21, 0x00, 0x00, 0x00 }, "DISEQC10_SET_VERT_POL" },
+ { { 0x03, 0xe0, 0x00, 0x22, 0x00, 0x00, 0x00 }, "DISEQC10_SET_SAT_POS_A" },
+ { { 0x03, 0xe0, 0x00, 0x23, 0x00, 0x00, 0x00 }, "DISEQC10_SET_SWITCH_OPT_A" },
+ { { 0x03, 0xe0, 0x00, 0x24, 0x00, 0x00, 0x00 }, "DISEQC10_SET_HIGH_LO" },
+ { { 0x03, 0xe0, 0x00, 0x25, 0x00, 0x00, 0x00 }, "DISEQC10_SET_HORIZ_POL" },
+ { { 0x03, 0xe0, 0x00, 0x26, 0x00, 0x00, 0x00 }, "DISEQC10_SET_SAT_POS_B" },
+
+ { { 0x03, 0xe0, 0x00, 0x27, 0x00, 0x00, 0x00 }, "DISEQC10_SET_SWITCH_OPT_B" },
+ { { 0x03, 0xe0, 0x00, 0x28, 0x00, 0x00, 0x00 }, "DISEQC11_SET_SWITCH1_INP_A" },
+ { { 0x03, 0xe0, 0x00, 0x29, 0x00, 0x00, 0x00 }, "DISEQC11_SET_SWITCH2_INP_A" },
+ { { 0x03, 0xe0, 0x00, 0x2a, 0x00, 0x00, 0x00 }, "DISEQC11_SET_SWITCH3_INP_A" },
+ { { 0x03, 0xe0, 0x00, 0x2b, 0x00, 0x00, 0x00 }, "DISEQC11_SET_SWITCH4_INP_A" },
+ { { 0x03, 0xe0, 0x00, 0x2c, 0x00, 0x00, 0x00 }, "DISEQC11_SET_SWITCH1_INP_B" },
+ { { 0x03, 0xe0, 0x00, 0x2d, 0x00, 0x00, 0x00 }, "DISEQC11_SET_SWITCH2_INP_B" },
+ { { 0x03, 0xe0, 0x00, 0x2e, 0x00, 0x00, 0x00 }, "DISEQC11_SET_SWITCH3_INP_B" },
+ { { 0x03, 0xe0, 0x00, 0x2f, 0x00, 0x00, 0x00 }, "DISEQC11_SET_SWITCH4_INP_B" },
+
+ { { 0x03, 0xe0, 0x00, 0x30, 0x00, 0x00, 0x00 }, "DISEQCxx_SET_BUS_SLEEP" },
+ { { 0x03, 0xe0, 0x00, 0x31, 0x00, 0x00, 0x00 }, "DISEQCxx_SET_BUS_AWAKE" },
+ { { 0x06, 0x0e, 0x00, 0x05, 0x80, 0x00, 0x00 }, "DISEQC11_SET_CHAN_FREQ" },
+ { { 0x05, 0xe0, 0x00, 0x59, 0x00, 0x00, 0x00 }, "DISEQC11_SET_RCVR_CHAN" },
+
+ { { 0x03, 0xe0, 0x00, 0x60, 0x00, 0x00, 0x00 }, "DISEQC12_SET_MOTOR_HALT" },
+ { { 0x03, 0xe0, 0x00, 0x63, 0x00, 0x00, 0x00 }, "DISEQC12_SET_LIMITS_OFF" },
+ { { 0x04, 0xe0, 0x00, 0x6a, 0x00, 0x00, 0x00 }, "DISEQC12_SET_LIMITS_ON" },
+ { { 0x03, 0xe0, 0x00, 0x64, 0x00, 0x00, 0x00 }, "DISEQC22_GET_MOTOR_STATE" } ,
+ { { 0x04, 0xe1, 0x00, 0x69, 0x00, 0x00, 0x00 }, "DISEQC12_SET_MOTOR_WEST" },
+ { { 0x04, 0xe1, 0x00, 0x68, 0x00, 0x00, 0x00 }, "DISEQC12_SET_MOTOR_EAST" },
+ { { 0x03, 0xe1, 0x00, 0x67, 0x00, 0x00, 0x00 }, "DISEQC12_SET_WEST_LIMIT" },
+ { { 0x03, 0xe1, 0x00, 0x66, 0x00, 0x00, 0x00 }, "DISEQC12_SET_EAST_LIMIT" },
+ { { 0x04, 0xe2, 0x00, 0x68, 0x00, 0x00, 0x00 }, "DISEQC12_STEP_MOTOR_UP" },
+ { { 0x04, 0xe2, 0x00, 0x69, 0x00, 0x00, 0x00 }, "DISEQC12_STEP_MOTOR_DOWN"},
+
+ { {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, NULL }
+};
+
+
+/*
+ * Tone/Data Burst control
+ * @param fd, FD opened with libdvbfe_open().
+ * @param tone, SEC_TONE_ON/SEC_TONE_OFF
+ */
+extern int set_22k_tone(int fd, dvbfe_sec_tone_mode_t tone);
+
+/*
+ * 22khz Tone control
+ * @param fd, FD opened with libdvbfe_open().
+ * @param adapter, minicmd, SEC_MINI_A/SEC_MINI_B
+ */
+extern int set_tone_data_burst(int fd, dvbfe_sec_mini_cmd_t minicmd);
+
+/*
+ * H/V polarization control
+ * @param fd, FD opened with libdvbfe_open().
+ * @param polarization, SEC_VOLTAGE_13/SEC_VOLTAGE_18/SEC_VOLTAGE_OFF
+ */
+extern int set_polarization(int fd, dvbfe_sec_voltage_t polarization);
+
+/*
+ * Send a DiSEqC Command
+ * @param fd, FD opened with libdvbfe_open().
+ * @param cmd, the defined diseqc commands
+ * @param address, the address of the DiSEqC device to be controlled
+ * @param data, a pointer to am array containing the data to be sent
+ * max. length of data, that can be sent is 3 bytes
+ */
+extern int do_diseqc_command(int fd, uint8_t cmd, uint8_t address, uint8_t *data);
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/dvbca.c b/kaffeine/src/input/dvb/lib/libdvbapi/dvbca.c
new file mode 100644
index 0000000..8261cd2
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/dvbca.c
@@ -0,0 +1,159 @@
+/*
+ * libdvbca - interface onto raw CA devices
+ *
+ * Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <errno.h>
+#include <linux/dvb/ca.h>
+#include "dvbca.h"
+
+
+int dvbca_open(int adapter, int cadevice)
+{
+ char filename[PATH_MAX+1];
+ int fd;
+
+ sprintf(filename, "/dev/dvb/adapter%i/ca%i", adapter, cadevice);
+ if ((fd = open(filename, O_RDWR)) < 0) {
+ // if that failed, try a flat /dev structure
+ sprintf(filename, "/dev/dvb%i.ca%i", adapter, cadevice);
+ fd = open(filename, O_RDWR);
+ }
+
+ return fd;
+}
+
+int dvbca_reset(int fd, uint8_t slot)
+{
+ return ioctl(fd, CA_RESET, (1 << slot));
+}
+
+int dvbca_get_interface_type(int fd, uint8_t slot)
+{
+ ca_slot_info_t info;
+
+ info.num = slot;
+ if (ioctl(fd, CA_GET_SLOT_INFO, &info))
+ return -1;
+
+ if (info.type & CA_CI_LINK)
+ return DVBCA_INTERFACE_LINK;
+ if (info.type & CA_CI)
+ return DVBCA_INTERFACE_HLCI;
+
+ return -1;
+}
+
+int dvbca_get_cam_state(int fd, uint8_t slot)
+{
+ ca_slot_info_t info;
+
+ info.num = slot;
+ if (ioctl(fd, CA_GET_SLOT_INFO, &info))
+ return -1;
+
+ if (info.flags == 0)
+ return DVBCA_CAMSTATE_MISSING;
+ if (info.flags & CA_CI_MODULE_READY)
+ return DVBCA_CAMSTATE_READY;
+ if (info.flags & CA_CI_MODULE_PRESENT)
+ return DVBCA_CAMSTATE_INITIALISING;
+
+ return -1;
+}
+
+int dvbca_link_write(int fd, uint8_t slot, uint8_t connection_id,
+ uint8_t *data, uint16_t data_length)
+{
+ uint8_t *buf = malloc(data_length + 2);
+ if (buf == NULL)
+ return -1;
+
+ buf[0] = slot;
+ buf[1] = connection_id;
+ memcpy(buf+2, data, data_length);
+
+ int result = write(fd, buf, data_length+2);
+ free(buf);
+ return result;
+}
+
+int dvbca_link_read(int fd, uint8_t *slot, uint8_t *connection_id,
+ uint8_t *data, uint16_t data_length)
+{
+ int size;
+
+ uint8_t *buf = malloc(data_length + 2);
+ if (buf == NULL)
+ return -1;
+
+ if ((size = read(fd, buf, data_length+2)) < 2)
+ return -1;
+
+ *slot = buf[0];
+ *connection_id = buf[1];
+ memcpy(data, buf+2, size-2);
+ free(buf);
+
+ return size - 2;
+}
+
+int dvbca_hlci_write(int fd, uint8_t *data, uint16_t data_length)
+{
+ struct ca_msg msg;
+
+ if (data_length > 256) {
+ return -1;
+ }
+ memset(&msg, 0, sizeof(msg));
+ msg.length = data_length;
+
+ memcpy(msg.msg, data, data_length);
+
+ return ioctl(fd, CA_SEND_MSG, &msg);
+}
+
+int dvbca_hlci_read(int fd, uint32_t app_tag, uint8_t *data,
+ uint16_t data_length)
+{
+ struct ca_msg msg;
+
+ if (data_length > 256) {
+ data_length = 256;
+ }
+ memset(&msg, 0, sizeof(msg));
+ msg.length = data_length;
+ msg.msg[0] = app_tag >> 16;
+ msg.msg[1] = app_tag >> 8;
+ msg.msg[2] = app_tag;
+
+ int status = ioctl(fd, CA_GET_MSG, &msg);
+ if (status < 0) return status;
+
+ if (msg.length > data_length) msg.length = data_length;
+ memcpy(data, msg.msg, msg.length);
+ return msg.length;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/dvbca.h b/kaffeine/src/input/dvb/lib/libdvbapi/dvbca.h
new file mode 100644
index 0000000..c65423b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/dvbca.h
@@ -0,0 +1,135 @@
+/*
+ * libdvbca - interface onto raw CA devices
+ *
+ * Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef LIBDVBCA_H
+#define LIBDVBCA_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+
+/**
+ * The types of CA interface we support.
+ */
+#define DVBCA_INTERFACE_LINK 0
+#define DVBCA_INTERFACE_HLCI 1
+
+/**
+ * States a CAM in a slot can be in.
+ */
+#define DVBCA_CAMSTATE_MISSING 0
+#define DVBCA_CAMSTATE_INITIALISING 1
+#define DVBCA_CAMSTATE_READY 2
+
+
+/**
+ * Open a CA device. Multiple CAMs can be accessed through a CA device.
+ *
+ * @param adapter Index of the DVB adapter.
+ * @param cadevice Index of the CA device on that adapter (usually 0).
+ * @return A unix file descriptor on success, or -1 on failure.
+ */
+extern int dvbca_open(int adapter, int cadevice);
+
+/**
+ * Reset a CAM.
+ *
+ * @param fd File handle opened with dvbca_open.
+ * @param slot Slot where the requested CAM is in.
+ * @return 0 on success, -1 on failure.
+ */
+extern int dvbca_reset(int fd, uint8_t slot);
+
+/**
+ * Get the interface type of a CAM.
+ *
+ * @param fd File handle opened with dvbca_open.
+ * @param slot Slot where the requested CAM is in.
+ * @return One of the DVBCA_INTERFACE_* values, or -1 on failure.
+ */
+extern int dvbca_get_interface_type(int fd, uint8_t slot);
+
+/**
+ * Get the state of a CAM.
+ *
+ * @param fd File handle opened with dvbca_open.
+ * @param slot Slot where the requested CAM is in.
+ * @return One of the DVBCA_CAMSTATE_* values, or -1 on failure.
+ */
+extern int dvbca_get_cam_state(int fd, uint8_t slot);
+
+/**
+ * Write a message to a CAM using a link-layer interface.
+ *
+ * @param fd File handle opened with dvbca_open.
+ * @param slot Slot where the requested CAM is in.
+ * @param connection_id Connection ID of the message.
+ * @param data Data to write.
+ * @param data_length Number of bytes to write.
+ * @return 0 on success, or -1 on failure.
+ */
+extern int dvbca_link_write(int fd, uint8_t slot, uint8_t connection_id,
+ uint8_t *data, uint16_t data_length);
+
+/**
+ * Read a message from a CAM using a link-layer interface.
+ *
+ * @param fd File handle opened with dvbca_open.
+ * @param slot Slot where the responding CAM is in.
+ * @param connection_id Destination for the connection ID the message came from.
+ * @param data Data that was read.
+ * @param data_length Max number of bytes to read.
+ * @return Number of bytes read on success, or -1 on failure.
+ */
+extern int dvbca_link_read(int fd, uint8_t *slot, uint8_t *connection_id,
+ uint8_t *data, uint16_t data_length);
+
+// FIXME how do we determine which CAM slot of a CA is meant?
+/**
+ * Write a message to a CAM using an HLCI interface.
+ *
+ * @param fd File handle opened with dvbca_open.
+ * @param data Data to write.
+ * @param data_length Number of bytes to write.
+ * @return 0 on success, or -1 on failure.
+ */
+extern int dvbca_hlci_write(int fd, uint8_t *data, uint16_t data_length);
+
+// FIXME how do we determine which CAM slot of a CA is meant?
+/**
+ * Read a message from a CAM using an HLCI interface.
+ *
+ * @param fd File handle opened with dvbca_open.
+ * @param app_tag Application layer tag giving the message type to read.
+ * @param data Data that was read.
+ * @param data_length Max number of bytes to read.
+ * @return Number of bytes read on success, or -1 on failure.
+ */
+extern int dvbca_hlci_read(int fd, uint32_t app_tag, uint8_t *data,
+ uint16_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // LIBDVBCA_H
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/dvbdemux.c b/kaffeine/src/input/dvb/lib/libdvbapi/dvbdemux.c
new file mode 100644
index 0000000..aebad34
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/dvbdemux.c
@@ -0,0 +1,243 @@
+/*
+ * libdvbdemux - a DVB demux library
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <errno.h>
+#include <linux/dvb/dmx.h>
+#include "dvbdemux.h"
+
+
+int dvbdemux_open_demux(int adapter, int demuxdevice, int nonblocking)
+{
+ char filename[PATH_MAX+1];
+ int flags = O_RDWR;
+ int fd;
+
+ if (nonblocking)
+ flags |= O_NONBLOCK;
+
+ sprintf(filename, "/dev/dvb/adapter%i/demux%i", adapter, demuxdevice);
+ if ((fd = open(filename, flags)) < 0) {
+ // if that failed, try a flat /dev structure
+ sprintf(filename, "/dev/dvb%i.demux%i", adapter, demuxdevice);
+ fd = open(filename, flags);
+ }
+
+ return fd;
+}
+
+int dvbdemux_open_dvr(int adapter, int dvrdevice, int readonly, int nonblocking)
+{
+ char filename[PATH_MAX+1];
+ int flags = O_RDWR;
+ int fd;
+
+ if (readonly)
+ flags = O_RDONLY;
+ if (nonblocking)
+ flags |= O_NONBLOCK;
+
+ sprintf(filename, "/dev/dvb/adapter%i/dvr%i", adapter, dvrdevice);
+ if ((fd = open(filename, flags)) < 0) {
+ // if that failed, try a flat /dev structure
+ sprintf(filename, "/dev/dvb%i.dvr%i", adapter, dvrdevice);
+ fd = open(filename, flags);
+ }
+
+ return fd;
+}
+
+int dvbdemux_set_section_filter(int fd, int pid,
+ uint8_t filter[18], uint8_t mask[18],
+ int start, int checkcrc)
+{
+ struct dmx_sct_filter_params sctfilter;
+
+ memset(&sctfilter, 0, sizeof(sctfilter));
+ sctfilter.pid = pid;
+ memcpy(sctfilter.filter.filter, filter, 1);
+ memcpy(sctfilter.filter.filter+1, filter+3, 15);
+ memcpy(sctfilter.filter.mask, mask, 1);
+ memcpy(sctfilter.filter.mask+1, mask+3, 15);
+ memset(sctfilter.filter.mode, 0, 16);
+ if (start)
+ sctfilter.flags |= DMX_IMMEDIATE_START;
+ if (checkcrc)
+ sctfilter.flags |= DMX_CHECK_CRC;
+
+ return ioctl(fd, DMX_SET_FILTER, &sctfilter);
+}
+
+int dvbdemux_set_pes_filter(int fd, int pid,
+ int input, int output,
+ int pestype,
+ int start)
+{
+ struct dmx_pes_filter_params filter;
+
+ memset(&filter, 0, sizeof(filter));
+ filter.pid = pid;
+
+ switch(input) {
+ case DVBDEMUX_INPUT_FRONTEND:
+ filter.input = DMX_IN_FRONTEND;
+ break;
+
+ case DVBDEMUX_INPUT_DVR:
+ filter.input = DMX_IN_DVR;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ switch(output) {
+ case DVBDEMUX_OUTPUT_DECODER:
+ filter.output = DMX_OUT_DECODER;
+ break;
+
+ case DVBDEMUX_OUTPUT_DEMUX:
+ filter.output = DMX_OUT_TAP;
+ break;
+
+ case DVBDEMUX_OUTPUT_DVR:
+ filter.output = DMX_OUT_TS_TAP;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ switch(pestype) {
+ case DVBDEMUX_PESTYPE_AUDIO:
+ filter.pes_type = DMX_PES_AUDIO;
+ break;
+
+ case DVBDEMUX_PESTYPE_VIDEO:
+ filter.pes_type = DMX_PES_VIDEO;
+ break;
+
+ case DVBDEMUX_PESTYPE_TELETEXT:
+ filter.pes_type = DMX_PES_TELETEXT;
+ break;
+
+ case DVBDEMUX_PESTYPE_SUBTITLE:
+ filter.pes_type = DMX_PES_SUBTITLE;
+ break;
+
+ case DVBDEMUX_PESTYPE_PCR:
+ filter.pes_type = DMX_PES_PCR;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ if (start)
+ filter.flags |= DMX_IMMEDIATE_START;
+
+ return ioctl(fd, DMX_SET_PES_FILTER, &filter);
+}
+
+int dvbdemux_set_pid_filter(int fd, int pid,
+ int input, int output,
+ int start)
+{
+ struct dmx_pes_filter_params filter;
+
+ memset(&filter, 0, sizeof(filter));
+ if (pid == -1)
+ filter.pid = 0x2000;
+ else
+ filter.pid = pid;
+
+ switch(input) {
+ case DVBDEMUX_INPUT_FRONTEND:
+ filter.input = DMX_IN_FRONTEND;
+ break;
+
+ case DVBDEMUX_INPUT_DVR:
+ filter.input = DMX_IN_DVR;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ switch(output) {
+ case DVBDEMUX_OUTPUT_DECODER:
+ filter.output = DMX_OUT_DECODER;
+ break;
+
+ case DVBDEMUX_OUTPUT_DEMUX:
+ filter.output = DMX_OUT_TAP;
+ break;
+
+ case DVBDEMUX_OUTPUT_DVR:
+ filter.output = DMX_OUT_TS_TAP;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ filter.pes_type = DMX_PES_OTHER;
+
+ if (start)
+ filter.flags |= DMX_IMMEDIATE_START;
+
+ return ioctl(fd, DMX_SET_PES_FILTER, &filter);
+}
+
+int dvbdemux_start(int fd)
+{
+ return ioctl(fd, DMX_START);
+}
+
+int dvbdemux_stop(int fd)
+{
+ return ioctl(fd, DMX_STOP);
+}
+
+int dvbdemux_get_stc(int fd, uint64_t *stc)
+{
+ struct dmx_stc _stc;
+ int result;
+
+ memset(stc, 0, sizeof(_stc));
+ if ((result = ioctl(fd, DMX_GET_STC, &_stc)) != 0) {
+ return result;
+ }
+
+ *stc = _stc.stc / _stc.base;
+ return 0;
+}
+
+int dvbdemux_set_buffer(int fd, int bufsize)
+{
+ return ioctl(fd, DMX_SET_BUFFER_SIZE, bufsize);
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/dvbdemux.h b/kaffeine/src/input/dvb/lib/libdvbapi/dvbdemux.h
new file mode 100644
index 0000000..3fe4a4b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/dvbdemux.h
@@ -0,0 +1,202 @@
+/*
+ * libdvbdemux - a DVB demux library
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef LIBDVBDEMUX_H
+#define LIBDVBDEMUX_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+
+/**
+ * Source of the data to be demuxed.
+ *
+ * FRONTEND. The data will be read from the frontend on the adapter.
+ *
+ * DVR. The data will be read from the DVR device of the adapter (of course,
+ * you need to write data TO the DVR device as well).
+ */
+#define DVBDEMUX_INPUT_FRONTEND 0
+#define DVBDEMUX_INPUT_DVR 1
+
+/**
+ * Destination of the demuxed data.
+ *
+ * DECODER. Sends the data directly to a hardware decoder (if present).
+ *
+ * DEMUX. Sends the PID stream to the current demux file descriptor. HOWEVER, the
+ * data will be the payload *only* - transport stream headers will be stripped.
+ *
+ * DVR sends the data to the DVR device. The data will be the complete transport
+ * stream packets with headers intact. Note: if multiple filters specify
+ * DVBDEMUX_OUTPUT_DVR, the individual PID streams will be re-multiplexed
+ * together.
+ */
+#define DVBDEMUX_OUTPUT_DECODER 0
+#define DVBDEMUX_OUTPUT_DEMUX 1
+#define DVBDEMUX_OUTPUT_DVR 2
+
+/**
+ * PES types.
+ */
+#define DVBDEMUX_PESTYPE_AUDIO 0
+#define DVBDEMUX_PESTYPE_VIDEO 1
+#define DVBDEMUX_PESTYPE_TELETEXT 2
+#define DVBDEMUX_PESTYPE_SUBTITLE 3
+#define DVBDEMUX_PESTYPE_PCR 4
+
+/**
+ * Open a demux device. Can be called multiple times. These let you setup a
+ * single filter per FD. It can can also be read() from if you use a section
+ * filter, or create a pes_filter or raw_filter with output DVBDEMUX_OUTPUT_DEMUX.
+ *
+ * @param adapter Index of the DVB adapter.
+ * @param demuxdevice Index of the demux device on that adapter (usually 0).
+ * @param nonblocking If 1, frontend will be opened in nonblocking mode.
+ * @return A unix file descriptor on success, or -1 on failure.
+ */
+extern int dvbdemux_open_demux(int adapter, int demuxdevice, int nonblocking);
+
+/**
+ * Open a DVR device. May be opened for writing once, or multiple times in readonly
+ * mode. It is used to either write() transport stream data to be demuxed
+ * (if input == DVBDEMUX_INPUT_DVR), or to read() a stream of demuxed data
+ * (if output == DVBDEMUX_OUTPUT_DVR).
+ *
+ * Note, all demux filters with output set to DVBDEMUX_OUTPUT_DVR will be
+ * multiplexed together and output their data on this device.
+ *
+ * @param adapter Index of the DVB adapter.
+ * @param dvrdevice Index of the dvr device on that adapter (usually 0)
+ * @param readonly If 1, frontend will be opened in readonly mode only.
+ * @param nonblocking If 1, frontend will be opened in nonblocking mode.
+ * @return A unix file descriptor on success, or -1 on failure.
+ */
+extern int dvbdemux_open_dvr(int adapter, int dvrdevice, int readonly, int nonblocking);
+
+/**
+ * Set filter for the first 18 bytes of decoded SI table sections. Note that
+ * bytes 1 and 2 are _not_ filtered since they contain the length field.
+ *
+ * Conceptually, the driver computes the following for each filtered bit.
+ *
+ * (filter[X].bit[Y] & mask[X].bit[Y]) == (header[X].bit[Y] & mask[X].bit[Y])
+ *
+ * Any sections which do not match this criteria for every bit will be discarded.
+ *
+ * The SI data is always read from the frontend, and is always returned by
+ * read()ing the demux fd. FIXME: check this statement!
+ *
+ * @param fd FD as opened with dvbdemux_open_demux() above.
+ * @param pid PID of the stream.
+ * @param filter The filter values of the first 18 bytes of the desired sections.
+ * @param mask Bitmask indicating which bits in the filter array should be tested
+ * (if a bit is 1, it will be tested).
+ * @param start If 1, the filter will be started immediately. Otherwise you must
+ * call dvbdemux_start() manually.
+ * @param checkcrc If 1, the driver will check the CRC on the table sections.
+ * Any bad sections will be dropped.
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbdemux_set_section_filter(int fd, int pid,
+ uint8_t filter[18], uint8_t mask[18],
+ int start, int checkcrc);
+
+/**
+ * Set filter for a stream of PES data. This call can only used for cards
+ * equipped with a hardware decoder.
+ *
+ * @param fd FD as opened with dvbdemux_open_demux() above.
+ * @param pid PID of the stream.
+ * @param input One of DVBDEMUX_INPUT_*.
+ * @param output One of DVBDEMUX_OUTPUT_*.
+ * @param pestype One of DVBDEMUX_PESTYPE_* - this tells the decoder the type
+ * of data in this stream.
+ * @param start If 1, the filter will be started immediately. Otherwise you must
+ * call dvbdemux_start() manually.
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbdemux_set_pes_filter(int fd, int pid,
+ int input, int output,
+ int pestype,
+ int start);
+
+/**
+ * Create a pid filter - this will extract transport stream packets for a
+ * specified PID.
+ *
+ * Note: The wildcard PID can only be used on "budget" cards.
+ *
+ * @param fd FD as opened with dvbdemux_open_demux() above.
+ * @param pid PID to retrieve, or use -1 as a wildcard for ALL PIDs.
+ * @param input One of DVBDEMUX_INPUT_*.
+ * @param output One of DVBDEMUX_OUTPUT_*.
+ * @param start If 1, the filter will be started immediately. Otherwise you must
+ * call dvbdemux_start() manually.
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbdemux_set_pid_filter(int fd, int pid,
+ int input, int output,
+ int start);
+
+/**
+ * Start a demux going.
+ *
+ * @param fd FD as opened with dvbdemux_open_demux() above.
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbdemux_start(int fd);
+
+/**
+ * Stop a demux.
+ *
+ * @param fd FD as opened with dvbdemux_open_demux() above.
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbdemux_stop(int fd);
+
+/**
+ * Retrieve the current STC from the demux. This call can only used for cards
+ * equipped with a hardware decoder.
+ *
+ * @param fd FD as opened with dvbdemux_open_demux() above.
+ * @param stc Where to put the retrieved STC value (in 90kHz clock).
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbdemux_get_stc(int fd, uint64_t *stc);
+
+/**
+ * Change the internal buffer size used by the demuxer. The default buffer size
+ * is 8192 bytes. Can only be used if the demux in question is stopped.
+ *
+ * @param fd FD as opened with dvbdemux_open_demux() above.
+ * @param bufsize New buffer size to use.
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbdemux_set_buffer(int fd, int bufsize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // LIBDVBDEMUX_H
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/dvbfe.c b/kaffeine/src/input/dvb/lib/libdvbapi/dvbfe.c
new file mode 100644
index 0000000..fc6ecf4
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/dvbfe.c
@@ -0,0 +1,760 @@
+/*
+ * libdvbfe - a DVB frontend library
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define _GNU_SOURCE
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include <sys/time.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <errno.h>
+#include <linux/dvb/frontend.h>
+#include "dvbfe.h"
+
+#define GET_INFO_MIN_DELAY_US 100000
+
+static int dvbfe_spectral_inversion_to_kapi[][2] =
+{
+ { DVBFE_INVERSION_OFF, INVERSION_OFF },
+ { DVBFE_INVERSION_ON, INVERSION_ON },
+ { DVBFE_INVERSION_AUTO, INVERSION_AUTO },
+ { -1, -1 }
+};
+
+static int dvbfe_code_rate_to_kapi[][2] =
+{
+ { DVBFE_FEC_NONE, FEC_NONE },
+ { DVBFE_FEC_1_2, FEC_1_2 },
+ { DVBFE_FEC_2_3, FEC_2_3 },
+ { DVBFE_FEC_3_4, FEC_3_4 },
+ { DVBFE_FEC_4_5, FEC_4_5 },
+ { DVBFE_FEC_5_6, FEC_5_6 },
+ { DVBFE_FEC_6_7, FEC_6_7 },
+ { DVBFE_FEC_7_8, FEC_7_8 },
+ { DVBFE_FEC_8_9, FEC_8_9 },
+ { DVBFE_FEC_AUTO, FEC_AUTO },
+ { -1, -1 }
+};
+
+static int dvbfe_dvbt_const_to_kapi[][2] =
+{
+ { DVBFE_DVBT_CONST_QPSK, FE_QPSK },
+ { DVBFE_DVBT_CONST_QAM_16, QAM_16 },
+ { DVBFE_DVBT_CONST_QAM_32, QAM_32 },
+ { DVBFE_DVBT_CONST_QAM_64, QAM_64 },
+ { DVBFE_DVBT_CONST_QAM_128, QAM_128 },
+ { DVBFE_DVBT_CONST_QAM_256, QAM_256 },
+ { DVBFE_DVBT_CONST_AUTO, QAM_AUTO },
+ { -1, -1 }
+};
+
+static int dvbfe_dvbc_mod_to_kapi[][2] =
+{
+ { DVBFE_DVBC_MOD_QAM_16, QAM_16 },
+ { DVBFE_DVBC_MOD_QAM_32, QAM_32 },
+ { DVBFE_DVBC_MOD_QAM_64, QAM_64 },
+ { DVBFE_DVBC_MOD_QAM_128, QAM_128 },
+ { DVBFE_DVBC_MOD_QAM_256, QAM_256 },
+ { DVBFE_DVBC_MOD_AUTO, QAM_AUTO },
+ { -1, -1 }
+};
+
+static int dvbfe_atsc_mod_to_kapi[][2] =
+{
+ { DVBFE_ATSC_MOD_QAM_64, QAM_64 },
+ { DVBFE_ATSC_MOD_QAM_256, QAM_256 },
+ { DVBFE_ATSC_MOD_VSB_8, VSB_8 },
+ { DVBFE_ATSC_MOD_VSB_16, VSB_16 },
+ { DVBFE_ATSC_MOD_AUTO, QAM_AUTO },
+ { -1, -1 }
+};
+
+static int dvbfe_dvbt_transmit_mode_to_kapi[][2] =
+{
+ { DVBFE_DVBT_TRANSMISSION_MODE_2K, TRANSMISSION_MODE_2K },
+ { DVBFE_DVBT_TRANSMISSION_MODE_8K, TRANSMISSION_MODE_8K },
+ { DVBFE_DVBT_TRANSMISSION_MODE_AUTO, TRANSMISSION_MODE_AUTO },
+ { -1, -1 }
+};
+
+static int dvbfe_dvbt_bandwidth_to_kapi[][2] =
+{
+ { DVBFE_DVBT_BANDWIDTH_8_MHZ, BANDWIDTH_8_MHZ },
+ { DVBFE_DVBT_BANDWIDTH_7_MHZ, BANDWIDTH_7_MHZ },
+ { DVBFE_DVBT_BANDWIDTH_6_MHZ, BANDWIDTH_6_MHZ },
+ { DVBFE_DVBT_BANDWIDTH_AUTO, BANDWIDTH_AUTO },
+ { -1, -1 }
+};
+
+static int dvbfe_dvbt_guard_interval_to_kapi[][2] =
+{
+ { DVBFE_DVBT_GUARD_INTERVAL_1_32, GUARD_INTERVAL_1_32},
+ { DVBFE_DVBT_GUARD_INTERVAL_1_16, GUARD_INTERVAL_1_16},
+ { DVBFE_DVBT_GUARD_INTERVAL_1_8, GUARD_INTERVAL_1_8},
+ { DVBFE_DVBT_GUARD_INTERVAL_1_4, GUARD_INTERVAL_1_4},
+ { DVBFE_DVBT_GUARD_INTERVAL_AUTO, GUARD_INTERVAL_AUTO},
+ { -1, -1 }
+};
+
+static int dvbfe_dvbt_hierarchy_to_kapi[][2] =
+{
+ { DVBFE_DVBT_HIERARCHY_NONE, HIERARCHY_NONE },
+ { DVBFE_DVBT_HIERARCHY_1, HIERARCHY_1 },
+ { DVBFE_DVBT_HIERARCHY_2, HIERARCHY_2 },
+ { DVBFE_DVBT_HIERARCHY_4, HIERARCHY_4 },
+ { DVBFE_DVBT_HIERARCHY_AUTO, HIERARCHY_AUTO },
+ { -1, -1 }
+};
+
+static int lookupval(int val, int reverse, int table[][2])
+{
+ int i =0;
+
+ while(table[i][0] != -1) {
+ if (!reverse) {
+ if (val == table[i][0]) {
+ return table[i][1];
+ }
+ } else {
+ if (val == table[i][1]) {
+ return table[i][0];
+ }
+ }
+ i++;
+ }
+
+ return -1;
+}
+
+
+struct dvbfe_handle_prv {
+ int fd;
+ dvbfe_type_t type;
+ char *name;
+ struct timeval nextinfotime;
+ struct dvbfe_info cachedinfo;
+ int cachedreturnval;
+};
+
+dvbfe_handle_t dvbfe_open(int adapter, int frontend, int readonly)
+{
+ char filename[PATH_MAX+1];
+ struct dvbfe_handle_prv *fehandle;
+ int fd;
+ struct dvb_frontend_info info;
+
+ // flags
+ int flags = O_RDWR;
+ if (readonly) {
+ flags = O_RDONLY;
+ }
+
+ // open it (try normal /dev structure first)
+ sprintf(filename, "/dev/dvb/adapter%i/frontend%i", adapter, frontend);
+ if ((fd = open(filename, flags)) < 0) {
+ // if that failed, try a flat /dev structure
+ sprintf(filename, "/dev/dvb%i.frontend%i", adapter, frontend);
+ if ((fd = open(filename, flags)) < 0) {
+ return NULL;
+ }
+ }
+
+ // determine fe type
+ if (ioctl(fd, FE_GET_INFO, &info)) {
+ close(fd);
+ return NULL;
+ }
+
+ // setup structure
+ fehandle = (struct dvbfe_handle_prv*) malloc(sizeof(struct dvbfe_handle_prv));
+ memset(fehandle, 0, sizeof(struct dvbfe_handle_prv));
+ fehandle->fd = fd;
+ switch(info.type) {
+ case FE_QPSK:
+ fehandle->type = DVBFE_TYPE_DVBS;
+ break;
+
+ case FE_QAM:
+ fehandle->type = DVBFE_TYPE_DVBC;
+ break;
+
+ case FE_OFDM:
+ fehandle->type = DVBFE_TYPE_DVBT;
+ break;
+
+ case FE_ATSC:
+ fehandle->type = DVBFE_TYPE_ATSC;
+ break;
+ }
+ fehandle->name = strndup(info.name, sizeof(info.name));
+
+ // done
+ return fehandle;
+}
+
+void dvbfe_close(dvbfe_handle_t _fehandle)
+{
+ struct dvbfe_handle_prv *fehandle = (struct dvbfe_handle_prv*) _fehandle;
+
+ close(fehandle->fd);
+ free(fehandle->name);
+ free(fehandle);
+}
+
+int dvbfe_get_info(dvbfe_handle_t _fehandle, dvbfe_info_mask_t querymask, struct dvbfe_info *result)
+{
+ int returnval = 0;
+ fe_status_t status;
+ struct dvb_frontend_parameters kparams;
+ struct dvbfe_handle_prv *fehandle = (struct dvbfe_handle_prv*) _fehandle;
+ struct timeval curtime;
+
+ // limit how often this is called to reduce bus traffic
+ gettimeofday(&curtime, NULL);
+ if ((curtime.tv_sec < fehandle->nextinfotime.tv_sec) ||
+ ((curtime.tv_sec == fehandle->nextinfotime.tv_sec) && (curtime.tv_usec < fehandle->nextinfotime.tv_usec))) {
+ memcpy(result, &fehandle->cachedinfo, sizeof(struct dvbfe_info));
+ return fehandle->cachedreturnval;
+ }
+
+ // retrieve the requested values
+ memset(result, 0, sizeof(result));
+ result->type = fehandle->type;
+ result->name = fehandle->name;
+ if (querymask & DVBFE_INFO_LOCKSTATUS) {
+ if (!ioctl(fehandle->fd, FE_READ_STATUS, &status)) {
+ returnval |= DVBFE_INFO_LOCKSTATUS;
+ if (status & FE_HAS_SIGNAL)
+ result->signal = 1;
+
+ if (status & FE_HAS_CARRIER)
+ result->carrier = 1;
+
+ if (status & FE_HAS_VITERBI)
+ result->viterbi = 1;
+
+ if (status & FE_HAS_SYNC)
+ result->sync = 1;
+
+ if (status & FE_HAS_LOCK)
+ result->lock = 1;
+ }
+ }
+ if (querymask & DVBFE_INFO_FEPARAMS) {
+ if (!ioctl(fehandle->fd, FE_GET_FRONTEND, &kparams)) {
+ returnval |= DVBFE_INFO_FEPARAMS;
+ result->feparams.frequency = kparams.frequency;
+ result->feparams.inversion = lookupval(kparams.inversion, 1, dvbfe_spectral_inversion_to_kapi);
+ switch(fehandle->type) {
+ case FE_QPSK:
+ result->feparams.u.dvbs.symbol_rate = kparams.u.qpsk.symbol_rate;
+ result->feparams.u.dvbs.fec_inner =
+ lookupval(kparams.u.qpsk.fec_inner, 1, dvbfe_code_rate_to_kapi);
+ break;
+
+ case FE_QAM:
+ result->feparams.u.dvbc.symbol_rate = kparams.u.qam.symbol_rate;
+ result->feparams.u.dvbc.fec_inner =
+ lookupval(kparams.u.qam.fec_inner, 1, dvbfe_code_rate_to_kapi);
+ result->feparams.u.dvbc.modulation =
+ lookupval(kparams.u.qam.modulation, 1, dvbfe_dvbc_mod_to_kapi);
+ break;
+
+ case FE_OFDM:
+ result->feparams.u.dvbt.bandwidth =
+ lookupval(kparams.u.ofdm.bandwidth, 1, dvbfe_dvbt_bandwidth_to_kapi);
+ result->feparams.u.dvbt.code_rate_HP =
+ lookupval(kparams.u.ofdm.code_rate_HP, 1, dvbfe_code_rate_to_kapi);
+ result->feparams.u.dvbt.code_rate_LP =
+ lookupval(kparams.u.ofdm.code_rate_LP, 1, dvbfe_code_rate_to_kapi);
+ result->feparams.u.dvbt.constellation =
+ lookupval(kparams.u.ofdm.constellation, 1, dvbfe_dvbt_const_to_kapi);
+ result->feparams.u.dvbt.transmission_mode =
+ lookupval(kparams.u.ofdm.transmission_mode, 1, dvbfe_dvbt_transmit_mode_to_kapi);
+ result->feparams.u.dvbt.guard_interval =
+ lookupval(kparams.u.ofdm.guard_interval, 1, dvbfe_dvbt_guard_interval_to_kapi);
+ result->feparams.u.dvbt.hierarchy_information =
+ lookupval(kparams.u.ofdm.hierarchy_information, 1, dvbfe_dvbt_hierarchy_to_kapi);
+ break;
+
+ case FE_ATSC:
+ result->feparams.u.atsc.modulation =
+ lookupval(kparams.u.vsb.modulation, 1, dvbfe_atsc_mod_to_kapi);
+ break;
+ }
+ }
+
+ }
+ if (querymask & DVBFE_INFO_BER) {
+ if (!ioctl(fehandle->fd, FE_READ_BER, &result->ber))
+ returnval |= DVBFE_INFO_BER;
+ }
+ if (querymask & DVBFE_INFO_SIGNAL_STRENGTH) {
+ if (!ioctl(fehandle->fd, FE_READ_SIGNAL_STRENGTH, &result->signal_strength))
+ returnval |= DVBFE_INFO_SIGNAL_STRENGTH;
+ }
+ if (querymask & DVBFE_INFO_SNR) {
+ if (!ioctl(fehandle->fd, FE_READ_SNR, &result->snr))
+ returnval |= DVBFE_INFO_SNR;
+ }
+ if (querymask & DVBFE_INFO_UNCORRECTED_BLOCKS) {
+ if (!ioctl(fehandle->fd, FE_READ_UNCORRECTED_BLOCKS, &result->ucblocks))
+ returnval |= DVBFE_INFO_UNCORRECTED_BLOCKS;
+ }
+
+ // setup for next poll
+ gettimeofday(&fehandle->nextinfotime, NULL);
+ fehandle->nextinfotime.tv_usec += GET_INFO_MIN_DELAY_US;
+ if (fehandle->nextinfotime.tv_usec >= 1000000) {
+ fehandle->nextinfotime.tv_usec -= 1000000;
+ fehandle->nextinfotime.tv_sec++;
+ }
+ memcpy(&fehandle->cachedinfo, result, sizeof(struct dvbfe_info));
+ fehandle->cachedreturnval = returnval;
+
+ // done
+ return returnval;
+}
+
+int dvbfe_set(dvbfe_handle_t _fehandle, struct dvbfe_parameters *params, int timeout)
+{
+ struct dvb_frontend_parameters kparams;
+ struct dvbfe_handle_prv *fehandle = (struct dvbfe_handle_prv*) _fehandle;
+ int res;
+ struct timeval endtime;
+ fe_status_t status;
+
+ kparams.frequency = params->frequency;
+ kparams.inversion = lookupval(params->inversion, 0, dvbfe_spectral_inversion_to_kapi);
+ switch(fehandle->type) {
+ case FE_QPSK:
+ kparams.u.qpsk.symbol_rate = params->u.dvbs.symbol_rate;
+ kparams.u.qpsk.fec_inner = lookupval(params->u.dvbs.fec_inner, 0, dvbfe_code_rate_to_kapi);
+ break;
+
+ case FE_QAM:
+ kparams.u.qam.symbol_rate = params->u.dvbc.symbol_rate;
+ kparams.u.qam.fec_inner = lookupval(params->u.dvbc.fec_inner, 0, dvbfe_code_rate_to_kapi);
+ kparams.u.qam.modulation = lookupval(params->u.dvbc.modulation, 0, dvbfe_dvbc_mod_to_kapi);
+ break;
+
+ case FE_OFDM:
+ kparams.u.ofdm.bandwidth = lookupval(params->u.dvbt.bandwidth, 0, dvbfe_dvbt_bandwidth_to_kapi);
+ kparams.u.ofdm.code_rate_HP = lookupval(params->u.dvbt.code_rate_HP, 0, dvbfe_code_rate_to_kapi);
+ kparams.u.ofdm.code_rate_LP = lookupval(params->u.dvbt.code_rate_LP, 0, dvbfe_code_rate_to_kapi);
+ kparams.u.ofdm.constellation = lookupval(params->u.dvbt.constellation, 0, dvbfe_dvbt_const_to_kapi);
+ kparams.u.ofdm.transmission_mode =
+ lookupval(params->u.dvbt.transmission_mode, 0, dvbfe_dvbt_transmit_mode_to_kapi);
+ kparams.u.ofdm.guard_interval =
+ lookupval(params->u.dvbt.guard_interval, 0, dvbfe_dvbt_guard_interval_to_kapi);
+ kparams.u.ofdm.hierarchy_information =
+ lookupval(params->u.dvbt.hierarchy_information, 0, dvbfe_dvbt_hierarchy_to_kapi);
+ break;
+
+ case FE_ATSC:
+ kparams.u.vsb.modulation = lookupval(params->u.atsc.modulation, 0, dvbfe_atsc_mod_to_kapi);
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ // set it and check for error
+ res = ioctl(fehandle->fd, FE_SET_FRONTEND, &kparams);
+ if (res)
+ return res;
+
+ // 0 => return immediately
+ if (timeout == 0) {
+ return 0;
+ }
+
+ /* calculate timeout */
+ if (timeout > 0) {
+ gettimeofday(&endtime, NULL);
+ timeout *= 1000;
+ endtime.tv_sec += timeout / 1000000;
+ endtime.tv_usec += timeout % 1000000;
+ }
+
+ /* wait for a lock */
+ while(1) {
+ /* has it locked? */
+ if (!ioctl(fehandle->fd, FE_READ_STATUS, &status)) {
+ if (status & FE_HAS_LOCK) {
+ break;
+ }
+ }
+
+ /* check for timeout */
+ if (timeout > 0) {
+ struct timeval curtime;
+ gettimeofday(&curtime, NULL);
+ if ((curtime.tv_sec > endtime.tv_sec) ||
+ ((curtime.tv_sec == endtime.tv_sec) && (curtime.tv_usec >= endtime.tv_usec))) {
+ break;
+ }
+ }
+
+ /* delay for a bit */
+ usleep(100000);
+ }
+
+ /* exit */
+ if (status & FE_HAS_LOCK)
+ return 0;
+ return -ETIMEDOUT;
+}
+
+void dvbfe_poll(dvbfe_handle_t fehandle)
+{
+ // no implementation required yet
+}
+
+
+
+
+
+
+
+int dvbfe_diseqc_command(dvbfe_handle_t _fehandle, char *command)
+{
+ int i = 0;
+ int waittime;
+ int status;
+ struct dvb_diseqc_master_cmd master_cmd;
+ unsigned int tmpcmd[6];
+ struct dvbfe_handle_prv *fehandle = (struct dvbfe_handle_prv*) _fehandle;
+ char value_s[20];
+ int value_i;
+ int addr;
+
+ while(command[i]) {
+ /* kill whitespace */
+ if (isspace(command[i])) {
+ i++;
+ continue;
+ }
+
+ switch(command[i]) {
+ case 't':
+ if ((status = ioctl(fehandle->fd, FE_SET_TONE, SEC_TONE_OFF)) != 0)
+ return status;
+ break;
+
+ case 'T':
+ if ((status = ioctl(fehandle->fd, FE_SET_TONE, SEC_TONE_ON)) != 0)
+ return status;
+ break;
+
+ case '_':
+ if ((status = ioctl(fehandle->fd, FE_SET_VOLTAGE, SEC_VOLTAGE_OFF)) != 0)
+ return status;
+ break;
+
+ case 'v':
+ if ((status = ioctl(fehandle->fd, FE_SET_VOLTAGE, SEC_VOLTAGE_13)) != 0)
+ return status;
+ break;
+
+ case 'V':
+ if ((status = ioctl(fehandle->fd, FE_SET_VOLTAGE, SEC_VOLTAGE_18)) != 0)
+ return status;
+ break;
+
+ case 'A':
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_BURST, SEC_MINI_A)) != 0)
+ return status;
+ break;
+
+ case 'B':
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_BURST, SEC_MINI_B)) != 0)
+ return status;
+ break;
+
+ case '+':
+ ioctl(fehandle->fd, FE_ENABLE_HIGH_LNB_VOLTAGE, 1);
+ /* don't care if this one is not supported */
+ break;
+
+ case '-':
+ ioctl(fehandle->fd, FE_ENABLE_HIGH_LNB_VOLTAGE, 0);
+ /* don't care if this one is not supported */
+ break;
+
+ case 'W':
+ waittime = atoi(command + i + 1);
+ if (waittime == 0) {
+ return -EINVAL;
+ }
+ usleep(waittime * 1000);
+ while(command[i] && !isspace(command[i]))
+ i++;
+ break;
+
+ case '.': // extended command
+ {
+ i++;
+
+ if (!strncmp(command+i, "D(", 2)) {
+ i += 2;
+
+ master_cmd.msg_len =
+ sscanf(command+i, "%x %x %x %x %x %x",
+ tmpcmd, tmpcmd+1, tmpcmd+2, tmpcmd+3, tmpcmd+4, tmpcmd+5);
+ if (master_cmd.msg_len == 0)
+ return -EINVAL;
+ master_cmd.msg[0] = tmpcmd[0];
+ master_cmd.msg[1] = tmpcmd[1];
+ master_cmd.msg[2] = tmpcmd[2];
+ master_cmd.msg[3] = tmpcmd[3];
+ master_cmd.msg[4] = tmpcmd[4];
+ master_cmd.msg[5] = tmpcmd[5];
+
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_MASTER_CMD, &master_cmd)) != 0)
+ return status;
+ } else if (!strncmp(command+i, "Dband(", 6)) {
+ if (sscanf(command+i+6, "%i %2s", &addr, value_s) != 2)
+ return -EINVAL;
+ if (!strncmp(value_s, "lo", 2)) {
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x20;
+ master_cmd.msg_len = 3;
+ } else if (!strncmp(value_s, "hi", 2)) {
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x24;
+ master_cmd.msg_len = 3;
+ } else {
+ return -EINVAL;
+ }
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_MASTER_CMD, &master_cmd)) != 0)
+ return status;
+
+ } else if ((!strncmp(command+i, "Dpolarisation(", 14) ||
+ (!strncmp(command+i, "Dpolarization(", 14)))) {
+ if (sscanf(command+i+14, "%i %1s", &addr, value_s) != 2)
+ return -EINVAL;
+ switch(*value_s) {
+ case 'H':
+ case 'L':
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x25;
+ master_cmd.msg_len = 3;
+ break;
+
+ case 'V':
+ case 'R':
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x21;
+ master_cmd.msg_len = 3;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_MASTER_CMD, &master_cmd)) != 0)
+ return status;
+
+ } else if (!strncmp(command+i, "Dsatellite_position(", 20)) {
+ if (sscanf(command+i+20, "%i %1s", &addr, value_s) != 2)
+ return -EINVAL;
+ switch(*value_s) {
+ case 'A':
+ case 'C':
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x22;
+ master_cmd.msg_len = 3;
+ break;
+
+ case 'B':
+ case 'D':
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x26;
+ master_cmd.msg_len = 3;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_MASTER_CMD, &master_cmd)) != 0)
+ return status;
+
+ } else if (!strncmp(command+i, "Dswitch_option(", 15)) {
+ if (sscanf(command+i+15, "%i %1s", &addr, value_s) != 2)
+ return -EINVAL;
+ switch(*value_s) {
+ case 'A':
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x23;
+ master_cmd.msg_len = 3;
+ break;
+
+ case 'B':
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x27;
+ master_cmd.msg_len = 3;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_MASTER_CMD, &master_cmd)) != 0)
+ return status;
+
+ } else if (!strncmp(command+i, "Dport_pins(", 11)) {
+ int mask;
+ if (sscanf(command+i+11, "%i %i %i", &addr, &mask, &value_i) != 3)
+ return -EINVAL;
+
+ if (mask & 0x0f) {
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x38;
+ master_cmd.msg[3] = ((mask & 0x0f) << 4) | (value_i & 0x0f);
+ master_cmd.msg_len = 4;
+
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_MASTER_CMD, &master_cmd)) != 0)
+ return status;
+ }
+ if (mask & 0xf0) {
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x39;
+ master_cmd.msg[3] = (mask & 0xf0) | ((value_i & 0xf0) >> 4);
+ master_cmd.msg_len = 4;
+
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_MASTER_CMD, &master_cmd)) != 0)
+ return status;
+ }
+
+ } else if (!strncmp(command+i, "Dgoto_preset(", 13)) {
+ if (sscanf(command+i+13, "%i %i", &addr, &value_i) != 2)
+ return -EINVAL;
+
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x3b;
+ master_cmd.msg[3] = value_i;
+ master_cmd.msg_len = 4;
+
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_MASTER_CMD, &master_cmd)) != 0)
+ return status;
+
+ } else if (!strncmp(command+i, "Dgoto_angle(", 12)) {
+ int integer = 0;
+ int fraction = 0;
+ char *tmp;
+
+ if (sscanf(command+i+12, "%i %s", &addr, value_s) != 2)
+ return -EINVAL;
+
+ // parse the integer and fractional parts using fixed point
+ integer = atoi(value_s);
+ tmp = strchr(value_s, '.');
+ if (tmp != NULL) {
+ tmp++;
+ tmp[3] = 0;
+ fraction = ((atoi(tmp) * 16000) / 1000000) & 0xf;
+ }
+
+ // generate the command
+ master_cmd.msg[0] = 0xe0;
+ master_cmd.msg[1] = addr;
+ master_cmd.msg[2] = 0x6e;
+ if (integer < -256) {
+ return -EINVAL;
+ } else if (integer < 0) {
+ integer = -integer;
+ master_cmd.msg[3] = 0xf0;
+ } else if (integer < 256) {
+ master_cmd.msg[3] = 0x00;
+ } else if (integer < 512) {
+ integer -= 256;
+ master_cmd.msg[3] = 0x10;
+ } else {
+ return -EINVAL;
+ }
+ master_cmd.msg[3] |= ((integer / 16) & 0x0f);
+ integer = integer % 16;
+ master_cmd.msg[4] |= ((integer & 0x0f) << 4) | fraction;
+ master_cmd.msg_len = 5;
+
+ if ((status = ioctl(fehandle->fd, FE_DISEQC_SEND_MASTER_CMD, &master_cmd)) != 0)
+ return status;
+
+ } else if (!strncmp(command+i, "dishnetworks(", 13)) {
+ if (sscanf(command+i+13, "%i", tmpcmd) != 1)
+ return -EINVAL;
+
+ if ((status = ioctl(fehandle->fd, FE_DISHNETWORK_SEND_LEGACY_CMD, tmpcmd)) != 0)
+ return status;
+ }
+
+ /* skip to the end... */
+ while(command[i] && (command[i] != ')'))
+ i++;
+ break;
+ }
+
+
+ default:
+ return -EINVAL;
+ }
+
+ i++;
+ }
+
+ return 0;
+}
+
+int dvbfe_diseqc_read(dvbfe_handle_t _fehandle, int timeout, unsigned char *buf, unsigned int len)
+{
+ struct dvb_diseqc_slave_reply reply;
+ int result;
+ struct dvbfe_handle_prv *fehandle = (struct dvbfe_handle_prv*) _fehandle;
+
+ if (len > 4)
+ len = 4;
+
+ reply.timeout = timeout;
+ reply.msg_len = len;
+
+ if ((result = ioctl(fehandle->fd, FE_DISEQC_RECV_SLAVE_REPLY, reply)) != 0)
+ return result;
+
+ if (reply.msg_len < len)
+ len = reply.msg_len;
+ memcpy(buf, reply.msg, len);
+
+ return len;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/dvbfe.h b/kaffeine/src/input/dvb/lib/libdvbapi/dvbfe.h
new file mode 100644
index 0000000..9eb03b7
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/dvbfe.h
@@ -0,0 +1,308 @@
+/*
+ * libdvbfe - a DVB frontend library
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef LIBDVBFE_H
+#define LIBDVBFE_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+
+/**
+ * The types of frontend we support.
+ */
+typedef enum dvbfe_type {
+ DVBFE_TYPE_DVBS,
+ DVBFE_TYPE_DVBC,
+ DVBFE_TYPE_DVBT,
+ DVBFE_TYPE_ATSC,
+} dvbfe_type_t;
+
+typedef enum dvbfe_polarization {
+ DVBFE_POLARIZATION_H,
+ DVBFE_POLARIZATION_V,
+ DVBFE_POLARIZATION_L,
+ DVBFE_POLARIZATION_R,
+} dvbfe_polarization_t;
+
+typedef enum dvbfe_spectral_inversion {
+ DVBFE_INVERSION_OFF,
+ DVBFE_INVERSION_ON,
+ DVBFE_INVERSION_AUTO
+} dvbfe_spectral_inversion_t;
+
+typedef enum dvbfe_code_rate {
+ DVBFE_FEC_NONE,
+ DVBFE_FEC_1_2,
+ DVBFE_FEC_2_3,
+ DVBFE_FEC_3_4,
+ DVBFE_FEC_4_5,
+ DVBFE_FEC_5_6,
+ DVBFE_FEC_6_7,
+ DVBFE_FEC_7_8,
+ DVBFE_FEC_8_9,
+ DVBFE_FEC_AUTO
+} dvbfe_code_rate_t;
+
+typedef enum dvbfe_dvbt_const {
+ DVBFE_DVBT_CONST_QPSK,
+ DVBFE_DVBT_CONST_QAM_16,
+ DVBFE_DVBT_CONST_QAM_32,
+ DVBFE_DVBT_CONST_QAM_64,
+ DVBFE_DVBT_CONST_QAM_128,
+ DVBFE_DVBT_CONST_QAM_256,
+ DVBFE_DVBT_CONST_AUTO
+} dvbfe_dvbt_const_t;
+
+typedef enum dvbfe_dvbc_mod {
+ DVBFE_DVBC_MOD_QAM_16,
+ DVBFE_DVBC_MOD_QAM_32,
+ DVBFE_DVBC_MOD_QAM_64,
+ DVBFE_DVBC_MOD_QAM_128,
+ DVBFE_DVBC_MOD_QAM_256,
+ DVBFE_DVBC_MOD_AUTO,
+} dvbfe_dvbc_mod_t;
+
+typedef enum dvbfe_atsc_mod {
+ DVBFE_ATSC_MOD_QAM_64,
+ DVBFE_ATSC_MOD_QAM_256,
+ DVBFE_ATSC_MOD_VSB_8,
+ DVBFE_ATSC_MOD_VSB_16,
+ DVBFE_ATSC_MOD_AUTO
+} dvbfe_atsc_mod_t;
+
+typedef enum dvbfe_dvbt_transmit_mode {
+ DVBFE_DVBT_TRANSMISSION_MODE_2K,
+ DVBFE_DVBT_TRANSMISSION_MODE_8K,
+ DVBFE_DVBT_TRANSMISSION_MODE_AUTO
+} dvbfe_dvbt_transmit_mode_t;
+
+typedef enum dvbfe_dvbt_bandwidth {
+ DVBFE_DVBT_BANDWIDTH_8_MHZ,
+ DVBFE_DVBT_BANDWIDTH_7_MHZ,
+ DVBFE_DVBT_BANDWIDTH_6_MHZ,
+ DVBFE_DVBT_BANDWIDTH_AUTO
+} dvbfe_dvbt_bandwidth_t;
+
+typedef enum dvbfe_dvbt_guard_interval {
+ DVBFE_DVBT_GUARD_INTERVAL_1_32,
+ DVBFE_DVBT_GUARD_INTERVAL_1_16,
+ DVBFE_DVBT_GUARD_INTERVAL_1_8,
+ DVBFE_DVBT_GUARD_INTERVAL_1_4,
+ DVBFE_DVBT_GUARD_INTERVAL_AUTO
+} dvbfe_dvbt_guard_interval_t;
+
+typedef enum dvbfe_dvbt_hierarchy {
+ DVBFE_DVBT_HIERARCHY_NONE,
+ DVBFE_DVBT_HIERARCHY_1,
+ DVBFE_DVBT_HIERARCHY_2,
+ DVBFE_DVBT_HIERARCHY_4,
+ DVBFE_DVBT_HIERARCHY_AUTO
+} dvbfe_dvbt_hierarchy_t;
+
+/**
+ * Structure used to store and communicate frontend parameters.
+ */
+struct dvbfe_parameters {
+ uint32_t frequency;
+ dvbfe_spectral_inversion_t inversion;
+ union {
+ struct {
+ uint32_t symbol_rate;
+ dvbfe_code_rate_t fec_inner;
+ dvbfe_polarization_t polarization;
+ } dvbs;
+
+ struct {
+ uint32_t symbol_rate;
+ dvbfe_code_rate_t fec_inner;
+ dvbfe_dvbc_mod_t modulation;
+ } dvbc;
+
+ struct {
+ dvbfe_dvbt_bandwidth_t bandwidth;
+ dvbfe_code_rate_t code_rate_HP;
+ dvbfe_code_rate_t code_rate_LP;
+ dvbfe_dvbt_const_t constellation;
+ dvbfe_dvbt_transmit_mode_t transmission_mode;
+ dvbfe_dvbt_guard_interval_t guard_interval;
+ dvbfe_dvbt_hierarchy_t hierarchy_information;
+ } dvbt;
+
+ struct {
+ dvbfe_atsc_mod_t modulation;
+ } atsc;
+ } u;
+};
+
+/**
+ * Mask of values used in the dvbfe_get_info() call.
+ */
+typedef enum dvbfe_info_mask {
+ DVBFE_INFO_LOCKSTATUS = 0x01,
+ DVBFE_INFO_FEPARAMS = 0x02,
+ DVBFE_INFO_BER = 0x04,
+ DVBFE_INFO_SIGNAL_STRENGTH = 0x08,
+ DVBFE_INFO_SNR = 0x10,
+ DVBFE_INFO_UNCORRECTED_BLOCKS = 0x20,
+} dvbfe_info_mask_t;
+
+/**
+ * Structure containing values used by the dvbfe_get_info() call.
+ */
+struct dvbfe_info {
+ dvbfe_type_t type; /* always retrieved */
+ const char *name; /* always retrieved */
+ unsigned int signal : 1; /* } DVBFE_INFO_LOCKSTATUS */
+ unsigned int carrier : 1; /* } */
+ unsigned int viterbi : 1; /* } */
+ unsigned int sync : 1; /* } */
+ unsigned int lock : 1; /* } */
+ struct dvbfe_parameters feparams; /* DVBFE_INFO_FEPARAMS */
+ uint32_t ber; /* DVBFE_INFO_BER */
+ uint16_t signal_strength; /* DVBFE_INFO_SIGNAL_STRENGTH */
+ uint16_t snr; /* DVBFE_INFO_SNR */
+ uint32_t ucblocks; /* DVBFE_INFO_UNCORRECTED_BLOCKS */
+};
+
+/**
+ * Frontend handle datatype.
+ */
+typedef void *dvbfe_handle_t;
+
+/**
+ * Open a DVB frontend.
+ *
+ * @param adapter DVB adapter ID.
+ * @param frontend Frontend ID of that adapter to open.
+ * @param readonly If 1, frontend will be opened in readonly mode only.
+ * @return A handle on success, or NULL on failure.
+ */
+extern dvbfe_handle_t dvbfe_open(int adapter, int frontend, int readonly);
+
+/**
+ * Close a DVB frontend.
+ *
+ * @param fehandle Handle opened with dvbfe_open().
+ */
+extern void dvbfe_close(dvbfe_handle_t handle);
+
+/**
+ * Set the frontend tuning parameters.
+ *
+ * @param fehandle Handle opened with dvbfe_open().
+ * @param params Params to set.
+ * @param timeout <0 => wait forever for lock. 0=>return immediately, >0=>
+ * number of milliseconds to wait for a lock.
+ * @return 0 on locked (or if timeout==0 and everything else worked), or
+ * nonzero on failure (including no lock).
+ */
+extern int dvbfe_set(dvbfe_handle_t fehandle, struct dvbfe_parameters *params, int timeout);
+
+/**
+ * Call this function regularly from a loop to maintain the frontend lock.
+ *
+ * @param fehandle Handle opened with dvbfe_open().
+ */
+extern void dvbfe_poll(dvbfe_handle_t fehandle);
+
+/**
+ * Retrieve information about the frontend.
+ *
+ * @param fehandle Handle opened with dvbfe_open().
+ * @param querymask ORed bitmask of desired DVBFE_INFO_* values.
+ * @param result Where to put the retrieved results.
+ * @return ORed bitmask of DVBFE_INFO_* indicating which values were read successfully.
+ */
+extern int dvbfe_get_info(dvbfe_handle_t fehandle, dvbfe_info_mask_t querymask, struct dvbfe_info *result);
+
+/**
+ * Execute a DISEQC command string.
+ *
+ * A diseqc command consists of a sequence of the following codes, separated by
+ * whitespace:
+ * Simple commands:
+ * t - turn 22kHz tone off.
+ * T - turn 22kHz tone on.
+ * _ - set voltage to 0v (i.e. off).
+ * v - set voltage to 13v.
+ * V - set voltage to 18v.
+ * + - Enable high LNB voltage.
+ * - - Disable high LNB voltage.
+ * A - send DISEQC mini command A.
+ * B - send DISEQC mini command B.
+ * Wii - Delay for ii milliseconds.
+ *
+ * Extended commands:
+ * .dishnetworks(<value>) - Send a dish networks legacy command <value>
+ * .D(<value> ...) - Send a raw diseqc master command. The command may be up
+ * to 6 bytes long.
+ * .Dband(<addr> <lo|hi>) - Set frequency band hi or lo.
+ * .Dpolarisation(<addr> <V|H|L|R>) - Set polarisation.
+ * .Dsatellite_position(<addr> <A|B>) - Set "satellite position" input switch.
+ * .Dswitch_option(<addr> <A|B>) - Set "switch option" input switch.
+ * .Dport_pins(<addr> <mask> <value>) - Set all input switches. Mask and value
+ * are hex-ascii 8 bit bytes. Only bits with a corresponding '1' in mask
+ * will be changed.
+ * .Dgoto_preset(<addr> <index>) - Set a positioner to a preset index (integer)
+ * .Dgoto_angle(<addr> <angle>) - Set a positioner to a given angle
+ * (e.g. 49.6). The angle may range between -180 to 496. It may include a
+ * fractional part.
+ *
+ * All integer values use standard notation - no prefix=>decimal, 0x=>hex etc.
+ *
+ * Set <addr> to 0 if you just have a simple DISEQC setup (e.g. one switch). See
+ * the DISEQC specification at http://www.eutelsat.org/ for full information.
+ *
+ * Comments begin with '#' - any characters after this will be ignored
+ * to the end of the line.
+ *
+ * Examples:
+ * S-19.2E 11700000 V 9750000 t v W15 .D(E0 10 38 F0) W15 A W15 t
+ * S-19.2E 99999999 V 10600000 t v W15 .D(E0 10 38 F1) W15 A W15 T
+ * S-19.2E 11700000 H 9750000 t V W15 .D(E0 10 38 F2) W15 A W15 t
+ * S-19.2E 99999999 H 10600000 t V W15 .D(E0 10 38 F3) W15 A W15 T
+ *
+ * @param fehandle Handle opened with dvbfe_open().
+ * @param command Command to execute.
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbfe_diseqc_command(dvbfe_handle_t fehandle, char *command);
+
+/**
+ * Read a DISEQC response from the frontend.
+ *
+ * @param fehandle Handle opened with dvbfe_open().
+ * @param timeout Timeout for DISEQC response.
+ * @param buf Buffer to store response in.
+ * @param len Number of bytes in buffer.
+ * @return >= 0 on success (number of received bytes), <0 on failure.
+ */
+extern int dvbfe_diseqc_read(dvbfe_handle_t fehandle, int timeout, unsigned char *buf, unsigned int len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // LIBDVBFE_H
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/dvbnet.c b/kaffeine/src/input/dvb/lib/libdvbapi/dvbnet.c
new file mode 100644
index 0000000..d6ee632
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/dvbnet.c
@@ -0,0 +1,99 @@
+/*
+ * libdvbnet - a DVB network support library
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include <sys/param.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/ioctl.h>
+#include <linux/dvb/net.h>
+#include <errno.h>
+#include "dvbnet.h"
+
+int dvbnet_open(int adapter, int netdeviceid)
+{
+ char filename[PATH_MAX+1];
+ int fd;
+
+ sprintf(filename, "/dev/dvb/adapter%i/net%i", adapter, netdeviceid);
+ if ((fd = open(filename, O_RDWR)) < 0) {
+ // if that failed, try a flat /dev structure
+ sprintf(filename, "/dev/dvb%i.net%i", adapter, netdeviceid);
+ fd = open(filename, O_RDWR);
+ }
+
+ return fd;
+}
+
+int dvbnet_add_interface(int fd, uint16_t pid, int encapsulation)
+{
+ struct dvb_net_if params;
+
+ memset(&params, 0, sizeof(params));
+ params.pid = pid;
+
+ switch(encapsulation) {
+ case DVBNET_ENCAP_MPE:
+ params.feedtype = DVB_NET_FEEDTYPE_MPE;
+ break;
+
+ case DVBNET_ENCAP_ULE:
+ params.feedtype = DVB_NET_FEEDTYPE_ULE;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+ return ioctl(fd, NET_ADD_IF, &params);
+}
+
+int dvbnet_get_interface(int fd, int ifnum, uint16_t *pid, int *encapsulation)
+{
+ struct dvb_net_if info;
+ int res;
+
+ memset(&info, 0, sizeof(struct dvb_net_if));
+ info.if_num = ifnum;
+
+ if ((res = ioctl(fd, NET_GET_IF, &info)) < 0)
+ return res;
+
+ *pid = info.pid;
+ switch(info.feedtype) {
+ case DVB_NET_FEEDTYPE_MPE:
+ *encapsulation = DVBNET_ENCAP_MPE;
+ break;
+
+ case DVB_NET_FEEDTYPE_ULE:
+ *encapsulation = DVBNET_ENCAP_ULE;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+ return 0;
+}
+
+int dvbnet_remove_interface(int fd, int ifnum)
+{
+ return ioctl(fd, NET_REMOVE_IF, ifnum);
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvbapi/dvbnet.h b/kaffeine/src/input/dvb/lib/libdvbapi/dvbnet.h
new file mode 100644
index 0000000..426e540
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbapi/dvbnet.h
@@ -0,0 +1,87 @@
+/*
+ * libdvbnet - a DVB network support library
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef LIBDVBNET_H
+#define LIBDVBNET_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+
+/**
+ * Possible encapsulations of data.
+ */
+typedef enum dvbnet_encap {
+ DVBNET_ENCAP_MPE,
+ DVBNET_ENCAP_ULE,
+} dvbnet_encap_t;
+
+/**
+ * The maximum allowed number of dvb network devices per adapter netdevice.
+ */
+#define DVBNET_MAX_INTERFACES 10
+
+/**
+ * Open a DVB net interface.
+ *
+ * @param adapter DVB adapter ID.
+ * @param netdeviceid Network control interface of that adapter to open.
+ * @return A unix file descriptor on success, or -1 on failure.
+ */
+extern int dvbnet_open(int adapter, int netdeviceid);
+
+/**
+ * Create a new DVBNET interface.
+ *
+ * @param fd FD opened with libdvbnet_open().
+ * @param pid PID of the stream containing the network data.
+ * @param encapsulation Encapsulation type of the stream (one of DVBNET_ENCAP_*).
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbnet_add_interface(int fd, uint16_t pid, int encapsulation);
+
+/**
+ * Get details of a DVBNET interface.
+ *
+ * @param fd FD opened with libdvbnet_open().
+ * @param ifnum Index of interface to retrieve.
+ * @param pid The PID of the interface.
+ * @param encapsulation The encapsulation of the interface (DVBNET_ENCAP_*).
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbnet_get_interface(int fd, int ifnum, uint16_t *pid, int *encapsulation);
+
+/**
+ * Remove a DVBNET interface.
+ *
+ * @param fd FD opened with libdvbnet_open().
+ * @param ifnum Index of interface to remove.
+ * @return 0 on success, nonzero on failure.
+ */
+extern int dvbnet_remove_interface(int fd, int ifnum);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // LIBDVBNET_H
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/Makefile.am b/kaffeine/src/input/dvb/lib/libdvben50221/Makefile.am
new file mode 100644
index 0000000..7c9764a
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/Makefile.am
@@ -0,0 +1,21 @@
+noinst_LTLIBRARIES = libdvben50221.la
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/dvb/lib
+
+libdvben50221_la_SOURCES = asn_1.c \
+ en50221_app_ai.c \
+ en50221_app_auth.c \
+ en50221_app_ca.c \
+ en50221_app_datetime.c \
+ en50221_app_dvb.c \
+ en50221_app_epg.c \
+ en50221_app_lowspeed.c \
+ en50221_app_mmi.c \
+ en50221_app_rm.c \
+ en50221_app_smartcard.c \
+ en50221_app_teletext.c \
+ en50221_app_utils.c \
+ en50221_session.c \
+ en50221_transport.c
+
+CFLAGS = -g -O2 -DLOG_LEVEL=1 -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -fPIC
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/asn_1.c b/kaffeine/src/input/dvb/lib/libdvben50221/asn_1.c
new file mode 100644
index 0000000..8cc528f
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/asn_1.c
@@ -0,0 +1,81 @@
+/*
+ ASN.1 routines, implementation for libdvben50221
+ an implementation for the High Level Common Interface
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <stdio.h>
+#include "asn_1.h"
+
+int asn_1_decode(uint16_t *length, uint8_t *asn_1_array, uint32_t asn_1_array_len)
+{
+ uint8_t length_field;
+
+ if (asn_1_array_len < 1)
+ return -1;
+ length_field = asn_1_array[0];
+
+ if (length_field < 0x80) {
+ // there is only one word
+ *length = length_field & 0x7f;
+ return 1;
+ } else if (length_field == 0x81) {
+ if (asn_1_array_len < 2)
+ return -1;
+
+ *length = asn_1_array[1];
+ return 2;
+ } else if (length_field == 0x82) {
+ if (asn_1_array_len < 3)
+ return -1;
+
+ *length = (asn_1_array[1] << 8) | asn_1_array[2];
+ return 3;
+ }
+
+ return -1;
+}
+
+int asn_1_encode(uint16_t length, uint8_t *asn_1_array, uint32_t asn_1_array_len)
+{
+ if (length < 0x80) {
+ if (asn_1_array_len < 1)
+ return -1;
+
+ asn_1_array[0] = length & 0x7f;
+ return 1;
+ } else if (length < 0x100) {
+ if (asn_1_array_len < 2)
+ return -1;
+
+ asn_1_array[0] = 0x81;
+ asn_1_array[1] = length;
+ return 2;
+ } else {
+ if (asn_1_array_len < 3)
+ return -1;
+
+ asn_1_array[0] = 0x82;
+ asn_1_array[1] = length >> 8;
+ asn_1_array[2] = length;
+ return 3;
+ }
+
+ // never reached
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/asn_1.h b/kaffeine/src/input/dvb/lib/libdvben50221/asn_1.h
new file mode 100644
index 0000000..00d636b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/asn_1.h
@@ -0,0 +1,41 @@
+/*
+ ASN.1 routines, implementation for libdvben50221
+ an implementation for the High Level Common Interface
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __ASN_1_H__
+#define __ASN_1_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+
+int asn_1_decode(uint16_t *length, uint8_t *asn_1_array, uint32_t asn_1_array_len);
+int asn_1_encode(uint16_t length, uint8_t *asn_1_array, uint32_t asn_1_array_len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ai.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ai.c
new file mode 100644
index 0000000..6facef0
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ai.c
@@ -0,0 +1,185 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include "en50221_app_ai.h"
+#include "en50221_app_tags.h"
+#include "asn_1.h"
+
+struct en50221_app_ai_private {
+ struct en50221_app_send_functions *funcs;
+
+ en50221_app_ai_callback callback;
+ void *callback_arg;
+
+ pthread_mutex_t lock;
+};
+
+static int en50221_app_ai_parse_app_info(struct en50221_app_ai_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+
+en50221_app_ai en50221_app_ai_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_ai_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_ai_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->callback = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_ai_destroy(en50221_app_ai ai)
+{
+ struct en50221_app_ai_private *private = (struct en50221_app_ai_private *) ai;
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_ai_register_callback(en50221_app_ai ai, en50221_app_ai_callback callback, void *arg)
+{
+ struct en50221_app_ai_private *private = (struct en50221_app_ai_private *) ai;
+
+ pthread_mutex_lock(&private->lock);
+ private->callback = callback;
+ private->callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_ai_enquiry(en50221_app_ai ai, uint16_t session_number)
+{
+ struct en50221_app_ai_private *private = (struct en50221_app_ai_private *) ai;
+ uint8_t data[4];
+
+ data[0] = (TAG_APP_INFO_ENQUIRY >> 16) & 0xFF;
+ data[1] = (TAG_APP_INFO_ENQUIRY >> 8) & 0xFF;
+ data[2] = TAG_APP_INFO_ENQUIRY & 0xFF;
+ data[3] = 0;
+
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 4);
+}
+
+int en50221_app_ai_entermenu(en50221_app_ai ai, uint16_t session_number)
+{
+ struct en50221_app_ai_private *private = (struct en50221_app_ai_private *) ai;
+ uint8_t data[4];
+
+ data[0] = (TAG_ENTER_MENU >> 16) & 0xFF;
+ data[1] = (TAG_ENTER_MENU >> 8) & 0xFF;
+ data[2] = TAG_ENTER_MENU & 0xFF;
+ data[3] = 0;
+
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 4);
+}
+
+int en50221_app_ai_message(en50221_app_ai ai,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_ai_private *private = (struct en50221_app_ai_private *) ai;
+ (void) resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ switch(tag)
+ {
+ case TAG_APP_INFO:
+ return en50221_app_ai_parse_app_info(private, slot_id, session_number, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+
+
+
+
+
+
+static int en50221_app_ai_parse_app_info(struct en50221_app_ai_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // parse the length field
+ int length_field_len;
+ uint16_t asn_data_length;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %02x\n", slot_id);
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length < 6) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (asn_data_length > (data_length - length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t *app_info = data + length_field_len;
+
+ // parse the fields
+ uint8_t application_type = app_info[0];
+ uint16_t application_manufacturer = (app_info[1] << 8) | app_info[2];
+ uint16_t manufacturer_code = (app_info[3] << 8) | app_info[4];
+ uint8_t menu_string_length = app_info[5];
+ uint8_t *menu_string = app_info + 6;
+
+ // check the menu_string_length
+ if (menu_string_length > (asn_data_length-6)) {
+ print(LOG_LEVEL, ERROR, 1, "Received bad menu string length - adjusting\n");
+ menu_string_length = asn_data_length-6;
+ }
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_ai_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, application_type,
+ application_manufacturer, manufacturer_code, menu_string_length, menu_string);
+ }
+ return 0;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ai.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ai.h
new file mode 100644
index 0000000..4def877
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ai.h
@@ -0,0 +1,129 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_AI_H__
+#define __EN50221_APPLICATION_AI_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+
+#define EN50221_APP_AI_RESOURCEID MKRID(2,1,1)
+
+#define APPLICATION_TYPE_CA 0x01
+#define APPLICATION_TYPE_EPG 0x02
+
+/**
+ * Type definition for application callback function - called when we receive
+ * an application info object.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Resource id concerned.
+ * @param application_type Type of application.
+ * @param application_manufacturer Manufacturer of application.
+ * @param manufacturer_code Manufacturer specific code.
+ * @param menu_string_length Length of menu string.
+ * @param menu_string The menu string itself.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_ai_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t application_type, uint16_t application_manufacturer,
+ uint16_t manufacturer_code, uint8_t menu_string_length,
+ uint8_t *menu_string);
+
+/**
+ * Opaque type representing an application information resource.
+ */
+typedef void *en50221_app_ai;
+
+/**
+ * Create an instance of an application information resource.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_ai en50221_app_ai_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of an application information resource.
+ *
+ * @param ai Instance to destroy.
+ */
+extern void en50221_app_ai_destroy(en50221_app_ai ai);
+
+/**
+ * Register a callback for reception of application_info objects.
+ *
+ * @param ai Application information instance.
+ * @param callback Callback function.
+ * @param arg Private argument passed during calls to the callback.
+ */
+extern void en50221_app_ai_register_callback(en50221_app_ai ai, en50221_app_ai_callback, void *arg);
+
+/**
+ * send a enquiry for the app_info provided by a module
+ *
+ * @param ai Application information instance.
+ * @param session_number Session to send on.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_ai_enquiry(en50221_app_ai ai, uint16_t session_number);
+
+/**
+ * send a enter_menu tag, this will make the application
+ * open a new MMI session to provide a Menu, or so.
+ *
+ * @param ai Application information instance.
+ * @param session_number Session to send on.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_ai_entermenu(en50221_app_ai ai, uint16_t session_number);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param ai Application information instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_ai_message(en50221_app_ai ai,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_auth.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_auth.c
new file mode 100644
index 0000000..b062e3e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_auth.c
@@ -0,0 +1,179 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include "en50221_app_auth.h"
+#include "en50221_app_tags.h"
+#include "asn_1.h"
+
+struct en50221_app_auth_private {
+ struct en50221_app_send_functions *funcs;
+
+ en50221_app_auth_request_callback callback;
+ void *callback_arg;
+
+ pthread_mutex_t lock;
+};
+
+static int en50221_app_auth_parse_request(struct en50221_app_auth_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+
+en50221_app_auth en50221_app_auth_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_auth_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_auth_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->callback = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_auth_destroy(en50221_app_auth auth)
+{
+ struct en50221_app_auth_private *private = (struct en50221_app_auth_private *) auth;
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_auth_register_request_callback(en50221_app_auth auth,
+ en50221_app_auth_request_callback callback, void *arg)
+{
+ struct en50221_app_auth_private *private = (struct en50221_app_auth_private *) auth;
+
+ pthread_mutex_lock(&private->lock);
+ private->callback = callback;
+ private->callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_auth_send(en50221_app_auth auth,
+ uint16_t session_number,
+ uint16_t auth_protocol_id, uint8_t *auth_data,
+ uint32_t auth_data_length)
+{
+ struct en50221_app_auth_private *private = (struct en50221_app_auth_private *) auth;
+ uint8_t buf[10];
+
+ // the header
+ buf[0] = (TAG_AUTH_RESP >> 16) & 0xFF;
+ buf[1] = (TAG_AUTH_RESP >> 8) & 0xFF;
+ buf[2] = TAG_AUTH_RESP & 0xFF;
+
+ // encode the length field
+ int length_field_len;
+ if ((length_field_len = asn_1_encode(auth_data_length+2, buf+3, 3)) < 0) {
+ return -1;
+ }
+
+ // the phase_id
+ buf[3+length_field_len] = auth_protocol_id>>8;
+ buf[3+length_field_len+1] = auth_protocol_id;
+
+ // build the iovecs
+ struct iovec iov[2];
+ iov[0].iov_base = buf;
+ iov[0].iov_len = 3+length_field_len+2;
+ iov[1].iov_base = auth_data;
+ iov[1].iov_len = auth_data_length;
+
+ // sendit
+ return private->funcs->send_datav(private->funcs->arg, session_number, iov, 2);
+}
+
+int en50221_app_auth_message(en50221_app_auth auth,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_auth_private *private = (struct en50221_app_auth_private *) auth;
+ (void) resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ switch(tag)
+ {
+ case TAG_AUTH_REQ:
+ return en50221_app_auth_parse_request(private, slot_id, session_number, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+
+
+static int en50221_app_auth_parse_request(struct en50221_app_auth_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length < 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t *auth_data = data + length_field_len;
+
+ // process it
+ uint16_t auth_protocol_id = (auth_data[0]<<8) | auth_data[1];
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_auth_request_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, auth_protocol_id, auth_data+2, asn_data_length-2);
+ }
+ return 0;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_auth.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_auth.h
new file mode 100644
index 0000000..30d9c55
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_auth.h
@@ -0,0 +1,119 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_auth_H__
+#define __EN50221_APPLICATION_auth_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+
+#define EN50221_APP_AUTH_RESOURCEID MKRID(16,1,1)
+
+/**
+ * Type definition for request - called when we receive a auth request from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param auth_protocol_id Auth protocol id.
+ * @param auth_data Data for the request.
+ * @param auth_data_lenghth Number of bytes.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_auth_request_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint16_t auth_protcol_id, uint8_t *auth_data,
+ uint32_t auth_data_length);
+
+/**
+ * Opaque type representing a auth resource.
+ */
+typedef void *en50221_app_auth;
+
+/**
+ * Create an instance of the auth resource.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_auth en50221_app_auth_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of the auth resource.
+ *
+ * @param auth Instance to destroy.
+ */
+extern void en50221_app_auth_destroy(en50221_app_auth auth);
+
+/**
+ * Register the callback for when we receive a request.
+ *
+ * @param auth auth resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_auth_register_request_callback(en50221_app_auth auth,
+ en50221_app_auth_request_callback callback, void *arg);
+
+/**
+ * Send an auth response to the CAM.
+ *
+ * @param auth auth resource instance.
+ * @param session_number Session number to send it on.
+ * @param auth_protocol_id Auth protocol id.
+ * @param auth_data Auth data.
+ * @param auth_data_length Number of bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_auth_send(en50221_app_auth auth,
+ uint16_t session_number,
+ uint16_t auth_protocol_id, uint8_t *auth_data,
+ uint32_t auth_data_length);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param auth Authentication instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_auth_message(en50221_app_auth auth,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ca.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ca.c
new file mode 100644
index 0000000..a1206fb
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ca.c
@@ -0,0 +1,615 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include <libucsi/mpeg/descriptor.h>
+#include "en50221_app_ca.h"
+#include "asn_1.h"
+
+// tags supported by this resource
+#define TAG_CA_INFO_ENQUIRY 0x9f8030
+#define TAG_CA_INFO 0x9f8031
+#define TAG_CA_PMT 0x9f8032
+#define TAG_CA_PMT_REPLY 0x9f8033
+
+struct en50221_app_ca_private {
+ struct en50221_app_send_functions *funcs;
+
+ en50221_app_ca_info_callback ca_info_callback;
+ void *ca_info_callback_arg;
+
+ en50221_app_ca_pmt_reply_callback ca_pmt_reply_callback;
+ void *ca_pmt_reply_callback_arg;
+
+ pthread_mutex_t lock;
+};
+
+struct ca_pmt_descriptor {
+ uint8_t *descriptor;
+ uint16_t length;
+
+ struct ca_pmt_descriptor *next;
+};
+
+struct ca_pmt_stream {
+ uint8_t stream_type;
+ uint16_t pid;
+ struct ca_pmt_descriptor *descriptors;
+ uint32_t descriptors_length;
+ uint32_t descriptors_count;
+
+ struct ca_pmt_stream *next;
+};
+
+static int en50221_ca_extract_pmt_descriptors(struct mpeg_pmt_section *pmt, struct ca_pmt_descriptor **outdescriptors);
+static int en50221_ca_extract_streams(struct mpeg_pmt_section *pmt, struct ca_pmt_stream **outstreams);
+static void en50221_ca_try_move_pmt_descriptors(struct ca_pmt_descriptor **pmt_descriptors,
+ struct ca_pmt_stream **pmt_streams);
+static uint32_t en50221_ca_calculate_length(struct ca_pmt_descriptor *pmt_descriptors,
+ uint32_t *pmt_descriptors_length,
+ struct ca_pmt_stream *pmt_streams);
+static int en50221_app_ca_parse_info(struct en50221_app_ca_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_ca_parse_reply(struct en50221_app_ca_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+
+
+en50221_app_ca en50221_app_ca_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_ca_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_ca_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->ca_info_callback = NULL;
+ private->ca_pmt_reply_callback = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_ca_destroy(en50221_app_ca ca)
+{
+ struct en50221_app_ca_private *private = (struct en50221_app_ca_private *) ca;
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_ca_register_info_callback(en50221_app_ca ca,
+ en50221_app_ca_info_callback callback, void *arg)
+{
+ struct en50221_app_ca_private *private = (struct en50221_app_ca_private *) ca;
+
+ pthread_mutex_lock(&private->lock);
+ private->ca_info_callback = callback;
+ private->ca_info_callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_ca_register_pmt_reply_callback(en50221_app_ca ca,
+ en50221_app_ca_pmt_reply_callback callback, void *arg)
+{
+ struct en50221_app_ca_private *private = (struct en50221_app_ca_private *) ca;
+
+ pthread_mutex_lock(&private->lock);
+ private->ca_pmt_reply_callback = callback;
+ private->ca_pmt_reply_callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_ca_info_enq(en50221_app_ca ca,
+ uint16_t session_number)
+{
+ struct en50221_app_ca_private *private = (struct en50221_app_ca_private *) ca;
+ uint8_t data[4];
+
+ data[0] = (TAG_CA_INFO_ENQUIRY >> 16) & 0xFF;
+ data[1] = (TAG_CA_INFO_ENQUIRY >> 8) & 0xFF;
+ data[2] = TAG_CA_INFO_ENQUIRY & 0xFF;
+ data[3] = 0;
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 4);
+}
+
+int en50221_app_ca_pmt(en50221_app_ca ca,
+ uint16_t session_number,
+ uint8_t *ca_pmt,
+ uint32_t ca_pmt_length)
+{
+ struct en50221_app_ca_private *private = (struct en50221_app_ca_private *) ca;
+ uint8_t buf[10];
+
+ // set up the tag
+ buf[0] = (TAG_CA_PMT >> 16) & 0xFF;
+ buf[1] = (TAG_CA_PMT >> 8) & 0xFF;
+ buf[2] = TAG_CA_PMT & 0xFF;
+
+ // encode the length field
+ int length_field_len;
+ if ((length_field_len = asn_1_encode(ca_pmt_length, buf+3, 3)) < 0) {
+ return -1;
+ }
+
+ // build the iovecs
+ struct iovec iov[2];
+ iov[0].iov_base = buf;
+ iov[0].iov_len = 3+length_field_len;
+ iov[1].iov_base = ca_pmt;
+ iov[1].iov_len = ca_pmt_length;
+
+ // create the data and send it
+ return private->funcs->send_datav(private->funcs->arg, session_number, iov, 2);
+}
+
+int en50221_app_ca_message(en50221_app_ca ca,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_ca_private *private = (struct en50221_app_ca_private *) ca;
+ (void)resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ switch(tag)
+ {
+ case TAG_CA_INFO:
+ return en50221_app_ca_parse_info(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_CA_PMT_REPLY:
+ return en50221_app_ca_parse_reply(private, slot_id, session_number, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+int en50221_ca_format_pmt(struct mpeg_pmt_section *pmt, uint8_t *data, uint32_t data_length,
+ int move_ca_descriptors,
+ uint8_t ca_pmt_list_management, uint8_t ca_pmt_cmd_id)
+{
+ struct ca_pmt_descriptor *pmt_descriptors = NULL;
+ uint32_t pmt_descriptors_length = 0;
+ struct ca_pmt_stream *pmt_streams = NULL;
+ uint32_t total_required_length = 0;
+ struct ca_pmt_descriptor *cur_d;
+ struct ca_pmt_stream *cur_s;
+ int result = -1;
+
+ // extract the descriptors and streams
+ if (en50221_ca_extract_pmt_descriptors(pmt, &pmt_descriptors))
+ goto cleanup;
+ if (en50221_ca_extract_streams(pmt, &pmt_streams))
+ goto cleanup;
+
+ // try and merge them if we have no PMT descriptors
+ if ((pmt_descriptors == NULL) && move_ca_descriptors) {
+ en50221_ca_try_move_pmt_descriptors(&pmt_descriptors, &pmt_streams);
+ }
+
+ // calculate the length of all descriptors/streams and the total length required
+ total_required_length = en50221_ca_calculate_length(pmt_descriptors, &pmt_descriptors_length, pmt_streams);
+
+ // ensure we were supplied with enough data
+ if (total_required_length > data_length) {
+ goto cleanup;
+ }
+
+ // format the start of the PMT
+ uint32_t data_pos = 0;
+ data[data_pos++] = ca_pmt_list_management;
+ data[data_pos++] = mpeg_pmt_section_program_number(pmt) >> 8;
+ data[data_pos++] = mpeg_pmt_section_program_number(pmt);
+ data[data_pos++] = (pmt->head.version_number << 1) | pmt->head.current_next_indicator;
+ data[data_pos++] = (pmt_descriptors_length >> 8) & 0x0f;
+ data[data_pos++] = pmt_descriptors_length;
+
+ // append the PMT descriptors
+ if (pmt_descriptors_length) {
+ data[data_pos++] = ca_pmt_cmd_id;
+ struct ca_pmt_descriptor *cur_d = pmt_descriptors;
+ while(cur_d) {
+ memcpy(data+data_pos, cur_d->descriptor, cur_d->length);
+ data_pos += cur_d->length;
+ cur_d = cur_d->next;
+ }
+ }
+
+ // now, append the streams
+ cur_s = pmt_streams;
+ while(cur_s) {
+ data[data_pos++] = cur_s->stream_type;
+ data[data_pos++] = (cur_s->pid >> 8) & 0x1f;
+ data[data_pos++] = cur_s->pid;
+ data[data_pos++] = (cur_s->descriptors_length >> 8) & 0x0f;
+ data[data_pos++] = cur_s->descriptors_length;
+
+ // append the stream descriptors
+ if (cur_s->descriptors_length) {
+ data[data_pos++] = ca_pmt_cmd_id;
+ struct ca_pmt_descriptor *cur_d = cur_s->descriptors;
+ while(cur_d) {
+ memcpy(data+data_pos, cur_d->descriptor, cur_d->length);
+ data_pos += cur_d->length;
+ cur_d = cur_d->next;
+ }
+ }
+ cur_s = cur_s->next;
+ }
+ result = data_pos;
+
+
+cleanup:
+ // free the PMT descriptors
+ cur_d = pmt_descriptors;
+ while(cur_d) {
+ struct ca_pmt_descriptor *next = cur_d->next;
+ free(cur_d);
+ cur_d = next;
+ }
+
+ // free the streams
+ cur_s = pmt_streams;
+ while(cur_s) {
+ struct ca_pmt_stream *next_s = cur_s->next;
+
+ // free the stream descriptors
+ cur_d = cur_s->descriptors;
+ while(cur_d) {
+ struct ca_pmt_descriptor *next_d = cur_d->next;
+ free(cur_d);
+ cur_d = next_d;
+ }
+
+ free(cur_s);
+ cur_s = next_s;
+ }
+ return result;
+}
+
+
+
+
+
+
+
+static int en50221_ca_extract_pmt_descriptors(struct mpeg_pmt_section *pmt, struct ca_pmt_descriptor **outdescriptors)
+{
+ struct ca_pmt_descriptor *descriptors = NULL;
+ struct ca_pmt_descriptor *descriptors_tail = NULL;
+ struct ca_pmt_descriptor *cur_d;
+
+ struct descriptor *cur_descriptor;
+ mpeg_pmt_section_descriptors_for_each(pmt, cur_descriptor) {
+ if (cur_descriptor->tag == dtag_mpeg_ca) {
+ // create a new structure for this one
+ struct ca_pmt_descriptor *new_d = malloc(sizeof(struct ca_pmt_descriptor));
+ if (new_d == NULL) {
+ goto error_exit;
+ }
+ new_d->descriptor = (uint8_t*) cur_descriptor;
+ new_d->length = cur_descriptor->len+2;
+ new_d->next = NULL;
+
+ // append it to the list
+ if (descriptors == NULL) {
+ descriptors = new_d;
+ } else {
+ descriptors_tail->next = new_d;
+ }
+ descriptors_tail = new_d;
+ }
+ }
+ *outdescriptors = descriptors;
+ return 0;
+
+error_exit:
+ cur_d = descriptors;
+ while(cur_d) {
+ struct ca_pmt_descriptor *next = cur_d->next;
+ free(cur_d);
+ cur_d = next;
+ }
+ return -1;
+}
+
+static int en50221_ca_extract_streams(struct mpeg_pmt_section *pmt, struct ca_pmt_stream **outstreams)
+{
+ struct ca_pmt_stream *streams = NULL;
+ struct ca_pmt_stream *streams_tail = NULL;
+ struct mpeg_pmt_stream *cur_stream;
+ struct descriptor *cur_descriptor;
+ struct ca_pmt_stream *cur_s;
+
+ mpeg_pmt_section_streams_for_each(pmt, cur_stream) {
+ struct ca_pmt_descriptor *descriptors_tail = NULL;
+
+ // create a new structure
+ struct ca_pmt_stream *new_s = malloc(sizeof(struct ca_pmt_stream));
+ if (new_s == NULL) {
+ goto exit_cleanup;
+ }
+ new_s->stream_type = cur_stream->stream_type;
+ new_s->pid = cur_stream->pid;
+ new_s->descriptors = NULL;
+ new_s->next = NULL;
+ new_s->descriptors_count = 0;
+
+ // append it to the list
+ if (streams == NULL) {
+ streams = new_s;
+ } else {
+ streams_tail->next = new_s;
+ }
+ streams_tail = new_s;
+
+ // now process the descriptors
+ mpeg_pmt_stream_descriptors_for_each(cur_stream, cur_descriptor) {
+ if (cur_descriptor->tag == dtag_mpeg_ca) {
+ // create a new structure
+ struct ca_pmt_descriptor *new_d = malloc(sizeof(struct ca_pmt_descriptor));
+ if (new_d == NULL) {
+ goto exit_cleanup;
+ }
+ new_d->descriptor = (uint8_t*) cur_descriptor;
+ new_d->length = cur_descriptor->len+2;
+ new_d->next = NULL;
+
+ // append it to the list
+ if (new_s->descriptors == NULL) {
+ new_s->descriptors = new_d;
+ } else {
+ descriptors_tail->next = new_d;
+ }
+ descriptors_tail = new_d;
+ new_s->descriptors_count++;
+ }
+ }
+ }
+ *outstreams = streams;
+ return 0;
+
+exit_cleanup:
+ // free the streams
+ cur_s = streams;
+ while(cur_s) {
+ struct ca_pmt_stream *next_s = cur_s->next;
+
+ // free the stream descriptors
+ struct ca_pmt_descriptor *cur_d = cur_s->descriptors;
+ while(cur_d) {
+ struct ca_pmt_descriptor *next_d = cur_d->next;
+ free(cur_d);
+ cur_d = next_d;
+ }
+
+ free(cur_s);
+ cur_s = next_s;
+ }
+ return -1;
+}
+
+static void en50221_ca_try_move_pmt_descriptors(struct ca_pmt_descriptor **pmt_descriptors,
+ struct ca_pmt_stream **pmt_streams)
+{
+ // get the first stream
+ struct ca_pmt_stream *first_stream = *pmt_streams;
+ if (first_stream == NULL)
+ return;
+
+ // Check that all the other streams with CA descriptors have exactly the same CA descriptors
+ struct ca_pmt_stream *cur_stream = first_stream->next;
+ while(cur_stream) {
+ // if there are differing numbers of descriptors, exit right now
+ if (cur_stream->descriptors_count != first_stream->descriptors_count)
+ return;
+
+ // now verify the descriptors match
+ struct ca_pmt_descriptor *cur_descriptor = cur_stream->descriptors;
+ struct ca_pmt_descriptor *first_cur_descriptor = first_stream->descriptors;
+ while(cur_descriptor) {
+ // check the descriptors are the same length
+ if (cur_descriptor->length != first_cur_descriptor->length)
+ return;
+
+ // check their contents match
+ if (memcmp(cur_descriptor->descriptor, first_cur_descriptor->descriptor, cur_descriptor->length)) {
+ return;
+ }
+
+ // move to next
+ cur_descriptor = cur_descriptor->next;
+ first_cur_descriptor = first_cur_descriptor->next;
+ }
+
+ // move to next
+ cur_stream = cur_stream->next;
+ }
+
+ // if we end up here, all descriptors in all streams matched
+
+ // hook the first stream's descriptors into the PMT's
+ *pmt_descriptors = first_stream->descriptors;
+ first_stream->descriptors = NULL;
+ first_stream->descriptors_count = 0;
+
+ // now free up all the descriptors in the other streams
+ cur_stream = first_stream->next;
+ while(cur_stream) {
+ struct ca_pmt_descriptor *cur_descriptor = cur_stream->descriptors;
+ while(cur_descriptor) {
+ struct ca_pmt_descriptor *next = cur_descriptor->next;
+ free(cur_descriptor);
+ cur_descriptor=next;
+ }
+ cur_stream->descriptors = NULL;
+ cur_stream->descriptors_count = 0;
+ cur_stream = cur_stream->next;
+ }
+}
+
+static uint32_t en50221_ca_calculate_length(struct ca_pmt_descriptor *pmt_descriptors,
+ uint32_t *pmt_descriptors_length,
+ struct ca_pmt_stream *pmt_streams)
+{
+ uint32_t total_required_length = 6; // header
+ struct ca_pmt_stream *cur_s;
+
+ // calcuate the PMT descriptors length
+ (*pmt_descriptors_length) = 0;
+ struct ca_pmt_descriptor *cur_d = pmt_descriptors;
+ while(cur_d) {
+ (*pmt_descriptors_length) += cur_d->length;
+ cur_d = cur_d->next;
+ }
+
+ // add on 1 byte for the ca_pmt_cmd_id if we have some descriptors.
+ if (*pmt_descriptors_length)
+ (*pmt_descriptors_length)++;
+
+ // update the total required length
+ total_required_length += *pmt_descriptors_length;
+
+ // calculate the length of descriptors in the streams
+ cur_s = pmt_streams;
+ while(cur_s) {
+ // calculate the size of descriptors in this stream
+ cur_s->descriptors_length = 0;
+ cur_d = cur_s->descriptors;
+ while(cur_d) {
+ cur_s->descriptors_length += cur_d->length;
+ cur_d = cur_d->next;
+ }
+
+ // add on 1 byte for the ca_pmt_cmd_id if we have some descriptors.
+ if (cur_s->descriptors_length)
+ cur_s->descriptors_length++;
+
+ // update the total required length;
+ total_required_length += 5 + cur_s->descriptors_length;
+
+ cur_s = cur_s->next;
+ }
+
+ // done
+ return total_required_length;
+}
+
+static int en50221_app_ca_parse_info(struct en50221_app_ca_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ data+=length_field_len;
+
+ // parse
+ uint32_t ca_id_count = asn_data_length / 2;
+
+ // byteswap the IDs
+ uint16_t *ids = (uint16_t*) data;
+ uint32_t i;
+ for(i=0; i<ca_id_count; i++) {
+ bswap16(data);
+ data+=2;
+ }
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_ca_info_callback cb = private->ca_info_callback;
+ void *cb_arg = private->ca_info_callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, ca_id_count, ids);
+ }
+ return 0;
+}
+
+static int en50221_app_ca_parse_reply(struct en50221_app_ca_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length < 4) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ data += length_field_len;
+ data_length -= length_field_len;
+
+ // process the reply table to fix endian issues
+ uint32_t pos = 4;
+ bswap16(data);
+ while(pos < asn_data_length) {
+ bswap16(data+pos);
+ pos+= 3;
+ }
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_ca_pmt_reply_callback cb = private->ca_pmt_reply_callback;
+ void *cb_arg = private->ca_pmt_reply_callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, (struct en50221_app_pmt_reply*) data, asn_data_length);
+ }
+ return 0;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ca.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ca.h
new file mode 100644
index 0000000..ab29649
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_ca.h
@@ -0,0 +1,254 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_ca_H__
+#define __EN50221_APPLICATION_ca_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+#include <libucsi/mpeg/pmt_section.h>
+#include <libucsi/dvb/descriptor.h>
+
+#define CA_LIST_MANAGEMENT_MORE 0x00
+#define CA_LIST_MANAGEMENT_FIRST 0x01
+#define CA_LIST_MANAGEMENT_LAST 0x02
+#define CA_LIST_MANAGEMENT_ONLY 0x03
+#define CA_LIST_MANAGEMENT_ADD 0x04
+#define CA_LIST_MANAGEMENT_UPDATE 0x05
+
+#define CA_PMT_CMD_ID_OK_DESCRAMBLING 0x01
+#define CA_PMT_CMD_ID_OK_MMI 0x02
+#define CA_PMT_CMD_ID_QUERY 0x03
+#define CA_PMT_CMD_ID_NOT_SELECTED 0x04
+
+#define CA_ENABLE_DESCRAMBLING_POSSIBLE 0x01
+#define CA_ENABLE_DESCRAMBLING_POSSIBLE_PURCHASE 0x02
+#define CA_ENABLE_DESCRAMBLING_POSSIBLE_TECHNICAL 0x03
+#define CA_ENABLE_DESCRAMBLING_NOT_POSSIBLE_NO_ENTITLEMENT 0x71
+#define CA_ENABLE_DESCRAMBLING_NOT_POSSIBLE_TECHNICAL 0x73
+
+
+#define EN50221_APP_CA_RESOURCEID MKRID(3,1,1)
+
+/**
+ * PMT reply structure.
+ */
+struct en50221_app_pmt_reply {
+ uint16_t program_number;
+ EBIT3(uint8_t reserved_1 : 2; ,
+ uint8_t version_number : 5; ,
+ uint8_t current_next_indicator : 1; )
+ EBIT2(uint8_t CA_enable_flag : 1; ,
+ uint8_t CA_enable : 7; )
+ /* struct en50221_app_pmt_stream streams[] */
+} __attribute__((packed));
+
+/**
+ * A stream within a pmt reply structure.
+ */
+struct en50221_app_pmt_stream {
+ EBIT2(uint16_t reserved_1 : 3; ,
+ uint16_t es_pid :13; )
+ EBIT2(uint8_t CA_enable_flag : 1; ,
+ uint8_t CA_enable : 7; )
+} __attribute__((packed));
+
+/**
+ * Convenience iterator for the streams field of the en50221_app_pmt_reply structure.
+ *
+ * @param pmt Pointer to the en50221_app_pmt_reply structure.
+ * @param pos Variable holding a pointer to the current en50221_app_pmt_stream.
+ * @param size Total size of the PMT reply.
+ */
+#define en50221_app_pmt_reply_streams_for_each(pmt, pos, size) \
+ for ((pos) = en50221_app_pmt_reply_streams_first(pmt, size); \
+ (pos); \
+ (pos) = en50221_app_pmt_reply_streams_next(pmt, pos, size))
+
+
+/**
+ * Type definition for command - called when we receive a ca info response.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param ca_id_count Number of ca_system_ids.
+ * @param ca_ids Pointer to list of ca_system_ids.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_ca_info_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint32_t ca_id_count,
+ uint16_t *ca_ids);
+
+/**
+ * Type definition for pmt_reply - called when we receive a pmt_reply.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param reply Pointer to a struct en50221_app_pmt_reply.
+ * @param reply_size Total size of the struct en50221_app_pmt_reply in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_ca_pmt_reply_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ struct en50221_app_pmt_reply *reply,
+ uint32_t reply_size);
+
+/**
+ * Opaque type representing a ca resource.
+ */
+typedef void *en50221_app_ca;
+
+/**
+ * Create an instance of the ca resource.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_ca en50221_app_ca_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of the ca resource.
+ *
+ * @param ca Instance to destroy.
+ */
+extern void en50221_app_ca_destroy(en50221_app_ca ca);
+
+/**
+ * Register the callback for when we receive a ca info.
+ *
+ * @param ca ca resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_ca_register_info_callback(en50221_app_ca ca,
+ en50221_app_ca_info_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a pmt_reply.
+ *
+ * @param ca ca resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_ca_register_pmt_reply_callback(en50221_app_ca ca,
+ en50221_app_ca_pmt_reply_callback callback, void *arg);
+
+/**
+ * Send a ca_info_req to the CAM.
+ *
+ * @param ca ca resource instance.
+ * @param session_number Session number to send it on.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_ca_info_enq(en50221_app_ca ca,
+ uint16_t session_number);
+
+/**
+ * Send a ca_pmt structure to the CAM.
+ *
+ * @param ca ca resource instance.
+ * @param session_number Session number to send it on.
+ * @param ca_pmt A ca_pmt structure formatted with the en50221_ca_format_pmt() function.
+ * @param ca_pmt_length Length of ca_pmt structure in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_ca_pmt(en50221_app_ca ca,
+ uint16_t session_number,
+ uint8_t *ca_pmt,
+ uint32_t ca_pmt_length);
+
+/**
+ * Transform a libucsi PMT into a binary structure for sending to a CAM.
+ *
+ * @param pmt The source PMT structure.
+ * @param data Pointer to data buffer to write it to.
+ * @param data_length Number of bytes available in data buffer.
+ * @param move_ca_descriptors If non-zero, will attempt to move CA descriptors
+ * in order to reduce the size of the formatted CAPMT.
+ * @param ca_pmt_list_management One of the CA_LIST_MANAGEMENT_*.
+ * @param ca_pmt_cmd_id One of the CA_PMT_CMD_ID_*.
+ * @return Number of bytes used, or -1 on error.
+ */
+extern int en50221_ca_format_pmt(struct mpeg_pmt_section *pmt,
+ uint8_t *data,
+ uint32_t data_length,
+ int move_ca_descriptors,
+ uint8_t ca_pmt_list_management, uint8_t ca_pmt_cmd_id);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param ca CA instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_ca_message(en50221_app_ca ca,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+
+
+
+static inline struct en50221_app_pmt_stream *
+ en50221_app_pmt_reply_streams_first(struct en50221_app_pmt_reply *reply, uint32_t reply_size)
+{
+ uint32_t pos = sizeof(struct en50221_app_pmt_reply);
+
+ if (pos >= reply_size)
+ return NULL;
+
+ return (struct en50221_app_pmt_stream *)((uint8_t *)reply+ pos);
+}
+
+static inline struct en50221_app_pmt_stream *
+ en50221_app_pmt_reply_streams_next(struct en50221_app_pmt_reply * reply,
+ struct en50221_app_pmt_stream * pos,
+ uint32_t reply_size)
+{
+ uint8_t *end = (uint8_t*) reply + reply_size;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct en50221_app_pmt_stream);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct en50221_app_pmt_stream *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_datetime.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_datetime.c
new file mode 100644
index 0000000..5686443
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_datetime.c
@@ -0,0 +1,169 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include <libucsi/dvb/types.h>
+#include "en50221_app_datetime.h"
+#include "en50221_app_tags.h"
+#include "asn_1.h"
+
+struct en50221_app_datetime_private {
+ struct en50221_app_send_functions *funcs;
+
+ en50221_app_datetime_enquiry_callback callback;
+ void *callback_arg;
+
+ pthread_mutex_t lock;
+};
+
+static int en50221_app_datetime_parse_enquiry(struct en50221_app_datetime_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+
+
+en50221_app_datetime en50221_app_datetime_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_datetime_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_datetime_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->callback = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_datetime_destroy(en50221_app_datetime datetime)
+{
+ struct en50221_app_datetime_private *private = (struct en50221_app_datetime_private *) datetime;
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_datetime_register_enquiry_callback(en50221_app_datetime datetime,
+ en50221_app_datetime_enquiry_callback callback, void *arg)
+{
+ struct en50221_app_datetime_private *private = (struct en50221_app_datetime_private *) datetime;
+
+ pthread_mutex_lock(&private->lock);
+ private->callback = callback;
+ private->callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_datetime_send(en50221_app_datetime datetime,
+ uint16_t session_number,
+ time_t utc_time,
+ int time_offset)
+{
+ struct en50221_app_datetime_private *private = (struct en50221_app_datetime_private *) datetime;
+ uint8_t data[11];
+ int data_length;
+
+ data[0] = (TAG_DATE_TIME >> 16) & 0xFF;
+ data[1] = (TAG_DATE_TIME >> 8) & 0xFF;
+ data[2] = TAG_DATE_TIME & 0xFF;
+ if (time_offset != -1) {
+ data[3] = 7;
+ unixtime_to_dvbdate(utc_time, data+4);
+ data[9] = time_offset >> 8;
+ data[10] = time_offset;
+ data_length = 11;
+ } else {
+ data[3] = 5;
+ unixtime_to_dvbdate(utc_time, data+4);
+ data_length = 9;
+ }
+ return private->funcs->send_data(private->funcs->arg, session_number, data, data_length);
+}
+
+int en50221_app_datetime_message(en50221_app_datetime datetime,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_datetime_private *private = (struct en50221_app_datetime_private *) datetime;
+ (void) resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ switch(tag)
+ {
+ case TAG_DATE_TIME_ENQUIRY:
+ return en50221_app_datetime_parse_enquiry(private, slot_id, session_number, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+
+
+
+
+
+
+
+
+
+static int en50221_app_datetime_parse_enquiry(struct en50221_app_datetime_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // validate data
+ if (data_length != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] != 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t response_interval = data[1];
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_datetime_enquiry_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, response_interval);
+ }
+ return 0;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_datetime.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_datetime.h
new file mode 100644
index 0000000..5819fb4
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_datetime.h
@@ -0,0 +1,116 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_DATETIME_H__
+#define __EN50221_APPLICATION_DATETIME_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+
+#define EN50221_APP_DATETIME_RESOURCEID MKRID(36,1,1)
+
+/**
+ * Type definition for enquiry - called when we receive a date/time enquiry from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param response_interval Response interval requested by CAM.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_datetime_enquiry_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t response_interval);
+
+/**
+ * Opaque type representing a datetime resource.
+ */
+typedef void *en50221_app_datetime;
+
+/**
+ * Create an instance of the datetime resource.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_datetime en50221_app_datetime_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of the datetime resource.
+ *
+ * @param datetime Instance to destroy.
+ */
+extern void en50221_app_datetime_destroy(en50221_app_datetime datetime);
+
+/**
+ * Register the callback for when we receive a enquiry request.
+ *
+ * @param datetime datetime resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_datetime_register_enquiry_callback(en50221_app_datetime datetime,
+ en50221_app_datetime_enquiry_callback callback, void *arg);
+
+/**
+ * Send the time to the CAM.
+ *
+ * @param datetime datetime resource instance.
+ * @param session_number Session number to send it on.
+ * @param utc_time UTC time in unix time format.
+ * @param time_offset If -1, the field will not be transmitted, otherwise it is the offset between
+ * UTC and local time in minutes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_datetime_send(en50221_app_datetime datetime,
+ uint16_t session_number,
+ time_t utc_time,
+ int time_offset);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param datetime datetime instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_datetime_message(en50221_app_datetime datetime,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_dvb.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_dvb.c
new file mode 100644
index 0000000..82da884
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_dvb.c
@@ -0,0 +1,263 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include "en50221_app_dvb.h"
+#include "en50221_app_tags.h"
+#include "asn_1.h"
+
+struct en50221_app_dvb_private {
+ struct en50221_app_send_functions *funcs;
+
+ en50221_app_dvb_tune_callback tune_callback;
+ void *tune_callback_arg;
+
+ en50221_app_dvb_replace_callback replace_callback;
+ void *replace_callback_arg;
+
+ en50221_app_dvb_clear_replace_callback clear_replace_callback;
+ void *clear_replace_callback_arg;
+
+ pthread_mutex_t lock;
+};
+
+static int en50221_app_dvb_parse_tune(struct en50221_app_dvb_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+static int en50221_app_dvb_parse_replace(struct en50221_app_dvb_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+static int en50221_app_dvb_parse_clear_replace(struct en50221_app_dvb_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+
+
+en50221_app_dvb en50221_app_dvb_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_dvb_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_dvb_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->tune_callback = NULL;
+ private->replace_callback = NULL;
+ private->clear_replace_callback = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_dvb_destroy(en50221_app_dvb dvb)
+{
+ struct en50221_app_dvb_private *private = (struct en50221_app_dvb_private *) dvb;
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_dvb_register_tune_callback(en50221_app_dvb dvb,
+ en50221_app_dvb_tune_callback callback, void *arg)
+{
+ struct en50221_app_dvb_private *private = (struct en50221_app_dvb_private *) dvb;
+
+ pthread_mutex_lock(&private->lock);
+ private->tune_callback = callback;
+ private->tune_callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_dvb_register_replace_callback(en50221_app_dvb dvb,
+ en50221_app_dvb_replace_callback callback, void *arg)
+{
+ struct en50221_app_dvb_private *private = (struct en50221_app_dvb_private *) dvb;
+
+ pthread_mutex_lock(&private->lock);
+ private->replace_callback = callback;
+ private->replace_callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_dvb_register_clear_replace_callback(en50221_app_dvb dvb,
+ en50221_app_dvb_clear_replace_callback callback, void *arg)
+{
+ struct en50221_app_dvb_private *private = (struct en50221_app_dvb_private *) dvb;
+
+ pthread_mutex_lock(&private->lock);
+ private->clear_replace_callback = callback;
+ private->clear_replace_callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_dvb_ask_release(en50221_app_dvb dvb, uint16_t session_number)
+{
+ struct en50221_app_dvb_private *private = (struct en50221_app_dvb_private *) dvb;
+ uint8_t data[4];
+
+ data[0] = (TAG_ASK_RELEASE >> 16) & 0xFF;
+ data[1] = (TAG_ASK_RELEASE >> 8) & 0xFF;
+ data[2] = TAG_ASK_RELEASE & 0xFF;
+ data[3] = 0;
+
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 4);
+}
+
+int en50221_app_dvb_message(en50221_app_dvb dvb,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_dvb_private *private = (struct en50221_app_dvb_private *) dvb;
+ (void) resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ switch(tag)
+ {
+ case TAG_TUNE:
+ return en50221_app_dvb_parse_tune(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_REPLACE:
+ return en50221_app_dvb_parse_replace(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_CLEAR_REPLACE:
+ return en50221_app_dvb_parse_clear_replace(private, slot_id, session_number, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+
+
+
+
+
+
+
+
+
+static int en50221_app_dvb_parse_tune(struct en50221_app_dvb_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // validate data
+ if (data_length < 9) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] != 8) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t *tune_data = data+1;
+
+ // parse it
+ uint16_t network_id = (tune_data[0] << 8) | tune_data[1];
+ uint16_t original_network_id = (tune_data[2] << 8) | tune_data[3];
+ uint16_t transport_stream_id = (tune_data[4] << 8) | tune_data[5];
+ uint16_t service_id = (tune_data[6] << 8) | tune_data[7];
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_dvb_tune_callback cb = private->tune_callback;
+ void *cb_arg = private->tune_callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, network_id, original_network_id, transport_stream_id, service_id);
+ }
+ return 0;
+}
+
+static int en50221_app_dvb_parse_replace(struct en50221_app_dvb_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // validate data
+ if (data_length < 6) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] != 5) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t *replace_data = data+1;
+
+ // parse it
+ uint8_t replacement_ref = replace_data[0];
+ uint16_t replace_pid = ((replace_data[1] & 0x1f)<<8) | replace_data[2];
+ uint16_t replacement_pid = ((replace_data[3] & 0x1f)<<8) | replace_data[4];
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_dvb_replace_callback cb = private->replace_callback;
+ void *cb_arg = private->replace_callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, replacement_ref, replace_pid, replacement_pid);
+ }
+ return 0;
+}
+
+static int en50221_app_dvb_parse_clear_replace(struct en50221_app_dvb_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // validate data
+ if (data_length < 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] != 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t *replace_data = data+1;
+
+ // parse it
+ uint8_t replacement_ref = replace_data[0];
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_dvb_clear_replace_callback cb = private->clear_replace_callback;
+ void *cb_arg = private->clear_replace_callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, replacement_ref);
+ }
+ return 0;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_dvb.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_dvb.h
new file mode 100644
index 0000000..221f58a
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_dvb.h
@@ -0,0 +1,164 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_DVB_H__
+#define __EN50221_APPLICATION_DVB_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+
+#define EN50221_APP_DVB_RESOURCEID MKRID(32,1,1)
+
+
+/**
+ * Type definition for tune - called when we receive a tune request from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param network_id Network id requested by CAM.
+ * @param original_network_id Original Network id requested by CAM.
+ * @param transport_stream_id Transport stream id requested by CAM.
+ * @param service_id Service id requested by CAM.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_dvb_tune_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint16_t network_id, uint32_t original_network_id,
+ uint16_t transport_stream_id, uint16_t service_id);
+
+/**
+ * Type definition for replace - called when we receive a replace request from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param replacement_ref Replacement ref.
+ * @param replaced_pid PID to replace.
+ * @param replacement_pid PID to replace it with.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_dvb_replace_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t replacement_ref,
+ uint16_t replaced_pid, uint16_t replacement_pid);
+
+
+/**
+ * Type definition for clear_replace - called when we receive a clear_replace request from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param replacement_ref Replacement ref.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_dvb_clear_replace_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t replacement_ref);
+
+
+/**
+ * Opaque type representing a dvb resource.
+ */
+typedef void *en50221_app_dvb;
+
+/**
+ * Create an instance of the dvb resource.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_dvb en50221_app_dvb_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of the dvb resource.
+ *
+ * @param dvb Instance to destroy.
+ */
+extern void en50221_app_dvb_destroy(en50221_app_dvb dvb);
+
+/**
+ * Register the callback for when we receive a tune request.
+ *
+ * @param dvb DVB resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_dvb_register_tune_callback(en50221_app_dvb dvb,
+ en50221_app_dvb_tune_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a replace request.
+ *
+ * @param dvb DVB resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_dvb_register_replace_callback(en50221_app_dvb dvb,
+ en50221_app_dvb_replace_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a clear replace request.
+ *
+ * @param dvb DVB resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_dvb_register_clear_replace_callback(en50221_app_dvb dvb,
+ en50221_app_dvb_clear_replace_callback callback, void *arg);
+
+/**
+ * Send an ask release request to the CAM.
+ *
+ * @param dvb DVB resource instance.
+ * @param session_number Session number to send it on.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_dvb_ask_release(en50221_app_dvb dvb, uint16_t session_number);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param dvb dvb instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_dvb_message(en50221_app_dvb dvb,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_epg.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_epg.c
new file mode 100644
index 0000000..dba09b0
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_epg.c
@@ -0,0 +1,166 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include <libucsi/dvb/types.h>
+#include "en50221_app_epg.h"
+#include "en50221_app_tags.h"
+#include "asn_1.h"
+
+struct en50221_app_epg_private {
+ struct en50221_app_send_functions *funcs;
+
+ en50221_app_epg_reply_callback callback;
+ void *callback_arg;
+
+ pthread_mutex_t lock;
+};
+
+static int en50221_app_epg_parse_reply(struct en50221_app_epg_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+
+
+en50221_app_epg en50221_app_epg_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_epg_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_epg_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->callback = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_epg_destroy(en50221_app_epg epg)
+{
+ struct en50221_app_epg_private *private = (struct en50221_app_epg_private *) epg;
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_epg_register_enquiry_callback(en50221_app_epg epg,
+ en50221_app_epg_reply_callback callback, void *arg)
+{
+ struct en50221_app_epg_private *private = (struct en50221_app_epg_private *) epg;
+
+ pthread_mutex_lock(&private->lock);
+ private->callback = callback;
+ private->callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_epg_enquire(en50221_app_epg epg,
+ uint16_t session_number,
+ uint8_t command_id,
+ uint16_t network_id,
+ uint16_t original_network_id,
+ uint16_t transport_stream_id,
+ uint16_t service_id,
+ uint16_t event_id)
+{
+ struct en50221_app_epg_private *private = (struct en50221_app_epg_private *) epg;
+ uint8_t data[15];
+
+ data[0] = (TAG_EPG_ENQUIRY >> 16) & 0xFF;
+ data[1] = (TAG_EPG_ENQUIRY >> 8) & 0xFF;
+ data[2] = TAG_EPG_ENQUIRY & 0xFF;
+ data[3] = 11;
+ data[4] = command_id;
+ data[5] = network_id >> 8;
+ data[6] = network_id;
+ data[7] = original_network_id >> 8;
+ data[8] = original_network_id;
+ data[9] = transport_stream_id >> 8;
+ data[10] = transport_stream_id;
+ data[11] = service_id >> 8;
+ data[12] = service_id;
+ data[13] = event_id >> 8;
+ data[14] = event_id;
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 15);
+}
+
+int en50221_app_epg_message(en50221_app_epg epg,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_epg_private *private = (struct en50221_app_epg_private *) epg;
+ (void) resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ switch(tag)
+ {
+ case TAG_EPG_REPLY:
+ return en50221_app_epg_parse_reply(private, slot_id, session_number, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+
+
+static int en50221_app_epg_parse_reply(struct en50221_app_epg_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // validate data
+ if (data_length != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] != 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t event_status = data[1];
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_epg_reply_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, event_status);
+ }
+ return 0;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_epg.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_epg.h
new file mode 100644
index 0000000..c3c4c59
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_epg.h
@@ -0,0 +1,136 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_epg_H__
+#define __EN50221_APPLICATION_epg_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+
+#define EPG_COMMAND_ID_MMI 0x02
+#define EPG_COMMAND_ID_QUERY 0x03
+
+#define EPG_EVENTSTATUS_ENTITLEMENT_UNKNOWN 0x00
+#define EPG_EVENTSTATUS_ENTITLEMENT_AVAILABLE 0x01
+#define EPG_EVENTSTATUS_ENTITLEMENT_NOT_AVAILABLE 0x02
+#define EPG_EVENTSTATUS_MMI_DIALOGUE_REQUIRED 0x03
+#define EPG_EVENTSTATUS_MMI_COMPLETE_UNKNOWN 0x04
+#define EPG_EVENTSTATUS_MMI_COMPLETE_AVAILABLE 0x05
+#define EPG_EVENTSTATUS_MMI_COMPLETE_NOT_AVAILABLE 0x06
+
+#define EN50221_APP_EPG_RESOURCEID(INSTANCE_NUM) MKRID(120,(INSTANCE_NUM),1)
+
+
+
+/**
+ * Type definition for reply - called when we receive an EPG reply from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param event_status One of the EPG_EVENTSTATUS_* values.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_epg_reply_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t event_status);
+
+/**
+ * Opaque type representing a epg resource.
+ */
+typedef void *en50221_app_epg;
+
+/**
+ * Create an instance of the epg resource.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_epg en50221_app_epg_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of the epg resource.
+ *
+ * @param epg Instance to destroy.
+ */
+extern void en50221_app_epg_destroy(en50221_app_epg epg);
+
+/**
+ * Register the callback for when we receive a enquiry response.
+ *
+ * @param epg epg resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_epg_register_reply_callback(en50221_app_epg epg,
+ en50221_app_epg_reply_callback callback, void *arg);
+
+/**
+ * Enquire about the entitlement status for an EPG entry.
+ *
+ * @param epg epg resource instance.
+ * @param session_number Session number to send it on.
+ * @param command_id One of the EPG_COMMAND_ID_* fields.
+ * @param network_id Network ID concerned.
+ * @param original_network_id Original network ID concerned.
+ * @param transport_stream_id Transport stream ID concerned.
+ * @param service_id Service ID concerned.
+ * @param event_id Event ID concerned.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_epg_enquire(en50221_app_epg epg,
+ uint16_t session_number,
+ uint8_t command_id,
+ uint16_t network_id,
+ uint16_t original_network_id,
+ uint16_t transport_stream_id,
+ uint16_t service_id,
+ uint16_t event_id);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param epg epg instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_epg_message(en50221_app_epg epg,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_lowspeed.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_lowspeed.c
new file mode 100644
index 0000000..25d088f
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_lowspeed.c
@@ -0,0 +1,514 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include "en50221_app_lowspeed.h"
+#include "en50221_app_tags.h"
+#include "asn_1.h"
+
+struct en50221_app_lowspeed_session {
+ uint16_t session_number;
+ uint8_t *block_chain;
+ uint32_t block_length;
+
+ struct en50221_app_lowspeed_session *next;
+};
+
+struct en50221_app_lowspeed_private {
+ struct en50221_app_send_functions *funcs;
+
+ en50221_app_lowspeed_command_callback command_callback;
+ void *command_callback_arg;
+
+ en50221_app_lowspeed_send_callback send_callback;
+ void *send_callback_arg;
+
+ struct en50221_app_lowspeed_session *sessions;
+
+ pthread_mutex_t lock;
+};
+
+static int en50221_app_lowspeed_parse_connect_on_channel(struct en50221_app_lowspeed_command *command,
+ uint8_t *data,
+ int data_length);
+static int en50221_app_lowspeed_parse_command(struct en50221_app_lowspeed_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_lowspeed_parse_send(struct en50221_app_lowspeed_private *private,
+ uint8_t slot_id, uint16_t session_number, int more_last,
+ uint8_t *data, uint32_t data_length);
+
+
+
+en50221_app_lowspeed en50221_app_lowspeed_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_lowspeed_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_lowspeed_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->command_callback = NULL;
+ private->send_callback = NULL;
+ private->sessions = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_lowspeed_destroy(en50221_app_lowspeed lowspeed)
+{
+ struct en50221_app_lowspeed_private *private = (struct en50221_app_lowspeed_private *) lowspeed;
+
+ struct en50221_app_lowspeed_session *cur_s = private->sessions;
+ while(cur_s) {
+ struct en50221_app_lowspeed_session *next = cur_s->next;
+ if (cur_s->block_chain)
+ free(cur_s->block_chain);
+ free(cur_s);
+ cur_s = next;
+ }
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_lowspeed_clear_session(en50221_app_lowspeed lowspeed, uint16_t session_number)
+{
+ struct en50221_app_lowspeed_private *private = (struct en50221_app_lowspeed_private *) lowspeed;
+
+ pthread_mutex_lock(&private->lock);
+ struct en50221_app_lowspeed_session *cur_s = private->sessions;
+ struct en50221_app_lowspeed_session *prev_s = NULL;
+ while(cur_s) {
+ if (cur_s->session_number == session_number) {
+ if (cur_s->block_chain)
+ free(cur_s->block_chain);
+ if (prev_s) {
+ prev_s->next = cur_s->next;
+ } else {
+ private->sessions = cur_s->next;
+ }
+ free(cur_s);
+ return;
+ }
+
+ prev_s = cur_s;
+ cur_s=cur_s->next;
+ }
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_lowspeed_register_command_callback(en50221_app_lowspeed lowspeed,
+ en50221_app_lowspeed_command_callback callback, void *arg)
+{
+ struct en50221_app_lowspeed_private *private = (struct en50221_app_lowspeed_private *) lowspeed;
+
+ pthread_mutex_lock(&private->lock);
+ private->command_callback = callback;
+ private->command_callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_lowspeed_register_send_callback(en50221_app_lowspeed lowspeed,
+ en50221_app_lowspeed_send_callback callback, void *arg)
+{
+ struct en50221_app_lowspeed_private *private = (struct en50221_app_lowspeed_private *) lowspeed;
+
+ pthread_mutex_lock(&private->lock);
+ private->send_callback = callback;
+ private->send_callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_lowspeed_send_comms_reply(en50221_app_lowspeed lowspeed,
+ uint16_t session_number,
+ uint8_t comms_reply_id,
+ uint8_t return_value)
+{
+ struct en50221_app_lowspeed_private *private = (struct en50221_app_lowspeed_private *) lowspeed;
+ uint8_t data[6];
+
+ data[0] = (TAG_COMMS_REPLY >> 16) & 0xFF;
+ data[1] = (TAG_COMMS_REPLY >> 8) & 0xFF;
+ data[2] = TAG_COMMS_REPLY & 0xFF;
+ data[3] = 2;
+ data[4] = comms_reply_id;
+ data[5] = return_value;
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 6);
+}
+
+int en50221_app_lowspeed_send_comms_data(en50221_app_lowspeed lowspeed,
+ uint16_t session_number,
+ uint8_t phase_id,
+ uint32_t tx_data_length,
+ uint8_t *tx_data)
+{
+ struct en50221_app_lowspeed_private *private = (struct en50221_app_lowspeed_private *) lowspeed;
+ uint8_t buf[10];
+
+ // the spec defines this limit
+ if (tx_data_length > 254) {
+ return -1;
+ }
+
+ // set up the tag
+ buf[0] = (TAG_COMMS_RECV_LAST >> 16) & 0xFF;
+ buf[1] = (TAG_COMMS_RECV_LAST >> 8) & 0xFF;
+ buf[2] = TAG_COMMS_RECV_LAST & 0xFF;
+
+ // encode the length field
+ int length_field_len;
+ if ((length_field_len = asn_1_encode(tx_data_length+1, buf+3, 3)) < 0) {
+ return -1;
+ }
+
+ // the phase_id
+ buf[3+length_field_len] = phase_id;
+
+ // build the iovecs
+ struct iovec iov[2];
+ iov[0].iov_base = buf;
+ iov[0].iov_len = 3+length_field_len+1;
+ iov[1].iov_base = tx_data;
+ iov[1].iov_len = tx_data_length;
+
+ // create the data and send it
+ return private->funcs->send_datav(private->funcs->arg, session_number, iov, 2);
+}
+
+int en50221_app_lowspeed_message(en50221_app_lowspeed lowspeed,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_lowspeed_private *private = (struct en50221_app_lowspeed_private *) lowspeed;
+ (void)resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ switch(tag)
+ {
+ case TAG_COMMS_COMMAND:
+ return en50221_app_lowspeed_parse_command(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_COMMS_SEND_LAST:
+ return en50221_app_lowspeed_parse_send(private, slot_id, session_number, 1, data+3, data_length-3);
+ case TAG_COMMS_SEND_MORE:
+ return en50221_app_lowspeed_parse_send(private, slot_id, session_number, 0, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+
+
+static int en50221_app_lowspeed_parse_connect_on_channel(struct en50221_app_lowspeed_command *command,
+ uint8_t *data,
+ int data_length)
+{
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+
+ // check the tag
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+ if (tag != TAG_CONNECTION_DESCRIPTOR) {
+ print(LOG_LEVEL, ERROR, 1, "Received bad CONNECT_ON_CHANNEL\n");
+ return -1;
+ }
+ data+=3;
+ data_length-=3;
+
+ // parse the descriptor-length-field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+ data+=length_field_len;
+ data_length-=length_field_len;
+
+ // check length field
+ if (asn_data_length > data_length) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (asn_data_length < 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+
+ // get the descriptor type
+ command->u.connect_on_channel.descriptor_type = data[0];
+ data++;
+ data_length--;
+ asn_data_length--;
+
+ // deal with the descriptor itself
+ switch(command->u.connect_on_channel.descriptor_type) {
+ case CONNECTION_DESCRIPTOR_TYPE_TELEPHONE:
+ {
+ // get the raw descriptor and validate length
+ struct descriptor *d = (struct descriptor*) data;
+ if (asn_data_length < 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (asn_data_length != (2 + d->len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (d->tag != dtag_dvb_telephone) {
+ print(LOG_LEVEL, ERROR, 1, "Received invalid telephone descriptor\n");
+ return -1;
+ }
+
+ // parse the telephone descriptor
+ command->u.connect_on_channel.descriptor.telephone = dvb_telephone_descriptor_codec(d);
+ if (command->u.connect_on_channel.descriptor.telephone == NULL) {
+ print(LOG_LEVEL, ERROR, 1, "Received invalid telephone descriptor\n");
+ return -1;
+ }
+ data += 2 + d->len;
+ data_length -= 2 + d->len;
+ break;
+ }
+ case CONNECTION_DESCRIPTOR_TYPE_CABLE:
+ if (asn_data_length != 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ command->u.connect_on_channel.descriptor.cable_channel_id = data[0];
+ data++;
+ data_length--;
+ break;
+ default:
+ print(LOG_LEVEL, ERROR, 1, "Received unknown connection descriptor %02x\n",
+ command->u.connect_on_channel.descriptor_type);
+ return -1;
+ }
+
+ // parse the last bit
+ if (data_length != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ command->u.connect_on_channel.retry_count = data[0];
+ command->u.connect_on_channel.timeout = data[1];
+
+ // ok
+ return 0;
+}
+
+static int en50221_app_lowspeed_parse_command(struct en50221_app_lowspeed_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length < 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ data+=length_field_len;
+
+ // get command id
+ uint8_t command_id = data[0];
+ data++;
+ asn_data_length--;
+
+ // parse the command
+ struct en50221_app_lowspeed_command command;
+ switch(command_id) {
+ case COMMS_COMMAND_ID_CONNECT_ON_CHANNEL:
+ if (en50221_app_lowspeed_parse_connect_on_channel(&command, data, asn_data_length)) {
+ return -1;
+ }
+ break;
+ case COMMS_COMMAND_ID_SET_PARAMS:
+ if (asn_data_length != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ command.u.set_params.buffer_size = data[0];
+ command.u.set_params.timeout = data[1];
+ break;
+ case COMMS_COMMAND_ID_GET_NEXT_BUFFER:
+ if (asn_data_length != 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ command.u.get_next_buffer.phase_id = data[0];
+ break;
+
+ case COMMS_COMMAND_ID_DISCONNECT_ON_CHANNEL:
+ case COMMS_COMMAND_ID_ENQUIRE_STATUS:
+ break;
+
+ default:
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected command_id %02x\n", command_id);
+ return -1;
+ }
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_lowspeed_command_callback cb = private->command_callback;
+ void *cb_arg = private->command_callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, command_id, &command);
+ }
+ return 0;
+}
+
+static int en50221_app_lowspeed_parse_send(struct en50221_app_lowspeed_private *private,
+ uint8_t slot_id, uint16_t session_number, int more_last,
+ uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+
+ // skip over the length field
+ data += length_field_len;
+
+ // find previous session
+ pthread_mutex_lock(&private->lock);
+ struct en50221_app_lowspeed_session *cur_s = private->sessions;
+ while(cur_s) {
+ if (cur_s->session_number == session_number)
+ break;
+ cur_s=cur_s->next;
+ }
+
+ // more data is still to come
+ if (!more_last) {
+ // if there was no previous session, create one
+ if (cur_s == NULL) {
+ cur_s = malloc(sizeof(struct en50221_app_lowspeed_session));
+ if (cur_s == NULL) {
+ print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
+ pthread_mutex_unlock(&private->lock);
+ return -1;
+ }
+ cur_s->session_number = session_number;
+ cur_s->block_chain = NULL;
+ cur_s->block_length = 0;
+ cur_s->next = private->sessions;
+ private->sessions = cur_s;
+ }
+
+ // append the data
+ uint8_t *new_data = realloc(cur_s->block_chain, cur_s->block_length + asn_data_length);
+ if (new_data == NULL) {
+ print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
+ pthread_mutex_unlock(&private->lock);
+ return -1;
+ }
+ memcpy(new_data + cur_s->block_length, data, asn_data_length);
+ cur_s->block_chain = new_data;
+ cur_s->block_length += asn_data_length;
+
+ // done
+ pthread_mutex_unlock(&private->lock);
+ return 0;
+ }
+
+ // we hit the last of a possible chain of fragments
+ int do_free = 0;
+ if (cur_s != NULL) {
+ // we have a preceding fragment - need to append
+ uint8_t *new_data = realloc(cur_s->block_chain, cur_s->block_length + asn_data_length);
+ if (new_data == NULL) {
+ print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
+ pthread_mutex_unlock(&private->lock);
+ return -1;
+ }
+ memcpy(new_data + cur_s->block_length, data, asn_data_length);
+ asn_data_length = cur_s->block_length + asn_data_length;
+ data = new_data;
+ cur_s->block_chain = NULL;
+ cur_s->block_length = 0;
+ do_free = 1;
+ }
+
+ // check the reassembled data length
+ if (asn_data_length < 1) {
+ pthread_mutex_unlock(&private->lock);
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ if (do_free) free(data);
+ return -1;
+ }
+
+ // now, parse the data
+ uint8_t phase_id = data[0];
+
+ // tell the app
+ en50221_app_lowspeed_send_callback cb = private->send_callback;
+ void *cb_arg = private->send_callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ int cbstatus = 0;
+ if (cb) {
+ cbstatus = cb(cb_arg, slot_id, session_number, phase_id, data+1, asn_data_length-1);
+ }
+
+ // done
+ if (do_free) free(data);
+ return cbstatus;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_lowspeed.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_lowspeed.h
new file mode 100644
index 0000000..9f58ad9
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_lowspeed.h
@@ -0,0 +1,210 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_LOWSPEED_H__
+#define __EN50221_APPLICATION_LOWSPEED_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+#include <libucsi/dvb/descriptor.h>
+
+#define COMMS_COMMAND_ID_CONNECT_ON_CHANNEL 0x01
+#define COMMS_COMMAND_ID_DISCONNECT_ON_CHANNEL 0x02
+#define COMMS_COMMAND_ID_SET_PARAMS 0x03
+#define COMMS_COMMAND_ID_ENQUIRE_STATUS 0x04
+#define COMMS_COMMAND_ID_GET_NEXT_BUFFER 0x05
+
+#define CONNECTION_DESCRIPTOR_TYPE_TELEPHONE 0x01
+#define CONNECTION_DESCRIPTOR_TYPE_CABLE 0x02
+
+#define COMMS_REPLY_ID_CONNECT_ACK 0x01
+#define COMMS_REPLY_ID_DISCONNECT_ACK 0x02
+#define COMMS_REPLY_ID_SET_PARAMS_ACK 0x03
+#define COMMS_REPLY_ID_STATUS_REPLY 0x04
+#define COMMS_REPLY_ID_GET_NEXT_BUFFER_ACK 0x05
+#define COMMS_REPLY_ID_SEND_ACK 0x06
+
+#define EN50221_APP_LOWSPEED_RESOURCEID(DEVICE_TYPE, DEVICE_NUMBER) MKRID(96,((DEVICE_TYPE)<<2)|((DEVICE_NUMBER) & 0x03),1)
+
+
+/**
+ * Structure holding information on a received comms command.
+ */
+struct en50221_app_lowspeed_command {
+ union {
+ struct {
+ uint8_t descriptor_type; // CONNECTION_DESCRIPTOR_TYPE_*
+ uint8_t retry_count;
+ uint8_t timeout;
+ union {
+ struct dvb_telephone_descriptor *telephone;
+ uint8_t cable_channel_id;
+ } descriptor;
+ } connect_on_channel;
+
+ struct {
+ uint8_t buffer_size;
+ uint8_t timeout;
+ } set_params;
+
+ struct {
+ uint8_t phase_id;
+ } get_next_buffer;
+ } u;
+};
+
+/**
+ * Type definition for command - called when we receive a comms command.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param command_id One of the COMMS_COMMAND_ID_* values
+ * @param command Pointer to a lowspeed command structure containing the command data.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_lowspeed_command_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t command_id,
+ struct en50221_app_lowspeed_command *command);
+
+/**
+ * Type definition for send - called when we receive data to send. The block can be segmented into
+ * multiple pieces - last_more indicates the details of this.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param phase_id Comms phase id.
+ * @param data The data.
+ * @param length Number of bytes.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_lowspeed_send_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t phase_id, uint8_t *data, uint32_t length);
+
+/**
+ * Opaque type representing a lowspeed resource.
+ */
+typedef void *en50221_app_lowspeed;
+
+/**
+ * Create an instance of the lowspeed resource.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_lowspeed en50221_app_lowspeed_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of the lowspeed resource.
+ *
+ * @param lowspeed Instance to destroy.
+ */
+extern void en50221_app_lowspeed_destroy(en50221_app_lowspeed lowspeed);
+
+/**
+ * Informs the lowspeed object that a session to it has been closed - cleans up internal state.
+ *
+ * @param lowspeed lowspeed resource instance.
+ * @param session_number The session concerned.
+ */
+extern void en50221_app_lowspeed_clear_session(en50221_app_lowspeed lowspeed, uint16_t session_number);
+
+/**
+ * Register the callback for when we receive a comms command.
+ *
+ * @param lowspeed lowspeed resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_lowspeed_register_command_callback(en50221_app_lowspeed lowspeed,
+ en50221_app_lowspeed_command_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive data to send.
+ *
+ * @param lowspeed lowspeed resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_lowspeed_register_send_callback(en50221_app_lowspeed lowspeed,
+ en50221_app_lowspeed_send_callback callback, void *arg);
+
+/**
+ * Send a comms reply to the CAM.
+ *
+ * @param lowspeed lowspeed resource instance.
+ * @param session_number Session number to send it on.
+ * @param comms_reply_id One of the COMMS_REPLY_ID_* values.
+ * @param return_value Comms reply specific value.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_lowspeed_send_comms_reply(en50221_app_lowspeed lowspeed,
+ uint16_t session_number,
+ uint8_t comms_reply_id,
+ uint8_t return_value);
+
+/**
+ * Send received data to the CAM.
+ *
+ * @param lowspeed lowspeed resource instance.
+ * @param session_number Session number to send it on.
+ * @param phase_id Comms phase id.
+ * @param tx_data_length Length of data in bytes (max 254 bytes as per spec).
+ * @param tx_data Data.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_lowspeed_send_comms_data(en50221_app_lowspeed lowspeed,
+ uint16_t session_number,
+ uint8_t phase_id,
+ uint32_t tx_data_length,
+ uint8_t *tx_data);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param lowspeed lowspeed instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_lowspeed_message(en50221_app_lowspeed lowspeed,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_mmi.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_mmi.c
new file mode 100644
index 0000000..ab5c6e4
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_mmi.c
@@ -0,0 +1,1316 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include <libucsi/dvb/types.h>
+#include "en50221_app_mmi.h"
+#include "en50221_app_tags.h"
+#include "asn_1.h"
+
+struct en50221_app_mmi_session {
+ uint16_t session_number;
+
+ uint8_t *menu_block_chain;
+ uint32_t menu_block_length;
+
+ uint8_t *list_block_chain;
+ uint32_t list_block_length;
+
+ uint8_t *subtitlesegment_block_chain;
+ uint32_t subtitlesegment_block_length;
+
+ uint8_t *subtitledownload_block_chain;
+ uint32_t subtitledownload_block_length;
+
+ struct en50221_app_mmi_session *next;
+};
+
+struct en50221_app_mmi_private {
+ struct en50221_app_send_functions *funcs;
+ struct en50221_app_mmi_session *sessions;
+
+ en50221_app_mmi_close_callback closecallback;
+ void *closecallback_arg;
+
+ en50221_app_mmi_display_control_callback displaycontrolcallback;
+ void *displaycontrolcallback_arg;
+
+ en50221_app_mmi_keypad_control_callback keypadcontrolcallback;
+ void *keypadcontrolcallback_arg;
+
+ en50221_app_mmi_subtitle_segment_callback subtitlesegmentcallback;
+ void *subtitlesegmentcallback_arg;
+
+ en50221_app_mmi_scene_end_mark_callback sceneendmarkcallback;
+ void *sceneendmarkcallback_arg;
+
+ en50221_app_mmi_scene_control_callback scenecontrolcallback;
+ void *scenecontrolcallback_arg;
+
+ en50221_app_mmi_subtitle_download_callback subtitledownloadcallback;
+ void *subtitledownloadcallback_arg;
+
+ en50221_app_mmi_flush_download_callback flushdownloadcallback;
+ void *flushdownloadcallback_arg;
+
+ en50221_app_mmi_enq_callback enqcallback;
+ void *enqcallback_arg;
+
+ en50221_app_mmi_menu_callback menucallback;
+ void *menucallback_arg;
+
+ en50221_app_mmi_list_callback listcallback;
+ void *listcallback_arg;
+
+ pthread_mutex_t lock;
+};
+
+static int en50221_app_mmi_parse_close(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_mmi_parse_display_control(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_mmi_parse_keypad_control(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_mmi_parse_enq(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_mmi_parse_list_menu(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number, uint32_t tag_id,
+ int more_last, uint8_t *data, uint32_t data_length);
+static int en50221_app_mmi_parse_subtitle(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number, uint32_t tag_id,
+ int more_last, uint8_t *data, uint32_t data_length);
+static int en50221_app_mmi_parse_scene_end_mark(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_mmi_parse_scene_control(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_mmi_parse_subtitle(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number, uint32_t tag_id,
+ int more_last, uint8_t *data, uint32_t data_length);
+static int en50221_app_mmi_parse_flush_download(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_mmi_defragment(struct en50221_app_mmi_private *private,
+ uint16_t session_number,
+ uint32_t tag_id,
+ int more_last,
+ uint8_t *indata,
+ uint32_t indata_length,
+ uint8_t **outdata,
+ uint32_t *outdata_length);
+static int en50221_app_mmi_defragment_text(uint8_t *data,
+ uint32_t data_length,
+ uint8_t **outdata,
+ uint32_t *outdata_length,
+ uint32_t *outconsumed);
+
+
+
+en50221_app_mmi en50221_app_mmi_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_mmi_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_mmi_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->closecallback = NULL;
+ private->displaycontrolcallback = NULL;
+ private->keypadcontrolcallback = NULL;
+ private->subtitlesegmentcallback = NULL;
+ private->sceneendmarkcallback = NULL;
+ private->scenecontrolcallback = NULL;
+ private->subtitledownloadcallback = NULL;
+ private->flushdownloadcallback = NULL;
+ private->enqcallback = NULL;
+ private->menucallback = NULL;
+ private->listcallback = NULL;
+ private->sessions = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_mmi_destroy(en50221_app_mmi mmi)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ struct en50221_app_mmi_session *cur_s = private->sessions;
+ while(cur_s) {
+ struct en50221_app_mmi_session *next = cur_s->next;
+ if (cur_s->menu_block_chain)
+ free(cur_s->menu_block_chain);
+ if (cur_s->list_block_chain)
+ free(cur_s->list_block_chain);
+ if (cur_s->subtitlesegment_block_chain)
+ free(cur_s->subtitlesegment_block_chain);
+ if (cur_s->subtitledownload_block_chain)
+ free(cur_s->subtitledownload_block_chain);
+ free(cur_s);
+ cur_s = next;
+ }
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_mmi_clear_session(en50221_app_mmi mmi, uint16_t session_number)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ struct en50221_app_mmi_session *cur_s = private->sessions;
+ struct en50221_app_mmi_session *prev_s = NULL;
+ while(cur_s) {
+ if (cur_s->session_number == session_number) {
+ if (cur_s->menu_block_chain)
+ free(cur_s->menu_block_chain);
+ if (cur_s->list_block_chain)
+ free(cur_s->list_block_chain);
+ if (cur_s->subtitlesegment_block_chain)
+ free(cur_s->subtitlesegment_block_chain);
+ if (cur_s->subtitledownload_block_chain)
+ free(cur_s->subtitledownload_block_chain);
+ if (prev_s) {
+ prev_s->next = cur_s->next;
+ } else {
+ private->sessions = cur_s->next;
+ }
+ free(cur_s);
+ return;
+ }
+
+ prev_s = cur_s;
+ cur_s=cur_s->next;
+ }
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_close_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_close_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->closecallback = callback;
+ private->closecallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_display_control_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_display_control_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->displaycontrolcallback = callback;
+ private->displaycontrolcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_keypad_control_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_keypad_control_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->keypadcontrolcallback = callback;
+ private->keypadcontrolcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_subtitle_segment_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_subtitle_segment_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->subtitlesegmentcallback = callback;
+ private->subtitlesegmentcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_scene_end_mark_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_scene_end_mark_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->sceneendmarkcallback = callback;
+ private->sceneendmarkcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_scene_control_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_scene_control_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->scenecontrolcallback = callback;
+ private->scenecontrolcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_subtitle_download_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_subtitle_download_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->subtitledownloadcallback = callback;
+ private->subtitledownloadcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_flush_download_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_flush_download_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->flushdownloadcallback = callback;
+ private->flushdownloadcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_enq_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_enq_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->enqcallback = callback;
+ private->enqcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_menu_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_menu_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->menucallback = callback;
+ private->menucallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_mmi_register_list_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_list_callback callback, void *arg)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+
+ pthread_mutex_lock(&private->lock);
+ private->listcallback = callback;
+ private->listcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_mmi_close(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t cmd_id,
+ uint8_t delay)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+ uint8_t data[6];
+ int data_length = 5;
+
+ data[0] = (TAG_CLOSE_MMI >> 16) & 0xFF;
+ data[1] = (TAG_CLOSE_MMI >> 8) & 0xFF;
+ data[2] = TAG_CLOSE_MMI & 0xFF;
+ data[3] = 1;
+ data[4] = cmd_id;
+ if (cmd_id == MMI_CLOSE_MMI_CMD_ID_DELAY) {
+ data[3] = 2;
+ data[5] = delay;
+ data_length = 6;
+ }
+ return private->funcs->send_data(private->funcs->arg, session_number, data, data_length);
+}
+
+int en50221_app_mmi_display_reply(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t reply_id,
+ struct en502221_app_mmi_display_reply_details *details)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+ uint8_t data[32];
+ struct iovec iov[2];
+ uint32_t iov_count;
+ int length_field_len;
+
+ // fill out the start of the header
+ data[0] = (TAG_DISPLAY_REPLY >> 16) & 0xFF;
+ data[1] = (TAG_DISPLAY_REPLY >> 8) & 0xFF;
+ data[2] = TAG_DISPLAY_REPLY & 0xFF;
+
+ switch(reply_id) {
+ case MMI_DISPLAY_REPLY_ID_MMI_MODE_ACK:
+ data[3] = 2;
+ data[4] = reply_id;
+ data[5] = details->u.mode_ack.mmi_mode;
+ iov[0].iov_base = data;
+ iov[0].iov_len = 6;
+ iov_count = 1;
+ break;
+
+ case MMI_DISPLAY_REPLY_ID_LIST_DISPLAY_CHAR_TABLES:
+ case MMI_DISPLAY_REPLY_ID_LIST_INPUT_CHAR_TABLES:
+ if ((length_field_len = asn_1_encode(details->u.char_table.table_length+1, data+3, 3)) < 0) {
+ return -1;
+ }
+ data[3+length_field_len] = reply_id;
+ iov[0].iov_base = data;
+ iov[0].iov_len = 3+length_field_len+1;
+ iov[1].iov_base = details->u.char_table.table;
+ iov[1].iov_len = details->u.char_table.table_length;
+ iov_count = 2;
+ break;
+
+ case MMI_DISPLAY_REPLY_ID_LIST_OVERLAY_GFX_CHARACTERISTICS:
+ case MMI_DISPLAY_REPLY_ID_LIST_FULLSCREEN_GFX_CHARACTERISTICS:
+ {
+ if ((length_field_len = asn_1_encode(1+9+(details->u.gfx.num_pixel_depths*2), data+3, 3)) < 0) {
+ return -1;
+ }
+ data[3+length_field_len] = reply_id;
+ data[3+length_field_len+1] = details->u.gfx.width >> 8;
+ data[3+length_field_len+2] = details->u.gfx.width;
+ data[3+length_field_len+3] = details->u.gfx.height >> 8;
+ data[3+length_field_len+4] = details->u.gfx.height;
+ data[3+length_field_len+5] = ((details->u.gfx.aspect_ratio & 0x0f) << 4) |
+ ((details->u.gfx.gfx_relation_to_video & 0x07) << 1) |
+ (details->u.gfx.multiple_depths & 1);
+ data[3+length_field_len+6] = details->u.gfx.display_bytes >> 4;
+ data[3+length_field_len+7] = ((details->u.gfx.display_bytes & 0x0f) << 4) |
+ ((details->u.gfx.composition_buffer_bytes & 0xf0) >> 4);
+ data[3+length_field_len+8] = ((details->u.gfx.composition_buffer_bytes & 0x0f) << 4) |
+ ((details->u.gfx.object_cache_bytes & 0xf0) >> 4);
+ data[3+length_field_len+9] = ((details->u.gfx.object_cache_bytes & 0x0f) << 4) |
+ (details->u.gfx.num_pixel_depths & 0x0f);
+
+ // render the pixel depths themselves
+ uint8_t *pixdepths = alloca(details->u.gfx.num_pixel_depths * 2);
+ if (pixdepths == NULL) {
+ return -1;
+ }
+ uint32_t i;
+ for(i=0; i < details->u.gfx.num_pixel_depths; i++) {
+ pixdepths[0] = ((details->u.gfx.pixel_depths[i].display_depth & 0x07) << 5) |
+ ((details->u.gfx.pixel_depths[i].pixels_per_byte & 0x07) << 2);
+ pixdepths[1] = details->u.gfx.pixel_depths[i].region_overhead;
+ pixdepths+=2;
+ }
+
+ // make up the iovs
+ iov[0].iov_base = data;
+ iov[0].iov_len = 3+length_field_len+10;
+ iov[1].iov_base = pixdepths;
+ iov[1].iov_len = details->u.gfx.num_pixel_depths *2;
+ iov_count = 2;
+ break;
+ }
+
+ default:
+ data[3] = 1;
+ data[4] = reply_id;
+ iov[0].iov_base = data;
+ iov[0].iov_len = 5;
+ iov_count = 1;
+ break;
+ }
+
+ // sendit
+ return private->funcs->send_datav(private->funcs->arg, session_number, iov, iov_count);
+}
+
+int en50221_app_mmi_keypress(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t keycode)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+ uint8_t data[5];
+
+ data[0] = (TAG_KEYPRESS >> 16) & 0xFF;
+ data[1] = (TAG_KEYPRESS >> 8) & 0xFF;
+ data[2] = TAG_KEYPRESS & 0xFF;
+ data[3] = 1;
+ data[4] = keycode;
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 5);
+}
+
+int en50221_app_mmi_display_message(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t display_message_id)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+ uint8_t data[5];
+
+ data[0] = (TAG_DISPLAY_MESSAGE >> 16) & 0xFF;
+ data[1] = (TAG_DISPLAY_MESSAGE >> 8) & 0xFF;
+ data[2] = TAG_DISPLAY_MESSAGE & 0xFF;
+ data[3] = 1;
+ data[4] = display_message_id;
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 5);
+}
+
+int en50221_app_mmi_scene_done(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t decoder_continue,
+ uint8_t scene_reveal,
+ uint8_t scene_tag)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+ uint8_t data[5];
+
+ data[0] = (TAG_SCENE_DONE >> 16) & 0xFF;
+ data[1] = (TAG_SCENE_DONE >> 8) & 0xFF;
+ data[2] = TAG_SCENE_DONE & 0xFF;
+ data[3] = 1;
+ data[4] = (decoder_continue ? 0x80 : 0x00) |
+ (scene_reveal ? 0x40 : 0x00) |
+ (scene_tag & 0x0f);
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 5);
+}
+
+int en50221_app_mmi_download_reply(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint16_t object_id,
+ uint8_t download_reply_id)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+ uint8_t data[7];
+
+ data[0] = (TAG_DOWNLOAD_REPLY >> 16) & 0xFF;
+ data[1] = (TAG_DOWNLOAD_REPLY >> 8) & 0xFF;
+ data[2] = TAG_DOWNLOAD_REPLY & 0xFF;
+ data[3] = 3;
+ data[4] = object_id >> 8;
+ data[5] = object_id;
+ data[6] = download_reply_id;
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 7);
+}
+
+int en50221_app_mmi_answ(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t answ_id,
+ uint8_t *text,
+ uint32_t text_count)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+ uint8_t buf[10];
+
+ // set up the tag
+ buf[0] = (TAG_ANSWER >> 16) & 0xFF;
+ buf[1] = (TAG_ANSWER >> 8) & 0xFF;
+ buf[2] = TAG_ANSWER & 0xFF;
+
+ // encode the length field
+ struct iovec iov[2];
+ int length_field_len = 0;
+ int iov_count = 1;
+ if (answ_id == MMI_ANSW_ID_ANSWER) {
+ if ((length_field_len = asn_1_encode(text_count+1, buf+3, 3)) < 0) {
+ return -1;
+ }
+ buf[3+length_field_len] = answ_id;
+
+ iov[0].iov_base = buf;
+ iov[0].iov_len = 3+length_field_len+1;
+ iov[1].iov_base = text;
+ iov[1].iov_len = text_count;
+ iov_count=2;
+ } else {
+ buf[3] = 1;
+ buf[4] = answ_id;
+ iov[0].iov_base = buf;
+ iov[0].iov_len = 5;
+ iov_count = 1;
+ }
+
+ // create the data and send it
+ return private->funcs->send_datav(private->funcs->arg, session_number, iov, iov_count);
+}
+
+int en50221_app_mmi_menu_answ(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t choice_ref)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+ uint8_t data[5];
+
+ data[0] = (TAG_MENU_ANSWER >> 16) & 0xFF;
+ data[1] = (TAG_MENU_ANSWER >> 8) & 0xFF;
+ data[2] = TAG_MENU_ANSWER & 0xFF;
+ data[3] = 1;
+ data[4] = choice_ref;
+ return private->funcs->send_data(private->funcs->arg, session_number, data, 5);
+}
+
+int en50221_app_mmi_message(en50221_app_mmi mmi,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_mmi_private *private = (struct en50221_app_mmi_private *) mmi;
+ (void) resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ switch(tag)
+ {
+ case TAG_CLOSE_MMI:
+ return en50221_app_mmi_parse_close(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_DISPLAY_CONTROL:
+ return en50221_app_mmi_parse_display_control(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_KEYPAD_CONTROL:
+ return en50221_app_mmi_parse_keypad_control(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_ENQUIRY:
+ return en50221_app_mmi_parse_enq(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_MENU_LAST:
+ return en50221_app_mmi_parse_list_menu(private, slot_id, session_number, tag, 1, data+3, data_length-3);
+ case TAG_MENU_MORE:
+ return en50221_app_mmi_parse_list_menu(private, slot_id, session_number, tag, 0, data+3, data_length-3);
+ case TAG_LIST_LAST:
+ return en50221_app_mmi_parse_list_menu(private, slot_id, session_number, tag, 1, data+3, data_length-3);
+ case TAG_LIST_MORE:
+ return en50221_app_mmi_parse_list_menu(private, slot_id, session_number, tag, 0, data+3, data_length-3);
+ case TAG_SUBTITLE_SEGMENT_LAST:
+ return en50221_app_mmi_parse_subtitle(private, slot_id, session_number, tag, 1, data+3, data_length-3);
+ case TAG_SUBTITLE_SEGMENT_MORE:
+ return en50221_app_mmi_parse_subtitle(private, slot_id, session_number, tag, 0, data+3, data_length-3);
+ case TAG_SCENE_END_MARK:
+ return en50221_app_mmi_parse_scene_end_mark(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_SCENE_CONTROL:
+ return en50221_app_mmi_parse_scene_control(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_SUBTITLE_DOWNLOAD_LAST:
+ return en50221_app_mmi_parse_subtitle(private, slot_id, session_number, tag, 1, data+3, data_length-3);
+ case TAG_SUBTITLE_DOWNLOAD_MORE:
+ return en50221_app_mmi_parse_subtitle(private, slot_id, session_number, tag, 0, data+3, data_length-3);
+ case TAG_FLUSH_DOWNLOAD:
+ return en50221_app_mmi_parse_flush_download(private, slot_id, session_number, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+
+
+
+
+static int en50221_app_mmi_parse_close(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // validate data
+ if (data_length < 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] > (data_length-1)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t cmd_id = data[1];
+ uint8_t delay = 0;
+ if (cmd_id == MMI_CLOSE_MMI_CMD_ID_DELAY) {
+ if (data[0] != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ delay = data[2];
+ }
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_mmi_close_callback cb = private->closecallback;
+ void *cb_arg = private->closecallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, cmd_id, delay);
+ }
+ return 0;
+}
+
+static int en50221_app_mmi_parse_display_control(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // validate data
+ if (data_length < 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] > (data_length-1)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t cmd_id = data[1];
+ uint8_t mmi_mode = 0;
+ if (cmd_id == MMI_DISPLAY_CONTROL_CMD_ID_SET_MMI_MODE) {
+ if (data[0] != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ mmi_mode = data[2];
+ }
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_mmi_display_control_callback cb = private->displaycontrolcallback;
+ void *cb_arg = private->displaycontrolcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, cmd_id, mmi_mode);
+ }
+ return 0;
+}
+
+static int en50221_app_mmi_parse_keypad_control(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (asn_data_length < 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+
+ // skip over the length field
+ data += length_field_len;
+
+ // extract the information
+ uint8_t cmd_id = data[0];
+ uint8_t *keycodes = data+1;
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_mmi_keypad_control_callback cb = private->keypadcontrolcallback;
+ void *cb_arg = private->keypadcontrolcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, cmd_id, keycodes, asn_data_length-1);
+ }
+ return 0;
+}
+
+static int en50221_app_mmi_parse_enq(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (asn_data_length < 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+
+ // skip over the length field
+ data += length_field_len;
+
+ // extract the information
+ uint8_t blind_answer = (data[0] & 0x01) ? 1 : 0;
+ uint8_t answer_length = data[1];
+ uint8_t *text = data+2;
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_mmi_enq_callback cb = private->enqcallback;
+ void *cb_arg = private->enqcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, blind_answer, answer_length, text, asn_data_length - 2);
+ }
+ return 0;
+}
+
+static int en50221_app_mmi_parse_list_menu(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number, uint32_t tag_id,
+ int more_last, uint8_t *data, uint32_t data_length)
+{
+ int result = 0;
+ uint8_t *text_flags = NULL;
+ struct en50221_app_mmi_text *text_data = NULL;
+ uint32_t i;
+ uint8_t text_count = 0;
+
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+
+ // skip over the length field
+ data += length_field_len;
+
+ // defragment
+ pthread_mutex_lock(&private->lock);
+ uint8_t *outdata;
+ uint32_t outdata_length;
+ int dfstatus = en50221_app_mmi_defragment(private, session_number, tag_id, more_last,
+ data, asn_data_length,
+ &outdata, &outdata_length);
+ if (dfstatus <= 0) {
+ pthread_mutex_unlock(&private->lock);
+ return dfstatus;
+ }
+ data = outdata;
+ data_length = outdata_length;
+
+ // check the reassembled data length
+ if (data_length < 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ pthread_mutex_unlock(&private->lock);
+ result = -1;
+ goto exit_cleanup;
+ }
+
+ // now, parse the data
+ uint8_t choice_nb = data[0];
+ text_count = choice_nb + 3;
+ if (choice_nb == 0xff) text_count = 3;
+ data++;
+ data_length--;
+
+ // variables for extracted text state
+ text_flags = alloca(text_count);
+ if (text_flags == NULL) {
+ pthread_mutex_unlock(&private->lock);
+ result = -1;
+ goto exit_cleanup;
+ }
+ memset(text_flags, 0, text_count);
+ text_data = (struct en50221_app_mmi_text*) alloca(sizeof(struct en50221_app_mmi_text) * text_count);
+ if (text_data == NULL) {
+ pthread_mutex_unlock(&private->lock);
+ result = -1;
+ goto exit_cleanup;
+ }
+ memset(text_data, 0, sizeof(struct en50221_app_mmi_text) * text_count);
+
+ // extract the text!
+ for(i=0; i<text_count; i++) {
+ uint32_t consumed = 0;
+ int cur_status = en50221_app_mmi_defragment_text(data, data_length,
+ &text_data[i].text, &text_data[i].text_length,
+ &consumed);
+ if (cur_status < 0) {
+ pthread_mutex_unlock(&private->lock);
+ result = -1;
+ goto exit_cleanup;
+ }
+
+ text_flags[i] = cur_status;
+ data += consumed;
+ data_length -= consumed;
+ }
+
+ // work out what to pass to the user
+ struct en50221_app_mmi_text *text_data_for_user =
+ (struct en50221_app_mmi_text*) alloca(sizeof(struct en50221_app_mmi_text) * text_count);
+ if (text_data_for_user == NULL) {
+ result = -1;
+ goto exit_cleanup;
+ }
+ memcpy(text_data_for_user, text_data, sizeof(struct en50221_app_mmi_text) * text_count);
+ struct en50221_app_mmi_text *text_ptr = NULL;
+ if (text_count > 3) {
+ text_ptr = &text_data_for_user[3];
+ }
+ uint8_t *items_raw = NULL;
+ uint32_t items_raw_length = 0;
+ if (choice_nb == 0xff) {
+ items_raw = data;
+ items_raw_length = data_length;
+ }
+
+ // do callback
+ result = 0;
+ switch(tag_id) {
+ case TAG_MENU_LAST:
+ {
+ en50221_app_mmi_menu_callback cb = private->menucallback;
+ void *cb_arg = private->menucallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ result = cb(cb_arg, slot_id, session_number,
+ &text_data_for_user[0],
+ &text_data_for_user[1],
+ &text_data_for_user[2],
+ text_count-3,
+ text_ptr,
+ items_raw_length,
+ items_raw);
+ }
+ break;
+ }
+
+ case TAG_LIST_LAST:
+ {
+ en50221_app_mmi_list_callback cb = private->listcallback;
+ void *cb_arg = private->listcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ result = cb(cb_arg, slot_id, session_number,
+ &text_data_for_user[0],
+ &text_data_for_user[1],
+ &text_data_for_user[2],
+ text_count-3,
+ text_ptr,
+ items_raw_length,
+ items_raw);
+ }
+ break;
+ }
+
+ default:
+ pthread_mutex_unlock(&private->lock);
+ break;
+ }
+
+exit_cleanup:
+ if ((dfstatus == 2) && outdata) free(outdata);
+ if (text_flags && text_data) {
+ for(i=0; i< text_count; i++) {
+ if ((text_flags[i] == 2) && text_data[i].text) {
+ free(text_data[i].text);
+ }
+ }
+ }
+ return result;
+}
+
+static int en50221_app_mmi_parse_subtitle(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number, uint32_t tag_id,
+ int more_last, uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+
+ // skip over the length field
+ data += length_field_len;
+
+ // defragment
+ pthread_mutex_lock(&private->lock);
+ uint8_t *outdata;
+ uint32_t outdata_length;
+ int dfstatus = en50221_app_mmi_defragment(private, session_number, tag_id, more_last,
+ data, asn_data_length,
+ &outdata, &outdata_length);
+ if (dfstatus <= 0) {
+ pthread_mutex_unlock(&private->lock);
+ return dfstatus;
+ }
+
+ // do callback
+ int cbstatus = 0;
+ switch(tag_id) {
+ case TAG_SUBTITLE_SEGMENT_LAST:
+ {
+ en50221_app_mmi_subtitle_segment_callback cb = private->subtitlesegmentcallback;
+ void *cb_arg = private->subtitlesegmentcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ cbstatus = cb(cb_arg, slot_id, session_number, outdata, outdata_length);
+ }
+ break;
+ }
+
+ case TAG_SUBTITLE_DOWNLOAD_LAST:
+ {
+ en50221_app_mmi_subtitle_download_callback cb = private->subtitledownloadcallback;
+ void *cb_arg = private->subtitledownloadcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ cbstatus = cb(cb_arg, slot_id, session_number, outdata, outdata_length);
+ }
+ break;
+ }
+ }
+
+ // free the data returned by the defragment call if asked to
+ if (dfstatus == 2) {
+ free(outdata);
+ }
+
+ // done
+ return cbstatus;
+}
+
+static int en50221_app_mmi_parse_scene_end_mark(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // validate data
+ if (data_length != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] != 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t flags = data[1];
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_mmi_scene_end_mark_callback cb = private->sceneendmarkcallback;
+ void *cb_arg = private->sceneendmarkcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number,
+ (flags & 0x80) ? 1 : 0,
+ (flags & 0x40) ? 1 : 0,
+ (flags & 0x20) ? 1 : 0,
+ flags & 0x0f);
+ }
+ return 0;
+}
+
+static int en50221_app_mmi_parse_scene_control(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // validate data
+ if (data_length != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] != 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t flags = data[1];
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_mmi_scene_control_callback cb = private->scenecontrolcallback;
+ void *cb_arg = private->scenecontrolcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number,
+ (flags & 0x80) ? 1 : 0,
+ (flags & 0x40) ? 1 : 0,
+ flags & 0x0f);
+ }
+ return 0;
+}
+
+static int en50221_app_mmi_parse_flush_download(struct en50221_app_mmi_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // validate data
+ if (data_length != 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] != 0) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_mmi_flush_download_callback cb = private->flushdownloadcallback;
+ void *cb_arg = private->flushdownloadcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number);
+ }
+ return 0;
+}
+
+static int en50221_app_mmi_defragment(struct en50221_app_mmi_private *private,
+ uint16_t session_number,
+ uint32_t tag_id,
+ int more_last,
+ uint8_t *indata,
+ uint32_t indata_length,
+ uint8_t **outdata,
+ uint32_t *outdata_length)
+{
+ struct en50221_app_mmi_session *cur_s = private->sessions;
+ while(cur_s) {
+ if (cur_s->session_number == session_number)
+ break;
+ cur_s=cur_s->next;
+ }
+
+ // more data is still to come
+ if (!more_last) {
+ // if there was no previous session, create one
+ if (cur_s == NULL) {
+ cur_s = malloc(sizeof(struct en50221_app_mmi_session));
+ if (cur_s == NULL) {
+ print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
+ return -1;
+ }
+ cur_s->session_number = session_number;
+ cur_s->menu_block_chain = NULL;
+ cur_s->menu_block_length = 0;
+ cur_s->list_block_chain = NULL;
+ cur_s->list_block_length = 0;
+ cur_s->subtitlesegment_block_chain = NULL;
+ cur_s->subtitlesegment_block_length = 0;
+ cur_s->subtitledownload_block_chain = NULL;
+ cur_s->subtitledownload_block_length = 0;
+ cur_s->next = private->sessions;
+ private->sessions = cur_s;
+ }
+
+ // find the block/block_length to use
+ uint8_t **block_chain;
+ uint32_t *block_length;
+ switch(tag_id) {
+ case TAG_MENU_LAST:
+ case TAG_MENU_MORE:
+ block_chain = &cur_s->menu_block_chain;
+ block_length = &cur_s->menu_block_length;
+ break;
+ case TAG_LIST_LAST:
+ case TAG_LIST_MORE:
+ block_chain = &cur_s->list_block_chain;
+ block_length = &cur_s->list_block_length;
+ break;
+ case TAG_SUBTITLE_SEGMENT_LAST:
+ case TAG_SUBTITLE_SEGMENT_MORE:
+ block_chain = &cur_s->subtitlesegment_block_chain;
+ block_length = &cur_s->subtitlesegment_block_length;
+ break;
+ case TAG_SUBTITLE_DOWNLOAD_LAST:
+ case TAG_SUBTITLE_DOWNLOAD_MORE:
+ block_chain = &cur_s->subtitledownload_block_chain;
+ block_length = &cur_s->subtitledownload_block_length;
+ break;
+ default:
+ return -1;
+ }
+
+ // append the data
+ uint8_t *new_data = realloc(*block_chain, *block_length + indata_length);
+ if (new_data == NULL) {
+ print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
+ return -1;
+ }
+ memcpy(new_data + *block_length, indata, indata_length);
+ *block_chain = new_data;
+ *block_length += indata_length;
+
+ // success, but block not complete yet
+ return 0;
+ }
+
+ // we hit the last of a possible chain of fragments
+ if (cur_s != NULL) {
+ // find the block/block_length to use
+ uint8_t **block_chain;
+ uint32_t *block_length;
+ switch(tag_id) {
+ case TAG_MENU_LAST:
+ case TAG_MENU_MORE:
+ block_chain = &cur_s->menu_block_chain;
+ block_length = &cur_s->menu_block_length;
+ break;
+ case TAG_LIST_LAST:
+ case TAG_LIST_MORE:
+ block_chain = &cur_s->list_block_chain;
+ block_length = &cur_s->list_block_length;
+ break;
+ case TAG_SUBTITLE_SEGMENT_LAST:
+ case TAG_SUBTITLE_SEGMENT_MORE:
+ block_chain = &cur_s->subtitlesegment_block_chain;
+ block_length = &cur_s->subtitlesegment_block_length;
+ break;
+ case TAG_SUBTITLE_DOWNLOAD_LAST:
+ case TAG_SUBTITLE_DOWNLOAD_MORE:
+ block_chain = &cur_s->subtitledownload_block_chain;
+ block_length = &cur_s->subtitledownload_block_length;
+ break;
+ default:
+ return -1;
+ }
+
+ // we have a preceding fragment - need to append
+ uint8_t *new_data = realloc(*block_chain, *block_length + indata_length);
+ if (new_data == NULL) {
+ print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
+ return -1;
+ }
+ memcpy(new_data + *block_length, indata, indata_length);
+ *outdata_length = *block_length + indata_length;
+ *outdata = new_data;
+ *block_chain = NULL;
+ *block_length = 0;
+
+ // success, and indicate to free the block when done
+ return 2;
+ }
+
+ // success, but indicate it is not to be freed
+ *outdata_length = indata_length;
+ *outdata = indata;
+ return 1;
+}
+
+static int en50221_app_mmi_defragment_text(uint8_t *data,
+ uint32_t data_length,
+ uint8_t **outdata,
+ uint32_t *outdata_length,
+ uint32_t *outconsumed)
+{
+ uint8_t *text = NULL;
+ uint32_t text_length = 0;
+ uint32_t consumed = 0;
+
+ while(1) {
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Short data\n");
+ if (text) free(text);
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+ data += 3;
+ data_length -=3;
+ consumed += 3;
+
+ // get the length of the data and adjust
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ if (text) free(text);
+ return -1;
+ }
+ data += length_field_len;
+ data_length -= length_field_len;
+ consumed += length_field_len;
+
+ // deal with the tags
+ if (tag == TAG_TEXT_LAST) {
+ if (text == NULL) {
+ *outdata = data;
+ *outdata_length = asn_data_length;
+ *outconsumed = consumed + asn_data_length;
+ return 1;
+ } else {
+ // append the data
+ uint8_t *new_text = realloc(text, text_length + asn_data_length);
+ if (new_text == NULL) {
+ print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
+ if (text) free(text);
+ return -1;
+ }
+ memcpy(new_text + text_length, data, asn_data_length);
+ *outdata = new_text;
+ *outdata_length = text_length + asn_data_length;
+ *outconsumed = consumed + asn_data_length;
+ return 2;
+ }
+
+ } else if (tag == TAG_TEXT_MORE) {
+ // append the data
+ uint8_t *new_text = realloc(text, text_length + asn_data_length);
+ if (new_text == NULL) {
+ print(LOG_LEVEL, ERROR, 1, "Ran out of memory\n");
+ if (text) free(text);
+ return -1;
+ }
+ memcpy(new_text + text_length, data, asn_data_length);
+ text = new_text;
+ text_length += asn_data_length;
+
+ // consume the data
+ data += asn_data_length;
+ data_length -= asn_data_length;
+ consumed += asn_data_length;
+ } else {
+ // unknown tag
+ print(LOG_LEVEL, ERROR, 1, "Unknown MMI text tag\n");
+ if (text) free(text);
+ return -1;
+ }
+ }
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_mmi.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_mmi.h
new file mode 100644
index 0000000..b5e3abf
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_mmi.h
@@ -0,0 +1,571 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_mmi_H__
+#define __EN50221_APPLICATION_mmi_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+
+#define EN50221_APP_MMI_RESOURCEID MKRID(64,1,1)
+
+#define MMI_CLOSE_MMI_CMD_ID_IMMEDIATE 0x00
+#define MMI_CLOSE_MMI_CMD_ID_DELAY 0x01
+
+#define MMI_DISPLAY_CONTROL_CMD_ID_SET_MMI_MODE 0x01
+#define MMI_DISPLAY_CONTROL_CMD_ID_GET_DISPLAY_CHAR_TABLES 0x02
+#define MMI_DISPLAY_CONTROL_CMD_ID_GET_INPUT_CHAR_TABLES 0x03
+#define MMI_DISPLAY_CONTROL_CMD_ID_GET_OVERLAY_GFX_CHARACTERISTICS 0x04
+#define MMI_DISPLAY_CONTROL_CMD_ID_GET_FULLSCREEN_GFX_CHARACTERISTICS 0x05
+
+#define MMI_DISPLAY_REPLY_ID_MMI_MODE_ACK 0x01
+#define MMI_DISPLAY_REPLY_ID_LIST_DISPLAY_CHAR_TABLES 0x02
+#define MMI_DISPLAY_REPLY_ID_LIST_INPUT_CHAR_TABLES 0x03
+#define MMI_DISPLAY_REPLY_ID_LIST_OVERLAY_GFX_CHARACTERISTICS 0x04
+#define MMI_DISPLAY_REPLY_ID_LIST_FULLSCREEN_GFX_CHARACTERISTICS 0x05
+#define MMI_DISPLAY_REPLY_ID_UNKNOWN_CMD_ID 0xF0
+#define MMI_DISPLAY_REPLY_ID_UNKNOWN_MMI_MODE 0xF1
+#define MMI_DISPLAY_REPLY_ID_UNKNOWN_CHAR_TABLE 0xF2
+
+#define MMI_MODE_HIGH_LEVEL 0x01
+#define MMI_MODE_LOW_LEVEL_OVERLAY_GFX 0x02
+#define MMI_MODE_LOW_LEVEL_FULLSCREEN_GFX 0x03
+
+#define MMI_KEYPAD_CONTROL_CMD_ID_INTERCEPT_ALL 0x01
+#define MMI_KEYPAD_CONTROL_CMD_ID_IGNORE_ALL 0x02
+#define MMI_KEYPAD_CONTROL_CMD_ID_INTERCEPT_SELECTED 0x03
+#define MMI_KEYPAD_CONTROL_CMD_ID_IGNORE_SELECTED 0x04
+#define MMI_KEYPAD_CONTROL_CMD_ID_REJECT_KEYPRESS 0x05
+
+#define MMI_GFX_VIDEO_RELATION_NONE 0x00
+#define MMI_GFX_VIDEO_RELATION_MATCHES_EXACTLY 0x07
+
+#define MMI_DISPLAY_MESSAGE_ID_OK 0x00
+#define MMI_DISPLAY_MESSAGE_ID_ERROR 0x01
+#define MMI_DISPLAY_MESSAGE_ID_OUT_OF_MEMORY 0x02
+#define MMI_DISPLAY_MESSAGE_ID_SUBTITLE_SYNTAX_ERROR 0x03
+#define MMI_DISPLAY_MESSAGE_ID_UNDEFINED_REGION 0x04
+#define MMI_DISPLAY_MESSAGE_ID_UNDEFINED_CLUT 0x05
+#define MMI_DISPLAY_MESSAGE_ID_UNDEFINED_OBJECT 0x06
+#define MMI_DISPLAY_MESSAGE_ID_INCOMPATABLE_OBJECT 0x07
+#define MMI_DISPLAY_MESSAGE_ID_UNKNOWN_CHARACTER 0x08
+#define MMI_DISPLAY_MESSAGE_ID_DISPLAY_CHANGED 0x09
+
+#define MMI_DOWNLOAD_REPLY_ID_OK 0x00
+#define MMI_DOWNLOAD_REPLY_ID_NOT_OBJECT_SEGMENT 0x01
+#define MMI_DOWNLOAD_REPLY_ID_OUT_OF_MEMORY 0x02
+
+#define MMI_ANSW_ID_CANCEL 0x00
+#define MMI_ANSW_ID_ANSWER 0x01
+
+/**
+ * A pixel depth as supplied with display_reply details
+ */
+struct en50221_app_mmi_pixel_depth {
+ uint8_t display_depth;
+ uint8_t pixels_per_byte;
+ uint8_t region_overhead;
+};
+
+/**
+ * Details returned with a display_reply
+ */
+struct en502221_app_mmi_display_reply_details {
+ union {
+ struct {
+ uint16_t width;
+ uint16_t height;
+ uint8_t aspect_ratio;
+ uint8_t gfx_relation_to_video; /* one of MMI_GFX_VIDEO_RELATION_* */
+ uint8_t multiple_depths;
+ uint16_t display_bytes;
+ uint8_t composition_buffer_bytes;
+ uint8_t object_cache_bytes;
+ uint8_t num_pixel_depths;
+ struct en50221_app_mmi_pixel_depth *pixel_depths;
+ } gfx; /* MMI_DISPLAY_REPLY_ID_LIST_OVERLAY_GFX_CHARACTERISTICS or
+ MMI_DISPLAY_REPLY_ID_LIST_FULLSCREEN_GFX_CHARACTERISTICS */
+
+ struct {
+ uint32_t table_length;
+ uint8_t *table;
+ } char_table; /* MMI_DISPLAY_REPLY_ID_LIST_DISPLAY_CHAR_TABLES or
+ MMI_DISPLAY_REPLY_ID_LIST_INPUT_CHAR_TABLES */
+
+ struct {
+ uint8_t mmi_mode; /* one of the MMI_MODE_* values */
+ } mode_ack; /* for MMI_DISPLAY_REPLY_ID_MMI_MODE_ACK */
+ } u;
+};
+
+/**
+ * Pointer to a text string.
+ */
+struct en50221_app_mmi_text {
+ uint8_t *text;
+ uint32_t text_length;
+};
+
+/**
+ * Type definition for close - called when we receive an mmi_close from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param cmd_id One of the MMI_CLOSE_MMI_CMD_ID_* values.
+ * @param delay Delay supplied with MMI_CLOSE_MMI_CMD_ID_DELAY.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_close_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t cmd_id, uint8_t delay);
+
+/**
+ * Type definition for display_control callback.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param cmd_id One of the MMI_DISPLAY_CONTROL_CMD_ID_* values.
+ * @param delay One of the MMI_MODE_* values.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_display_control_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t cmd_id, uint8_t mmi_mode);
+
+/**
+ * Type definition for keypad_control callback.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param cmd_id One of the MMI_KEYPAD_CONTROL_CMD_ID_* values.
+ * @param key_codes Pointer to the key codes.
+ * @param key_codes_count Number of key codes.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_keypad_control_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t cmd_id, uint8_t *key_codes, uint32_t key_codes_count);
+
+/**
+ * Type definition for subtitle_segment callback.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param segment Pointer to the segment data.
+ * @param segment_size Size of segment data.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_subtitle_segment_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t *segment, uint32_t segment_size);
+
+/**
+ * Type definition for scene_end_mark callback.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param decoder_continue_flag
+ * @param scene_reveal_flag
+ * @param send_scene_done
+ * @param scene_tag
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_scene_end_mark_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t decoder_continue_flag, uint8_t scene_reveal_flag,
+ uint8_t send_scene_done, uint8_t scene_tag);
+
+/**
+ * Type definition for scene_control callback.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param decoder_continue_flag
+ * @param scene_reveal_flag
+ * @param scene_tag
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_scene_control_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t decoder_continue_flag, uint8_t scene_reveal_flag,
+ uint8_t scene_tag);
+
+/**
+ * Type definition for subtitle_download callback.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param segment Pointer to the segment data.
+ * @param segment_size Size of segment data.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_subtitle_download_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t *segment, uint32_t segment_size);
+
+/**
+ * Type definition for flush_download callback.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_flush_download_callback)(void *arg, uint8_t slot_id, uint16_t session_number);
+
+/**
+ * Type definition for enq callback.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param blind_answer 1=>Obscure text input in some manner,
+ * @param expected_answer_length Expected max number of characters to be returned.
+ * @param text Pointer to the text data.
+ * @param text_size Size of text data.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_enq_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t blind_answer, uint8_t expected_answer_length,
+ uint8_t *text, uint32_t text_size);
+
+/**
+ * Type definition for menu callback.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param title Title text.
+ * @param sub_title Sub-Title text.
+ * @param bottom Bottom text.
+ * @param item_count Number of text elements in items.
+ * @param items Pointer to array of en50221_app_mmi_text structures which are standard menu choices,
+ * @param item_raw_length Length of item raw data.
+ * @param items_raw If nonstandard items were supplied, pointer to their data.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_menu_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ struct en50221_app_mmi_text *title,
+ struct en50221_app_mmi_text *sub_title,
+ struct en50221_app_mmi_text *bottom,
+ uint32_t item_count, struct en50221_app_mmi_text *items,
+ uint32_t item_raw_length, uint8_t *items_raw);
+
+/**
+ * Type definition for list callback.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param title Title text.
+ * @param sub_title Sub-Title text.
+ * @param bottom Bottom text.
+ * @param item_count Number of text elements in items.
+ * @param items Pointer to array of en50221_app_mmi_text structures which are standard menu choices,
+ * @param item_raw_length Length of item raw data.
+ * @param items_raw If nonstandard items were supplied, pointer to their data.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_mmi_list_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ struct en50221_app_mmi_text *title,
+ struct en50221_app_mmi_text *sub_title,
+ struct en50221_app_mmi_text *bottom,
+ uint32_t item_count, struct en50221_app_mmi_text *items,
+ uint32_t item_raw_length, uint8_t *items_raw);
+
+/**
+ * Opaque type representing a mmi resource.
+ */
+typedef void *en50221_app_mmi;
+
+/**
+ * Create an instance of the mmi resource.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_mmi en50221_app_mmi_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of the mmi resource.
+ *
+ * @param mmi Instance to destroy.
+ */
+extern void en50221_app_mmi_destroy(en50221_app_mmi mmi);
+
+/**
+ * Informs the mmi object that a session to it has been closed - cleans up internal state.
+ *
+ * @param mmi mmi resource instance.
+ * @param session_number The session concerned.
+ */
+extern void en50221_app_mmi_clear_session(en50221_app_mmi mmi, uint16_t session_number);
+
+/**
+ * Register the callback for when we receive an mmi_close request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_close_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_close_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a display control request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_display_control_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_display_control_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a keypad control request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_keypad_control_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_keypad_control_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a subtitle segment request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_subtitle_segment_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_subtitle_segment_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a scene end mark request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_scene_end_mark_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_scene_end_mark_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a scene control request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_scene_control_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_scene_control_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a subtitle download request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_subtitle_download_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_subtitle_download_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a flush download request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_flush_download_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_flush_download_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive an enq request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_enq_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_enq_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a menu request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_menu_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_menu_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a list request.
+ *
+ * @param mmi mmi resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_mmi_register_list_callback(en50221_app_mmi mmi,
+ en50221_app_mmi_list_callback callback, void *arg);
+
+/**
+ * Send an mmi_close to the cam.
+ *
+ * @param mmi mmi resource instance.
+ * @param session_number Session number to send it on.
+ * @param cmd_id One of the MMI_CLOSE_MMI_CMD_ID_* values.
+ * @param delay Delay to use if MMI_CLOSE_MMI_CMD_ID_DELAY specified.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_mmi_close(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t cmd_id,
+ uint8_t delay);
+
+/**
+ * Send a display_reply to the cam.
+ *
+ * @param mmi mmi resource instance.
+ * @param session_number Session number to send it on.
+ * @param reply_id One of the MMI_DISPLAY_REPLY_ID_* values.
+ * @param details The details of the reply - can be NULL if the chosen reply_id does not need it.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_mmi_display_reply(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t reply_id,
+ struct en502221_app_mmi_display_reply_details *details);
+
+/**
+ * Send a keypress to the cam.
+ *
+ * @param mmi mmi resource instance.
+ * @param session_number Session number to send it on.
+ * @param keycode The keycode.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_mmi_keypress(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t keycode);
+
+/**
+ * Send a display message to the cam.
+ *
+ * @param mmi mmi resource instance.
+ * @param session_number Session number to send it on.
+ * @param display_message_id One of the MMI_DISPLAY_MESSAGE_ID_* values.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_mmi_display_message(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t display_message_id);
+
+/**
+ * Send a scene done message to the cam.
+ *
+ * @param mmi mmi resource instance.
+ * @param session_number Session number to send it on.
+ * @param decoder_continue Copy of flag in scene_end_mark.
+ * @param scene_reveal Copy of flag in scene_end_mark.
+ * @param scene_tag Scene tag this responds to.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_mmi_scene_done(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t decoder_continue,
+ uint8_t scene_reveal,
+ uint8_t scene_tag);
+
+/**
+ * Send a download reply to the cam.
+ *
+ * @param mmi mmi resource instance.
+ * @param session_number Session number to send it on.
+ * @param object_id Object id.
+ * @param download_reply_id One of the MMI_DOWNLOAD_REPLY_ID_* values.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_mmi_download_reply(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint16_t object_id,
+ uint8_t download_reply_id);
+
+/**
+ * Send an answ to the cam.
+ *
+ * @param mmi mmi resource instance.
+ * @param session_number Session number to send it on.
+ * @param answ_id One of the MMI_ANSW_ID_* values.
+ * @param text The text if MMI_ANSW_ID_ANSWER.
+ * @param text_count Length of text.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_mmi_answ(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t answ_id,
+ uint8_t *text,
+ uint32_t text_count);
+
+/**
+ * Send a menu answ to the cam.
+ *
+ * @param mmi mmi resource instance.
+ * @param session_number Session number to send it on.
+ * @param choice_ref Option chosen by user (0=>canceled).
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_mmi_menu_answ(en50221_app_mmi mmi,
+ uint16_t session_number,
+ uint8_t choice_ref);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param mmi mmi instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_mmi_message(en50221_app_mmi mmi,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_rm.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_rm.c
new file mode 100644
index 0000000..7c57aba
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_rm.c
@@ -0,0 +1,294 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include <libucsi/endianops.h>
+#include "en50221_app_rm.h"
+#include "en50221_app_tags.h"
+#include "asn_1.h"
+
+struct en50221_app_rm_private {
+ struct en50221_app_send_functions *funcs;
+
+ en50221_app_rm_enq_callback enqcallback;
+ void *enqcallback_arg;
+
+ en50221_app_rm_reply_callback replycallback;
+ void *replycallback_arg;
+
+ en50221_app_rm_changed_callback changedcallback;
+ void *changedcallback_arg;
+
+ pthread_mutex_t lock;
+};
+
+static int en50221_app_rm_parse_profile_enq(struct en50221_app_rm_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_rm_parse_profile_reply(struct en50221_app_rm_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+static int en50221_app_rm_parse_profile_change(struct en50221_app_rm_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+
+en50221_app_rm en50221_app_rm_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_rm_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_rm_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->enqcallback = NULL;
+ private->replycallback = NULL;
+ private->changedcallback = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_rm_destroy(en50221_app_rm rm)
+{
+ struct en50221_app_rm_private *private = (struct en50221_app_rm_private *) rm;
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_rm_register_enq_callback(en50221_app_rm rm,
+ en50221_app_rm_enq_callback callback, void *arg)
+{
+ struct en50221_app_rm_private *private = (struct en50221_app_rm_private *) rm;
+
+ pthread_mutex_lock(&private->lock);
+ private->enqcallback = callback;
+ private->enqcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_rm_register_reply_callback(en50221_app_rm rm,
+ en50221_app_rm_reply_callback callback, void *arg)
+{
+ struct en50221_app_rm_private *private = (struct en50221_app_rm_private *) rm;
+
+ pthread_mutex_lock(&private->lock);
+ private->replycallback = callback;
+ private->replycallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_rm_register_changed_callback(en50221_app_rm rm,
+ en50221_app_rm_changed_callback callback, void *arg)
+{
+ struct en50221_app_rm_private *private = (struct en50221_app_rm_private *) rm;
+
+ pthread_mutex_lock(&private->lock);
+ private->changedcallback = callback;
+ private->changedcallback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_rm_enq(en50221_app_rm rm, uint16_t session_number)
+{
+ struct en50221_app_rm_private *private = (struct en50221_app_rm_private *) rm;
+ uint8_t buf[4];
+
+ // set up the tag
+ buf[0] = (TAG_PROFILE_ENQUIRY >> 16) & 0xFF;
+ buf[1] = (TAG_PROFILE_ENQUIRY >> 8) & 0xFF;
+ buf[2] = TAG_PROFILE_ENQUIRY & 0xFF;
+ buf[3] = 0;
+
+ // create the data and send it
+ return private->funcs->send_data(private->funcs->arg, session_number, buf, 4);
+}
+
+int en50221_app_rm_reply(en50221_app_rm rm, uint16_t session_number,
+ uint32_t resource_id_count,
+ uint32_t *resource_ids)
+{
+ struct en50221_app_rm_private *private = (struct en50221_app_rm_private *) rm;
+ uint8_t buf[10];
+
+ // set up the tag
+ buf[0] = (TAG_PROFILE >> 16) & 0xFF;
+ buf[1] = (TAG_PROFILE >> 8) & 0xFF;
+ buf[2] = TAG_PROFILE & 0xFF;
+
+ // encode the length field
+ int length_field_len;
+ if ((length_field_len = asn_1_encode(resource_id_count*4, buf+3, 3)) < 0) {
+ return -1;
+ }
+
+ // copy the data and byteswap it
+ uint32_t *copy_resource_ids = alloca(4*resource_id_count);
+ if (copy_resource_ids == NULL) {
+ return -1;
+ }
+ uint8_t *data = (uint8_t*) copy_resource_ids;
+ memcpy(data, resource_ids, resource_id_count*4);
+ uint32_t i;
+ for(i=0; i<resource_id_count; i++) {
+ bswap32(data);
+ data+=4;
+ }
+
+ // build the iovecs
+ struct iovec iov[2];
+ iov[0].iov_base = buf;
+ iov[0].iov_len = 3+length_field_len;
+ iov[1].iov_base = (uint8_t*) copy_resource_ids;
+ iov[1].iov_len = resource_id_count * 4;
+
+ // create the data and send it
+ return private->funcs->send_datav(private->funcs->arg, session_number, iov, 2);
+}
+
+int en50221_app_rm_changed(en50221_app_rm rm, uint16_t session_number)
+{
+ struct en50221_app_rm_private *private = (struct en50221_app_rm_private *) rm;
+ uint8_t buf[4];
+
+ // set up the tag
+ buf[0] = (TAG_PROFILE_CHANGE >> 16) & 0xFF;
+ buf[1] = (TAG_PROFILE_CHANGE >> 8) & 0xFF;
+ buf[2] = TAG_PROFILE_CHANGE & 0xFF;
+ buf[3] = 0;
+
+ // create the data and send it
+ return private->funcs->send_data(private->funcs->arg, session_number, buf, 4);
+}
+
+int en50221_app_rm_message(en50221_app_rm rm,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_rm_private *private = (struct en50221_app_rm_private *) rm;
+ (void) resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ // dispatch it
+ switch(tag)
+ {
+ case TAG_PROFILE_ENQUIRY:
+ return en50221_app_rm_parse_profile_enq(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_PROFILE:
+ return en50221_app_rm_parse_profile_reply(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_PROFILE_CHANGE:
+ return en50221_app_rm_parse_profile_change(private, slot_id, session_number, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+
+static int en50221_app_rm_parse_profile_enq(struct en50221_app_rm_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ (void)data;
+ (void)data_length;
+
+ pthread_mutex_lock(&private->lock);
+ en50221_app_rm_enq_callback cb = private->enqcallback;
+ void *cb_arg = private->enqcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number);
+ }
+ return 0;
+}
+
+static int en50221_app_rm_parse_profile_reply(struct en50221_app_rm_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t resources_count = asn_data_length / 4;
+ uint32_t *resource_ids = (uint32_t*) (data+length_field_len);
+ data += length_field_len;
+
+ // byteswap it
+ uint32_t i;
+ for(i=0; i< resources_count; i++) {
+ bswap32(data);
+ data+=4;
+ }
+
+ // inform observer
+ pthread_mutex_lock(&private->lock);
+ en50221_app_rm_reply_callback cb = private->replycallback;
+ void *cb_arg = private->replycallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, resources_count, resource_ids);
+ }
+ return 0;
+}
+
+static int en50221_app_rm_parse_profile_change(struct en50221_app_rm_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ (void)data;
+ (void)data_length;
+
+ pthread_mutex_lock(&private->lock);
+ en50221_app_rm_changed_callback cb = private->changedcallback;
+ void *cb_arg = private->changedcallback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number);
+ }
+ return 0;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_rm.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_rm.h
new file mode 100644
index 0000000..696065d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_rm.h
@@ -0,0 +1,178 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_RM_H__
+#define __EN50221_APPLICATION_RM_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+
+#define EN50221_APP_RM_RESOURCEID MKRID(1,1,1)
+
+/**
+ * Type definition for profile_enq callback function - called when we receive
+ * a profile_enq from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_rm_enq_callback)(void *arg, uint8_t slot_id, uint16_t session_number);
+
+/**
+ * Type definition for profile_reply callback function - called when we receive
+ * a profile_reply from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id_count Number of resource_ids.
+ * @param resource_ids The resource ids themselves.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_rm_reply_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint32_t resource_id_count,
+ uint32_t *resource_ids);
+/**
+ * Type definition for profile_changed callback function - called when we receive
+ * a profile_changed from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_rm_changed_callback)(void *arg, uint8_t slot_id, uint16_t session_number);
+
+
+
+/**
+ * Opaque type representing a resource manager.
+ */
+typedef void *en50221_app_rm;
+
+/**
+ * Create an instance of the resource manager.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_rm en50221_app_rm_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of the resource manager.
+ *
+ * @param rm Instance to destroy.
+ */
+extern void en50221_app_rm_destroy(en50221_app_rm rm);
+
+/**
+ * Register the callback for when we receive a profile_enq from a CAM.
+ *
+ * @param rm Resource manager instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_rm_register_enq_callback(en50221_app_rm rm,
+ en50221_app_rm_enq_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a profile_reply from a CAM.
+ *
+ * @param rm Resource manager instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_rm_register_reply_callback(en50221_app_rm rm,
+ en50221_app_rm_reply_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive a profile_changed from a CAM.
+ *
+ * @param rm Resource manager instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_rm_register_changed_callback(en50221_app_rm rm,
+ en50221_app_rm_changed_callback callback, void *arg);
+
+/**
+ * Send a profile_enq to a CAM.
+ *
+ * @param rm Resource manager resource instance.
+ * @param session_number Session number to send it on.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_rm_enq(en50221_app_rm rm, uint16_t session_number);
+
+/**
+ * Send a profile_reply to a CAM.
+ *
+ * @param rm Resource manager resource instance.
+ * @param session_number Session number to send it on.
+ * @param resource_id_count Number of resource ids.
+ * @param resource_ids The resource IDs themselves
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_rm_reply(en50221_app_rm rm, uint16_t session_number,
+ uint32_t resource_id_count,
+ uint32_t *resource_ids);
+
+/**
+ * Send a profile_changed to a CAM.
+ *
+ * @param rm Resource manager resource instance.
+ * @param session_number Session number to send it on.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_rm_changed(en50221_app_rm rm, uint16_t session_number);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param rm rm instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_rm_message(en50221_app_rm rm,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_smartcard.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_smartcard.c
new file mode 100644
index 0000000..83015ae
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_smartcard.c
@@ -0,0 +1,293 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include "en50221_app_smartcard.h"
+#include "en50221_app_tags.h"
+#include "asn_1.h"
+
+struct en50221_app_smartcard_private {
+ struct en50221_app_send_functions *funcs;
+
+ en50221_app_smartcard_command_callback command_callback;
+ void *command_callback_arg;
+
+ en50221_app_smartcard_send_callback send_callback;
+ void *send_callback_arg;
+
+ pthread_mutex_t lock;
+};
+
+static int en50221_app_smartcard_parse_command(struct en50221_app_smartcard_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+static int en50221_app_smartcard_parse_send(struct en50221_app_smartcard_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+
+en50221_app_smartcard en50221_app_smartcard_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_smartcard_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_smartcard_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->command_callback = NULL;
+ private->send_callback = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_smartcard_destroy(en50221_app_smartcard smartcard)
+{
+ struct en50221_app_smartcard_private *private = (struct en50221_app_smartcard_private *) smartcard;
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_smartcard_register_command_callback(en50221_app_smartcard smartcard,
+ en50221_app_smartcard_command_callback callback, void *arg)
+{
+ struct en50221_app_smartcard_private *private = (struct en50221_app_smartcard_private *) smartcard;
+
+ pthread_mutex_lock(&private->lock);
+ private->command_callback = callback;
+ private->command_callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+void en50221_app_smartcard_register_send_callback(en50221_app_smartcard smartcard,
+ en50221_app_smartcard_send_callback callback, void *arg)
+{
+ struct en50221_app_smartcard_private *private = (struct en50221_app_smartcard_private *) smartcard;
+
+ pthread_mutex_lock(&private->lock);
+ private->send_callback = callback;
+ private->send_callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_smartcard_command_reply(en50221_app_smartcard smartcard,
+ uint16_t session_number,
+ uint8_t reply_id,
+ uint8_t status,
+ uint8_t *data,
+ uint32_t data_length)
+{
+ struct en50221_app_smartcard_private *private = (struct en50221_app_smartcard_private *) smartcard;
+ uint8_t hdr[10];
+ struct iovec iovec[2];
+ int iov_count = 0;
+
+ // the tag
+ hdr[0] = (TAG_SMARTCARD_REPLY >> 16) & 0xFF;
+ hdr[1] = (TAG_SMARTCARD_REPLY >> 8) & 0xFF;
+ hdr[2] = TAG_SMARTCARD_REPLY & 0xFF;
+
+ // the rest of the data
+ if (reply_id == SMARTCARD_REPLY_ID_ANSW_TO_RESET) {
+ // encode the length field
+ int length_field_len;
+ if ((length_field_len = asn_1_encode(data_length+2, data+3, 3)) < 0) {
+ return -1;
+ }
+
+ // the rest of the header
+ hdr[3+length_field_len] = reply_id;
+ hdr[3+length_field_len+1] = status;
+ iovec[0].iov_base = hdr;
+ iovec[0].iov_len = 3+length_field_len+2;
+
+ // the data
+ iovec[1].iov_base = data;
+ iovec[1].iov_len = data_length;
+ iov_count = 2;
+ } else {
+ hdr[3] = 2;
+ hdr[4] = reply_id;
+ hdr[5] = status;
+ iovec[0].iov_base = data;
+ iovec[0].iov_len = 6;
+ iov_count = 1;
+ }
+
+ return private->funcs->send_datav(private->funcs->arg, session_number, iovec, iov_count);
+}
+
+int en50221_app_smartcard_receive(en50221_app_smartcard smartcard,
+ uint16_t session_number,
+ uint8_t *data,
+ uint32_t data_length,
+ uint8_t SW1,
+ uint8_t SW2)
+{
+ struct en50221_app_smartcard_private *private = (struct en50221_app_smartcard_private *) smartcard;
+ uint8_t buf[10];
+ uint8_t trailer[10];
+
+ // set up the tag
+ buf[0] = (TAG_SMARTCARD_RCV >> 16) & 0xFF;
+ buf[1] = (TAG_SMARTCARD_RCV >> 8) & 0xFF;
+ buf[2] = TAG_SMARTCARD_RCV & 0xFF;
+
+ // encode the length field
+ int length_field_len;
+ if ((length_field_len = asn_1_encode(data_length+2, buf+3, 3)) < 0) {
+ return -1;
+ }
+
+ // set up the trailer
+ trailer[0] = SW1;
+ trailer[1] = SW2;
+
+ // build the iovecs
+ struct iovec iov[3];
+ iov[0].iov_base = buf;
+ iov[0].iov_len = 3+length_field_len;
+ iov[1].iov_base = data;
+ iov[1].iov_len = data_length;
+ iov[2].iov_base = trailer;
+ iov[2].iov_len = 2;
+
+ // create the data and send it
+ return private->funcs->send_datav(private->funcs->arg, session_number, iov, 3);
+}
+
+int en50221_app_smartcard_message(en50221_app_smartcard smartcard,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_smartcard_private *private = (struct en50221_app_smartcard_private *) smartcard;
+ (void)resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ switch(tag)
+ {
+ case TAG_SMARTCARD_COMMAND:
+ return en50221_app_smartcard_parse_command(private, slot_id, session_number, data+3, data_length-3);
+ case TAG_SMARTCARD_SEND:
+ return en50221_app_smartcard_parse_send(private, slot_id, session_number, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+
+
+
+
+
+
+static int en50221_app_smartcard_parse_command(struct en50221_app_smartcard_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ if (data_length != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (data[0] != 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t command_id = data[1];
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_smartcard_command_callback cb = private->command_callback;
+ void *cb_arg = private->command_callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, command_id);
+ }
+ return 0;
+}
+
+static int en50221_app_smartcard_parse_send(struct en50221_app_smartcard_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length < 8) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ data += length_field_len;
+
+ // parse
+ uint8_t CLA = data[0];
+ uint8_t INS = data[1];
+ uint8_t P1 = data[2];
+ uint8_t P2 = data[3];
+ uint16_t length_in = (data[4]<<8)|data[5];
+ uint8_t *data_in = data + 6;
+
+ // validate the length
+ if ((length_in + 8) != asn_data_length) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint16_t length_out = (data[6+length_in]<<8)|data[6+length_in+1];
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_smartcard_send_callback cb = private->send_callback;
+ void *cb_arg = private->send_callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, CLA, INS, P1, P2, data_in, length_in, length_out);
+ }
+ return 0;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_smartcard.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_smartcard.h
new file mode 100644
index 0000000..56655c4
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_smartcard.h
@@ -0,0 +1,191 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_smartcard_H__
+#define __EN50221_APPLICATION_smartcard_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+
+#define SMARTCARD_COMMAND_ID_CONNECT 0x01
+#define SMARTCARD_COMMAND_ID_DISCONNECT 0x02
+#define SMARTCARD_COMMAND_ID_POWERON_CARD 0x03
+#define SMARTCARD_COMMAND_ID_POWEROFF_CARD 0x04
+#define SMARTCARD_COMMAND_ID_RESET_CARD 0x05
+#define SMARTCARD_COMMAND_ID_RESET_STATUS 0x06
+#define SMARTCARD_COMMAND_ID_READ_ANSW_TO_RESET 0x07
+
+#define SMARTCARD_REPLY_ID_CONNECTED 0x01
+#define SMARTCARD_REPLY_ID_FREE 0x02
+#define SMARTCARD_REPLY_ID_BUSY 0x03
+#define SMARTCARD_REPLY_ID_ANSW_TO_RESET 0x04
+#define SMARTCARD_REPLY_ID_NO_ANSW_TO_RESET 0x05
+
+#define SMARTCARD_STATUS_CARD_INSERTED 0x01
+#define SMARTCARD_STATUS_CARD_REMOVED 0x02
+#define SMARTCARD_STATUS_CARD_IN_PLACE_POWEROFF 0x03
+#define SMARTCARD_STATUS_CARD_IN_PLACE_POWERON 0x04
+#define SMARTCARD_STATUS_CARD_NO_CARD 0x05
+#define SMARTCARD_STATUS_CARD_UNRESPONSIVE_CARD 0x06
+#define SMARTCARD_STATUS_CARD_REFUSED_CARD 0x07
+
+#define EN50221_APP_SMARTCARD_RESOURCEID(DEVICE_NUMBER) MKRID(112, ((DEVICE_NUMBER)& 0x0f), 1)
+
+
+
+/**
+ * Type definition for command - called when we receive a command.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param command_id One of the SMARTCARD_COMMAND_ID_* values
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_smartcard_command_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t command_id);
+
+/**
+ * Type definition for command - called when we receive a send command.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param CLA CLA value.
+ * @param INS INS value.
+ * @param P1 P1 value.
+ * @param P2 P2 value.
+ * @param in Data to send to the card
+ * @param in_length Number of bytes to send.
+ * @param out_length Number of bytes expected.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_smartcard_send_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t CLA, uint8_t INS, uint8_t P1, uint8_t P2,
+ uint8_t *in, uint32_t in_length,
+ uint32_t out_length);
+
+/**
+ * Opaque type representing a smartcard resource.
+ */
+typedef void *en50221_app_smartcard;
+
+/**
+ * Create an instance of the smartcard resource.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_smartcard en50221_app_smartcard_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of the smartcard resource.
+ *
+ * @param smartcard Instance to destroy.
+ */
+extern void en50221_app_smartcard_destroy(en50221_app_smartcard smartcard);
+
+/**
+ * Register the callback for when we receive a comms command.
+ *
+ * @param smartcard smartcard resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_smartcard_register_command_callback(en50221_app_smartcard smartcard,
+ en50221_app_smartcard_command_callback callback, void *arg);
+
+/**
+ * Register the callback for when we receive data to send.
+ *
+ * @param smartcard smartcard resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_smartcard_register_send_callback(en50221_app_smartcard smartcard,
+ en50221_app_smartcard_send_callback callback, void *arg);
+
+/**
+ * Send a command response to the CAM.
+ *
+ * @param smartcard smartcard resource instance.
+ * @param session_number Session number to send it on.
+ * @param reply_id One of the SMARTCARD_REPLY_ID_* values.
+ * @param status One of the SMARTCARD_STATUS_* values.
+ * @param data Data to send when it is a SMARTCARD_REPLY_ID_ANSW_TO_RESET.
+ * @param data_length Length of data to send.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_smartcard_command_reply(en50221_app_smartcard smartcard,
+ uint16_t session_number,
+ uint8_t reply_id,
+ uint8_t status,
+ uint8_t *data,
+ uint32_t data_length);
+
+/**
+ * Send data received from a smartcart to the CAM.
+ *
+ * @param smartcard smartcard resource instance.
+ * @param session_number Session number to send it on.
+ * @param data Data to send when it is a SMARTCARD_REPLY_ID_ANSW_TO_RESET.
+ * @param data_length Length of data to send.
+ * @param SW1 SW1 value.
+ * @param SW2 SW2 value.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_smartcard_receive(en50221_app_smartcard smartcard,
+ uint16_t session_number,
+ uint8_t *data,
+ uint32_t data_length,
+ uint8_t SW1,
+ uint8_t SW2);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param smartcard smartcard instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_smartcard_message(en50221_app_smartcard smartcard,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_tags.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_tags.h
new file mode 100644
index 0000000..2086a80
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_tags.h
@@ -0,0 +1,104 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APP_TAGS_H__
+#define __EN50221_APP_TAGS_H__
+
+/* Resource Manager */
+#define TAG_PROFILE_ENQUIRY 0x9f8010
+#define TAG_PROFILE 0x9f8011
+#define TAG_PROFILE_CHANGE 0x9f8012
+
+/* Application Info */
+#define TAG_APP_INFO_ENQUIRY 0x9f8020
+#define TAG_APP_INFO 0x9f8021
+#define TAG_ENTER_MENU 0x9f8022
+
+/* CA Support */
+#define TAG_CA_INFO_ENQUIRY 0x9f8030
+#define TAG_CA_INFO 0x9f8031
+#define TAG_CA_PMT 0x9f8032
+#define TAG_CA_PMT_REPLY 0x9f8033
+
+/* Host Control */
+#define TAG_TUNE 0x9f8400
+#define TAG_REPLACE 0x9f8401
+#define TAG_CLEAR_REPLACE 0x9f8402
+#define TAG_ASK_RELEASE 0x9f8403
+
+/* Date and Time */
+#define TAG_DATE_TIME_ENQUIRY 0x9f8440
+#define TAG_DATE_TIME 0x9f8441
+
+/* Man Machine Interface (MMI) */
+#define TAG_CLOSE_MMI 0x9f8800
+#define TAG_DISPLAY_CONTROL 0x9f8801
+#define TAG_DISPLAY_REPLY 0x9f8802
+#define TAG_TEXT_LAST 0x9f8803
+#define TAG_TEXT_MORE 0x9f8804
+#define TAG_KEYPAD_CONTROL 0x9f8805
+#define TAG_KEYPRESS 0x9f8806
+#define TAG_ENQUIRY 0x9f8807
+#define TAG_ANSWER 0x9f8808
+#define TAG_MENU_LAST 0x9f8809
+#define TAG_MENU_MORE 0x9f880a
+#define TAG_MENU_ANSWER 0x9f880b
+#define TAG_LIST_LAST 0x9f880c
+#define TAG_LIST_MORE 0x9f880d
+#define TAG_SUBTITLE_SEGMENT_LAST 0x9f880e
+#define TAG_SUBTITLE_SEGMENT_MORE 0x9f880f
+#define TAG_DISPLAY_MESSAGE 0x9f8810
+#define TAG_SCENE_END_MARK 0x9f8811
+#define TAG_SCENE_DONE 0x9f8812
+#define TAG_SCENE_CONTROL 0x9f8813
+#define TAG_SUBTITLE_DOWNLOAD_LAST 0x9f8814
+#define TAG_SUBTITLE_DOWNLOAD_MORE 0x9f8815
+#define TAG_FLUSH_DOWNLOAD 0x9f8816
+#define TAG_DOWNLOAD_REPLY 0x9f8817
+
+/* Low Speed Communications */
+#define TAG_COMMS_COMMAND 0x9f8c00
+#define TAG_CONNECTION_DESCRIPTOR 0x9f8c01
+#define TAG_COMMS_REPLY 0x9f8c02
+#define TAG_COMMS_SEND_LAST 0x9f8c03
+#define TAG_COMMS_SEND_MORE 0x9f8c04
+#define TAG_COMMS_RECV_LAST 0x9f8c05
+#define TAG_COMMS_RECV_MORE 0x9f8c06
+
+/* Authentication */
+#define TAG_AUTH_REQ 0x9f8200
+#define TAG_AUTH_RESP 0x9f8201
+
+/* Teletext */
+#define TAG_TELETEXT_EBU 0x9f9000
+
+/* Smartcard */
+#define TAG_SMARTCARD_COMMAND 0x9f8e00
+#define TAG_SMARTCARD_REPLY 0x9f8e01
+#define TAG_SMARTCARD_SEND 0x9f8e02
+#define TAG_SMARTCARD_RCV 0x9f8e03
+
+/* EPG */
+#define TAG_EPG_ENQUIRY 0x9f8f00
+#define TAG_EPG_REPLY 0x9f8f01
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_teletext.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_teletext.c
new file mode 100644
index 0000000..cc2ee41
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_teletext.c
@@ -0,0 +1,139 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <string.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <pthread.h>
+#include "en50221_app_teletext.h"
+#include "en50221_app_tags.h"
+#include "asn_1.h"
+
+struct en50221_app_teletext_private {
+ struct en50221_app_send_functions *funcs;
+
+ en50221_app_teletext_callback callback;
+ void *callback_arg;
+
+ pthread_mutex_t lock;
+};
+
+static int en50221_app_teletext_parse_ebu(struct en50221_app_teletext_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length);
+
+
+
+en50221_app_teletext en50221_app_teletext_create(struct en50221_app_send_functions *funcs)
+{
+ struct en50221_app_teletext_private *private = NULL;
+
+ // create structure and set it up
+ private = malloc(sizeof(struct en50221_app_teletext_private));
+ if (private == NULL) {
+ return NULL;
+ }
+ private->funcs = funcs;
+ private->callback = NULL;
+
+ pthread_mutex_init(&private->lock, NULL);
+
+ // done
+ return private;
+}
+
+void en50221_app_teletext_destroy(en50221_app_teletext teletext)
+{
+ struct en50221_app_teletext_private *private = (struct en50221_app_teletext_private *) teletext;
+
+ pthread_mutex_destroy(&private->lock);
+ free(private);
+}
+
+void en50221_app_teletext_register_callback(en50221_app_teletext teletext,
+ en50221_app_teletext_callback callback, void *arg)
+{
+ struct en50221_app_teletext_private *private = (struct en50221_app_teletext_private *) teletext;
+
+ pthread_mutex_lock(&private->lock);
+ private->callback = callback;
+ private->callback_arg = arg;
+ pthread_mutex_unlock(&private->lock);
+}
+
+int en50221_app_teletext_message(en50221_app_teletext teletext,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length)
+{
+ struct en50221_app_teletext_private *private = (struct en50221_app_teletext_private *) teletext;
+ (void) resource_id;
+
+ // get the tag
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint32_t tag = (data[0] << 16) | (data[1] << 8) | data[2];
+
+ switch(tag)
+ {
+ case TAG_TELETEXT_EBU:
+ return en50221_app_teletext_parse_ebu(private, slot_id, session_number, data+3, data_length-3);
+ }
+
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected tag %x\n", tag);
+ return -1;
+}
+
+
+static int en50221_app_teletext_parse_ebu(struct en50221_app_teletext_private *private,
+ uint8_t slot_id, uint16_t session_number,
+ uint8_t *data, uint32_t data_length)
+{
+ // first of all, decode the length field
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data, data_length)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "ASN.1 decode error\n");
+ return -1;
+ }
+
+ // check it
+ if (asn_data_length > (data_length-length_field_len)) {
+ print(LOG_LEVEL, ERROR, 1, "Received short data\n");
+ return -1;
+ }
+ uint8_t *teletext_data = data + length_field_len;
+
+ // tell the app
+ pthread_mutex_lock(&private->lock);
+ en50221_app_teletext_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->lock);
+ if (cb) {
+ return cb(cb_arg, slot_id, session_number, teletext_data, asn_data_length);
+ }
+ return 0;
+}
+
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_teletext.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_teletext.h
new file mode 100644
index 0000000..1164d94
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_teletext.h
@@ -0,0 +1,104 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APPLICATION_teletext_H__
+#define __EN50221_APPLICATION_teletext_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_app_utils.h>
+
+#define EN50221_APP_TELETEXT_RESOURCEID MKRID(128, 1, 1)
+
+
+/**
+ * Type definition for request - called when we receive teletext from a CAM.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number concerned.
+ * @param teletext_data Data for the request.
+ * @param teletext_data_lenghth Number of bytes.
+ * @return 0 on success, -1 on failure.
+ */
+typedef int (*en50221_app_teletext_callback)(void *arg, uint8_t slot_id, uint16_t session_number,
+ uint8_t *teletext_data,
+ uint32_t teletext_data_length);
+
+/**
+ * Opaque type representing a teletext resource.
+ */
+typedef void *en50221_app_teletext;
+
+/**
+ * Create an instance of the teletext resource.
+ *
+ * @param funcs Send functions to use.
+ * @return Instance, or NULL on failure.
+ */
+extern en50221_app_teletext en50221_app_teletext_create(struct en50221_app_send_functions *funcs);
+
+/**
+ * Destroy an instance of the teletext resource.
+ *
+ * @param teletext Instance to destroy.
+ */
+extern void en50221_app_teletext_destroy(en50221_app_teletext teletext);
+
+/**
+ * Register the callback for when we receive a request.
+ *
+ * @param teletext teletext resource instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_app_teletext_register_callback(en50221_app_teletext teletext,
+ en50221_app_teletext_callback callback, void *arg);
+
+/**
+ * Pass data received for this resource into it for parsing.
+ *
+ * @param teletext teletext instance.
+ * @param slot_id Slot ID concerned.
+ * @param session_number Session number concerned.
+ * @param resource_id Resource ID concerned.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, -1 on failure.
+ */
+extern int en50221_app_teletext_message(en50221_app_teletext teletext,
+ uint8_t slot_id,
+ uint16_t session_number,
+ uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_utils.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_utils.c
new file mode 100644
index 0000000..af68846
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_utils.c
@@ -0,0 +1,37 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "en50221_app_utils.h"
+
+struct en50221_app_public_resource_id *
+ en50221_app_decode_public_resource_id(struct en50221_app_public_resource_id *idf, uint32_t resource_id)
+{
+ // reject private resources
+ if ((resource_id & 0xc0000000) == 0xc0000000)
+ return NULL;
+
+ idf->resource_class = (resource_id >> 16) & 0xffff; // use the resource_id as the MSBs of class
+ idf->resource_type = (resource_id >> 6) & 0x3ff;
+ idf->resource_version = resource_id & 0x3f;
+ return idf;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_utils.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_utils.h
new file mode 100644
index 0000000..34ca68f
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_app_utils.h
@@ -0,0 +1,105 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef __EN50221_APP_UTILS_H__
+#define __EN50221_APP_UTILS_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <sys/uio.h>
+
+/**
+ * A decomposed public resource structure.
+ *
+ * we will ignore private resource (resource_id_type==3),
+ * because they are not used by any modules at all and
+ * would need special code for any private resource anyway.
+ */
+struct en50221_app_public_resource_id {
+ uint16_t resource_class;
+ uint16_t resource_type;
+ uint8_t resource_version;
+};
+
+/**
+ * An abstraction away from hardcoded send functions so different layers may be
+ * slotted in under the application layer.
+ */
+struct en50221_app_send_functions {
+ /**
+ * Argument to pass to these functions.
+ */
+ void *arg;
+
+ /**
+ * Send data.
+ */
+ int (*send_data)(void *arg, uint16_t session_number, uint8_t *data, uint16_t data_length);
+
+ /**
+ * Send vector data.
+ */
+ int (*send_datav)(void *arg, uint16_t session_number, struct iovec *vector, int iov_count);
+};
+
+/**
+ * Make a host-endian uint32_t formatted resource id.
+ *
+ * @param CLASS Class of resource.
+ * @param TYPE Type of resource.
+ * @param VERSION Version of resource.
+ * @return Formatted resource id.
+ */
+#define MKRID(CLASS, TYPE, VERSION) ((((CLASS)&0xffff)<<16) | (((TYPE)&0x3ff)<<6) | ((VERSION)&0x3f))
+
+/**
+ * Decode a host-endian public resource_id into an en50221_app_public_resource_id structure.
+ *
+ * @param idf Structure to write decoded resource_id into.
+ * @param resource_id ID to decode.
+ * @return Pointer to idf on success, or NULL if this is not a public resource.
+ */
+struct en50221_app_public_resource_id *
+ en50221_app_decode_public_resource_id(struct en50221_app_public_resource_id *idf, uint32_t resource_id);
+
+/**
+ * Encode an en50221_app_public_resource_id structure into a host-endian uint32_t.
+ *
+ * @param idf Structure to encode.
+ * @return The encoded value
+ */
+static inline uint32_t en50221_app_encode_public_resource_id(struct en50221_app_public_resource_id *idf)
+{
+ return MKRID(idf->resource_class, idf->resource_type, idf->resource_version);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_errno.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_errno.h
new file mode 100644
index 0000000..045a6a5
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_errno.h
@@ -0,0 +1,52 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 session layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#ifndef EN50221_ERRNO
+#define EN50221_ERRNO 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define EN50221ERR_CAREAD -1 /* error during read from CA device. */
+#define EN50221ERR_CAWRITE -2 /* error during write to CA device. */
+#define EN50221ERR_TIMEOUT -3 /* timeout occured waiting for a response from a device. */
+#define EN50221ERR_BADSLOTID -4 /* bad slot ID supplied by user - the offending slot_id will not be set. */
+#define EN50221ERR_BADCONNECTIONID -5 /* bad connection ID supplied by user. */
+#define EN50221ERR_BADSTATE -6 /* slot/connection in the wrong state. */
+#define EN50221ERR_BADCAMDATA -7 /* CAM supplied an invalid request. */
+#define EN50221ERR_OUTOFMEMORY -8 /* memory allocation failed. */
+#define EN50221ERR_ASNENCODE -9 /* ASN.1 encode failure - indicates library bug. */
+#define EN50221ERR_OUTOFCONNECTIONS -10 /* no more connections available. */
+#define EN50221ERR_OUTOFSLOTS -11 /* no more slots available - the offending slot_id will not be set. */
+#define EN50221ERR_IOVLIMIT -12 /* Too many struct iovecs were used. */
+#define EN50221ERR_BADSESSIONNUMBER -13 /* Bad session number suppplied by user. */
+#define EN50221ERR_OUTOFSESSIONS -14 /* no more sessions available. */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_session.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_session.c
new file mode 100644
index 0000000..1cc9a2e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_session.c
@@ -0,0 +1,954 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <sys/uio.h>
+#include <pthread.h>
+#include "en50221_transport.h"
+#include "en50221_session.h"
+#include "en50221_errno.h"
+#include "asn_1.h"
+
+
+// these are the possible session statuses
+#define S_STATUS_OPEN 0x00 // session is opened
+#define S_STATUS_CLOSE_NO_RES 0xF0 // could not open session, no proper resource available
+#define S_STATUS_CLOSE_RES_UNAVAILABLE 0xF1 // could not open session, resource unavailable
+#define S_STATUS_CLOSE_RES_LOW_VERSION 0xF2 // could not open session, resource version too low
+#define S_STATUS_CLOSE_RES_BUSY 0xF3 // could not open session, resource is busy
+
+#define ST_OPEN_SESSION_REQ 0x91 // h<--m
+#define ST_OPEN_SESSION_RES 0x92 // h-->m
+#define ST_CREATE_SESSION 0x93 // h-->m
+#define ST_CREATE_SESSION_RES 0x94 // h<--m
+#define ST_CLOSE_SESSION_REQ 0x95 // h<->m
+#define ST_CLOSE_SESSION_RES 0x96 // h<->m
+#define ST_SESSION_NUMBER 0x90 // h<->m
+
+#define S_STATE_IDLE 0x01 // this session is not in use
+#define S_STATE_ACTIVE 0x02 // this session is in use
+#define S_STATE_IN_CREATION 0x04 // this session waits for a ST_CREATE_SESSION_RES to become active
+#define S_STATE_IN_DELETION 0x08 // this session waits for ST_CLOSE_SESSION_RES to become idle again
+
+
+// for each session we store its identifier, the resource-id
+// it is linked to and the callback of the specific resource
+struct en50221_session {
+ uint8_t state;
+ uint32_t resource_id;
+ uint8_t slot_id;
+ uint8_t connection_id;
+
+ en50221_sl_resource_callback callback;
+ void *callback_arg;
+
+ pthread_mutex_t session_lock;
+};
+
+struct en50221_session_layer_private
+{
+ uint32_t max_sessions;
+ en50221_transport_layer tl;
+
+ en50221_sl_lookup_callback lookup;
+ void *lookup_arg;
+
+ en50221_sl_session_callback session;
+ void *session_arg;
+
+ pthread_mutex_t global_lock;
+ pthread_mutex_t setcallback_lock;
+
+ int error;
+
+ struct en50221_session *sessions;
+};
+
+static void en50221_sl_transport_callback(void *arg, int reason, uint8_t *data, uint32_t data_length,
+ uint8_t slot_id, uint8_t connection_id);
+static int en50221_sl_alloc_new_session(struct en50221_session_layer_private *private,
+ uint32_t resource_id,
+ uint8_t slot_id,
+ uint8_t connection_id,
+ en50221_sl_resource_callback callback, void* arg);
+
+
+
+
+en50221_session_layer en50221_sl_create(en50221_transport_layer tl,
+ uint32_t max_sessions)
+{
+ struct en50221_session_layer_private *private = NULL;
+ uint32_t i;
+
+ // setup structure
+ private = (struct en50221_session_layer_private*) malloc(sizeof(struct en50221_session_layer_private));
+ if (private == NULL)
+ goto error_exit;
+ private->max_sessions = max_sessions;
+ private->lookup = NULL;
+ private->session = NULL;
+ private->tl = tl;
+ private->error = 0;
+
+ // init the mutex
+ pthread_mutex_init(&private->global_lock, NULL);
+ pthread_mutex_init(&private->setcallback_lock, NULL);
+
+ // create the slots
+ private->sessions = malloc(sizeof(struct en50221_session) * max_sessions);
+ if (private->sessions == NULL)
+ goto error_exit;
+
+ // set them up
+ for(i=0; i< max_sessions; i++) {
+ private->sessions[i].state = S_STATE_IDLE;
+ private->sessions[i].callback = NULL;
+
+ pthread_mutex_init(&private->sessions[i].session_lock, NULL);
+ }
+
+ // register ourselves with the transport layer
+ en50221_tl_register_callback(tl, en50221_sl_transport_callback, private);
+
+ return private;
+
+error_exit:
+ en50221_sl_destroy(private);
+ return NULL;
+}
+
+void en50221_sl_destroy(en50221_session_layer sl)
+{
+ struct en50221_session_layer_private *private = (struct en50221_session_layer_private *) sl;
+ uint32_t i;
+
+ if (private) {
+ if (private->sessions) {
+ for(i=0; i< private->max_sessions; i++) {
+ pthread_mutex_destroy(&private->sessions[i].session_lock);
+ }
+ free(private->sessions);
+ }
+
+ pthread_mutex_destroy(&private->setcallback_lock);
+ pthread_mutex_destroy(&private->global_lock);
+
+ free(private);
+ }
+}
+
+int en50221_sl_get_error(en50221_session_layer tl)
+{
+ struct en50221_session_layer_private *private = (struct en50221_session_layer_private *) tl;
+ return private->error;
+}
+
+void en50221_sl_register_lookup_callback(en50221_session_layer sl, en50221_sl_lookup_callback callback, void *arg)
+{
+ struct en50221_session_layer_private *private = (struct en50221_session_layer_private *) sl;
+
+ pthread_mutex_lock(&private->setcallback_lock);
+ private->lookup = callback;
+ private->lookup_arg = arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+}
+
+void en50221_sl_register_session_callback(en50221_session_layer sl,
+ en50221_sl_session_callback callback, void *arg)
+{
+ struct en50221_session_layer_private *private = (struct en50221_session_layer_private *) sl;
+
+ pthread_mutex_lock(&private->setcallback_lock);
+ private->session = callback;
+ private->session_arg = arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+}
+
+int en50221_sl_create_session(en50221_session_layer sl, int slot_id, uint8_t connection_id, uint32_t resource_id,
+ en50221_sl_resource_callback callback, void* arg)
+{
+ struct en50221_session_layer_private *private = (struct en50221_session_layer_private *) sl;
+
+ // lookup next free session_id:
+ pthread_mutex_lock(&private->global_lock);
+ int session_number = en50221_sl_alloc_new_session(private, resource_id, slot_id, connection_id, callback, arg);
+ if (session_number == -1) {
+ pthread_mutex_unlock(&private->global_lock);
+ return -1;
+ }
+ pthread_mutex_unlock(&private->global_lock);
+
+ // make up the header
+ uint8_t hdr[8];
+ hdr[0] = ST_CREATE_SESSION;
+ hdr[1] = 6;
+ hdr[2] = resource_id >> 24;
+ hdr[3] = resource_id >> 16;
+ hdr[4] = resource_id >> 8;
+ hdr[5] = resource_id;
+ hdr[6] = session_number >> 8;
+ hdr[7] = session_number;
+
+ // send this command
+ if (en50221_tl_send_data(private->tl, slot_id, connection_id, hdr, 8)) {
+ pthread_mutex_lock(&private->sessions[session_number].session_lock);
+ if (private->sessions[session_number].state == S_STATE_IN_CREATION) {
+ private->sessions[session_number].state = S_STATE_IDLE;
+ }
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+
+ private->error = en50221_tl_get_error(private->tl);
+ return -1;
+ }
+
+ // ok.
+ return session_number;
+}
+
+int en50221_sl_destroy_session(en50221_session_layer sl, uint16_t session_number)
+{
+ struct en50221_session_layer_private *private = (struct en50221_session_layer_private *) sl;
+
+ if (session_number >= private->max_sessions) {
+ private->error = EN50221ERR_BADSESSIONNUMBER;
+ return -1;
+ }
+
+ pthread_mutex_lock(&private->sessions[session_number].session_lock);
+ if (!(private->sessions[session_number].state & (S_STATE_ACTIVE|S_STATE_IN_DELETION))) {
+ private->error = EN50221ERR_BADSESSIONNUMBER;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return -1;
+ }
+
+ // set the state
+ private->sessions[session_number].state = S_STATE_IN_DELETION;
+
+ // get essential details
+ uint8_t slot_id = private->sessions[session_number].slot_id;
+ uint8_t connection_id = private->sessions[session_number].connection_id;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+
+ // sendit
+ uint8_t hdr[4];
+ hdr[0] = ST_CLOSE_SESSION_REQ;
+ hdr[1] = 2;
+ hdr[2] = session_number >> 8;
+ hdr[3] = session_number;
+ if (en50221_tl_send_data(private->tl, slot_id, connection_id, hdr, 4)) {
+ pthread_mutex_lock(&private->sessions[session_number].session_lock);
+ if (private->sessions[session_number].state == S_STATE_IN_DELETION) {
+ private->sessions[session_number].state = S_STATE_IDLE;
+ }
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+
+ private->error = en50221_tl_get_error(private->tl);
+ return -1;
+ }
+
+ return 0;
+}
+
+int en50221_sl_send_data(en50221_session_layer sl, uint16_t session_number, uint8_t *data, uint16_t data_length)
+{
+ struct en50221_session_layer_private *private = (struct en50221_session_layer_private *) sl;
+
+ if (session_number >= private->max_sessions) {
+ private->error = EN50221ERR_BADSESSIONNUMBER;
+ return -1;
+ }
+
+ pthread_mutex_lock(&private->sessions[session_number].session_lock);
+ if (private->sessions[session_number].state != S_STATE_ACTIVE) {
+ private->error = EN50221ERR_BADSESSIONNUMBER;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return -1;
+ }
+
+ // get essential details
+ uint8_t slot_id = private->sessions[session_number].slot_id;
+ uint8_t connection_id = private->sessions[session_number].connection_id;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+
+ // sendit
+ struct iovec iov[2];
+ uint8_t hdr[4];
+ hdr[0] = ST_SESSION_NUMBER;
+ hdr[1] = 2;
+ hdr[2] = session_number >> 8;
+ hdr[3] = session_number;
+ iov[0].iov_base = hdr;
+ iov[0].iov_len = 4;
+ iov[1].iov_base = data;
+ iov[1].iov_len = data_length;
+ if (en50221_tl_send_datav(private->tl, slot_id, connection_id, iov, 2)) {
+ private->error = en50221_tl_get_error(private->tl);
+ return -1;
+ }
+
+ return 0;
+}
+
+int en50221_sl_send_datav(en50221_session_layer sl, uint16_t session_number,
+ struct iovec *vector, int iov_count)
+{
+ struct en50221_session_layer_private *private = (struct en50221_session_layer_private *) sl;
+
+ if (session_number >= private->max_sessions) {
+ private->error = EN50221ERR_BADSESSIONNUMBER;
+ return -1;
+ }
+
+ pthread_mutex_lock(&private->sessions[session_number].session_lock);
+ if (private->sessions[session_number].state != S_STATE_ACTIVE) {
+ private->error = EN50221ERR_BADSESSIONNUMBER;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return -1;
+ }
+ if (iov_count > 9) {
+ private->error = EN50221ERR_IOVLIMIT;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return -1;
+ }
+ uint8_t slot_id = private->sessions[session_number].slot_id;
+ uint8_t connection_id = private->sessions[session_number].connection_id;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+
+ // make up the header
+ struct iovec out_iov[10];
+ uint8_t hdr[4];
+ hdr[0] = ST_SESSION_NUMBER;
+ hdr[1] = 2;
+ hdr[2] = session_number >> 8;
+ hdr[3] = session_number;
+ out_iov[0].iov_base = hdr;
+ out_iov[0].iov_len = 4;
+
+ // make up the data
+ memcpy(&out_iov[1], vector, iov_count * sizeof(struct iovec));
+
+ // send this command
+ if (en50221_tl_send_datav(private->tl, slot_id, connection_id, out_iov, iov_count+1)) {
+ private->error = en50221_tl_get_error(private->tl);
+ return -1;
+ }
+ return 0;
+}
+
+int en50221_sl_broadcast_data(en50221_session_layer sl, int slot_id, uint32_t resource_id,
+ uint8_t *data, uint16_t data_length)
+{
+ struct en50221_session_layer_private *private = (struct en50221_session_layer_private *) sl;
+ uint32_t i;
+
+ for(i = 0; i < private->max_sessions; i++)
+ {
+ pthread_mutex_lock(&private->sessions[i].session_lock);
+
+ if (private->sessions[i].state != S_STATE_ACTIVE) {
+ pthread_mutex_unlock(&private->sessions[i].session_lock);
+ continue;
+ }
+ if ((slot_id != -1) && (slot_id != private->sessions[i].slot_id)) {
+ pthread_mutex_unlock(&private->sessions[i].session_lock);
+ continue;
+ }
+
+ if (private->sessions[i].resource_id == resource_id) {
+ pthread_mutex_unlock(&private->sessions[i].session_lock);
+ en50221_sl_send_data(sl, i, data, data_length);
+ } else {
+ pthread_mutex_unlock(&private->sessions[i].session_lock);
+ }
+ }
+
+ return 0;
+}
+
+
+
+static void en50221_sl_handle_open_session_request(struct en50221_session_layer_private *private,
+ uint8_t *data, uint32_t data_length, uint8_t slot_id, uint8_t connection_id)
+{
+ // check
+ if (data_length < 5) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %02x\n", slot_id);
+ return;
+ }
+ if (data[0] != 4) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %02x\n", slot_id);
+ return;
+ }
+
+ // get the resource id
+ uint32_t requested_resource_id = (data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];
+
+ // get lookup callback details
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_sl_lookup_callback lcb = private->lookup;
+ void *lcb_arg = private->lookup_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+
+ // first of all, lookup this resource id
+ int status = S_STATUS_CLOSE_NO_RES;
+ en50221_sl_resource_callback resource_callback = NULL;
+ void *resource_arg = NULL;
+ uint32_t connected_resource_id;
+ if (lcb) {
+ status = lcb(lcb_arg, slot_id, requested_resource_id, &resource_callback, &resource_arg, &connected_resource_id);
+ switch(status) {
+ case 0:
+ status = S_STATUS_OPEN;
+ break;
+
+ case -1:
+ status = S_STATUS_CLOSE_NO_RES;
+ break;
+
+ case -2:
+ status = S_STATUS_CLOSE_RES_LOW_VERSION;
+ break;
+
+ case -3:
+ status = S_STATUS_CLOSE_RES_UNAVAILABLE;
+ break;
+ }
+ }
+
+ // if we found it, get a new session for it
+ int session_number = -1;
+ if (status == S_STATUS_OPEN) {
+ // lookup next free session_id:
+ pthread_mutex_lock(&private->global_lock);
+ session_number = en50221_sl_alloc_new_session(private, connected_resource_id, slot_id, connection_id,
+ resource_callback, resource_arg);
+ pthread_mutex_unlock(&private->global_lock);
+
+ if (session_number == -1) {
+ status = S_STATUS_CLOSE_NO_RES;
+ } else {
+ // inform upper layers/ check availability
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_sl_session_callback cb = private->session;
+ void *cb_arg = private->session_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+ if (cb) {
+ if (cb(cb_arg, S_SCALLBACK_REASON_CAMCONNECTING, slot_id, session_number, connected_resource_id)) {
+ status = S_STATUS_CLOSE_RES_BUSY;
+ }
+ } else {
+ status = S_STATUS_CLOSE_RES_UNAVAILABLE;
+ }
+ }
+ }
+
+ // send response
+ uint8_t hdr[9];
+ hdr[0] = ST_OPEN_SESSION_RES;
+ hdr[1] = 7;
+ hdr[2] = status;
+ hdr[3] = connected_resource_id >> 24;
+ hdr[4] = connected_resource_id >> 16;
+ hdr[5] = connected_resource_id >> 8;
+ hdr[6] = connected_resource_id;
+ hdr[7] = session_number >> 8;
+ hdr[8] = session_number;
+ if (en50221_tl_send_data(private->tl, slot_id, connection_id, hdr, 9)) {
+ print(LOG_LEVEL, ERROR, 1, "Transport layer error %i occurred\n", en50221_tl_get_error(private->tl));
+ status = S_STATUS_CLOSE_NO_RES;
+ // fallthrough
+ }
+
+ // inform upper layers what happened
+ if (session_number != -1) {
+ // setup session state apppropriately from upper layer response
+ pthread_mutex_lock(&private->sessions[session_number].session_lock);
+ if (status != S_STATUS_OPEN) {
+ private->sessions[session_number].state = S_STATE_IDLE;
+ } else {
+ private->sessions[session_number].state = S_STATE_ACTIVE;
+ }
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+
+ // tell upper layers
+ if (private->sessions[session_number].state == S_STATE_ACTIVE) {
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_sl_session_callback cb = private->session;
+ void *cb_arg = private->session_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+
+ if (status == S_STATUS_OPEN) {
+ if (cb)
+ cb(cb_arg, S_SCALLBACK_REASON_CAMCONNECTED, slot_id, session_number, connected_resource_id);
+ } else {
+ private->sessions[session_number].state = S_STATE_IDLE;
+ if (cb)
+ cb(cb_arg, S_SCALLBACK_REASON_CAMCONNECTFAIL, slot_id, session_number, connected_resource_id);
+ }
+ }
+ }
+}
+
+static void en50221_sl_handle_close_session_request(struct en50221_session_layer_private *private,
+ uint8_t *data, uint32_t data_length, uint8_t slot_id, uint8_t connection_id)
+{
+ // check
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %02x\n", slot_id);
+ return;
+ }
+ if (data[0] != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %02x\n", slot_id);
+ return;
+ }
+
+ // extract session number
+ uint16_t session_number = (data[1] << 8) | data[2];
+
+ // check session number is ok
+ uint8_t code = 0x00;
+ uint32_t resource_id = 0;
+ if (session_number >= private->max_sessions) {
+ code = 0xF0; // session close error
+ print(LOG_LEVEL, ERROR, 1, "Received bad session id %i\n", slot_id);
+ } else {
+ pthread_mutex_lock(&private->sessions[session_number].session_lock);
+ if (slot_id != private->sessions[session_number].slot_id) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ code = 0xF0; // session close error
+ }
+ if (connection_id != private->sessions[session_number].connection_id) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ code = 0xF0; // session close error
+ }
+ if (!(private->sessions[session_number].state & (S_STATE_ACTIVE|S_STATE_IN_DELETION))) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ code = 0xF0; // session close error
+ }
+
+ if (code == 0x00) {
+ private->sessions[session_number].state = S_STATE_IDLE;
+ code = 0x00; // close ok
+ }
+ resource_id = private->sessions[session_number].resource_id;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ }
+
+ // make up the response
+ uint8_t hdr[5];
+ hdr[0] = ST_CLOSE_SESSION_RES;
+ hdr[1] = 3;
+ hdr[2] = code;
+ hdr[3] = session_number >> 8;
+ hdr[4] = session_number;
+
+ // sendit
+ if (en50221_tl_send_data(private->tl, slot_id, connection_id, hdr, 5)) {
+ print(LOG_LEVEL, ERROR, 1, "Transport layer reports error %i on slot %i\n",
+ en50221_tl_get_error(private->tl), slot_id);
+ }
+
+ // callback to announce destruction to resource if it was ok
+ if (code == 0x00) {
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_sl_session_callback cb = private->session;
+ void *cb_arg = private->session_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+
+ if (cb)
+ cb(cb_arg, S_SCALLBACK_REASON_CLOSE, slot_id, session_number, resource_id);
+ }
+}
+
+static void en50221_sl_handle_create_session_response(struct en50221_session_layer_private *private,
+ uint8_t *data, uint32_t data_length, uint8_t slot_id, uint8_t connection_id)
+{
+ // check
+ if (data_length < 8) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %02x\n", slot_id);
+ return;
+ }
+ if (data[0] != 7) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %02x\n", slot_id);
+ return;
+ }
+
+ // extract session number
+ uint16_t session_number = (data[5] << 8) | data[6];
+
+ // check session number is ok
+ if (session_number >= private->max_sessions) {
+ print(LOG_LEVEL, ERROR, 1, "Received bad session id %i\n", slot_id);
+ return;
+ }
+
+ pthread_mutex_lock(&private->sessions[session_number].session_lock);
+ if (slot_id != private->sessions[session_number].slot_id) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return;
+ }
+ if (connection_id != private->sessions[session_number].connection_id) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return;
+ }
+ if (private->sessions[session_number].state != S_STATE_IN_CREATION) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return;
+ }
+
+ // extract status
+ if (data[1] != S_STATUS_OPEN) {
+ print(LOG_LEVEL, ERROR, 1, "Session creation failed 0x%02x\n", data[1]);
+ private->sessions[session_number].state = S_STATE_IDLE;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+
+ // inform upper layers
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_sl_session_callback cb = private->session;
+ void *cb_arg = private->session_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+ if (cb)
+ cb(cb_arg, S_SCALLBACK_REASON_CONNECTFAIL, slot_id, session_number,
+ private->sessions[session_number].resource_id);
+ return;
+ }
+
+ // set it active
+ private->sessions[session_number].state = S_STATE_ACTIVE;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+
+ // inform upper layers
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_sl_session_callback cb = private->session;
+ void *cb_arg = private->session_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+ if (cb)
+ cb(cb_arg, S_SCALLBACK_REASON_CONNECTED, slot_id, session_number,
+ private->sessions[session_number].resource_id);
+}
+
+static void en50221_sl_handle_close_session_response(struct en50221_session_layer_private *private,
+ uint8_t *data, uint32_t data_length, uint8_t slot_id, uint8_t connection_id)
+{
+ // check
+ if (data_length < 5) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %02x\n", slot_id);
+ return;
+ }
+ if (data[0] != 4) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %02x\n", slot_id);
+ return;
+ }
+
+ // extract session number
+ uint16_t session_number = (data[2] << 8) | data[3];
+
+ // check session number is ok
+ if (session_number >= private->max_sessions) {
+ print(LOG_LEVEL, ERROR, 1, "Received bad session id %i\n", slot_id);
+ return;
+ }
+
+ pthread_mutex_lock(&private->sessions[session_number].session_lock);
+ if (slot_id != private->sessions[session_number].slot_id) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return;
+ }
+ if (connection_id != private->sessions[session_number].connection_id) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return;
+ }
+ if (private->sessions[session_number].state != S_STATE_IN_DELETION) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return;
+ }
+
+ // extract status
+ if (data[1] != 0x00) {
+ print(LOG_LEVEL, ERROR, 1, "Session close failed 0x%02x\n", data[1]);
+ // just fallthrough anyway
+ }
+
+ // completed
+ private->sessions[session_number].state = S_STATE_IDLE;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+}
+
+static void en50221_sl_handle_session_package(struct en50221_session_layer_private *private,
+ uint8_t *data, uint32_t data_length,
+ uint8_t slot_id, uint8_t connection_id)
+{
+ // check
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %i\n", slot_id);
+ return;
+ }
+ if (data[0] != 2) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %i\n", slot_id);
+ return;
+ }
+
+ // get session number
+ uint16_t session_number = (data[1] << 8) | data[2];
+
+ // check it
+ if (session_number >= private->max_sessions) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with bad session_number from module on slot %i\n", slot_id);
+ return;
+ }
+
+ pthread_mutex_lock(&private->sessions[session_number].session_lock);
+ if (slot_id != private->sessions[session_number].slot_id) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return;
+ }
+ if (connection_id != private->sessions[session_number].connection_id) {
+ print(LOG_LEVEL, ERROR, 1, "Received unexpected session on invalid slot %i\n", slot_id);
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return;
+ }
+ if (private->sessions[session_number].state != S_STATE_ACTIVE) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with bad session_number from module on slot %i\n", slot_id);
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+ return;
+ }
+
+ en50221_sl_resource_callback cb = private->sessions[session_number].callback;
+ void *cb_arg = private->sessions[session_number].callback_arg;
+ uint32_t resource_id = private->sessions[session_number].resource_id;
+ pthread_mutex_unlock(&private->sessions[session_number].session_lock);
+
+ // there can be > 1 APDU following the package - all for the same session/resource_id tho.
+ data += 3;
+ data_length -= 3;
+ while(data_length) {
+ // check length field
+ if (data_length < 3) {
+ print(LOG_LEVEL, ERROR, 1, "Received invalid sized session package from slot %i\n", slot_id);
+ return;
+ }
+
+ // parse the APDU's length field
+ int length_field_len;
+ uint16_t asn_data_length;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data+3, data_length-3)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "Received invalid sized session package from slot %i\n", slot_id);
+ return;
+ }
+ uint32_t apdu_length = 3 + length_field_len + asn_data_length;
+
+ // check there is enough data
+ if (apdu_length > data_length) {
+ print(LOG_LEVEL, ERROR, 1, "Received invalid sized session package from slot %i\n", slot_id);
+ return;
+ }
+
+ // pass the APDU up to the higher layers
+ if (cb)
+ cb(cb_arg, slot_id, session_number, resource_id, data, apdu_length);
+
+ // next!
+ data += apdu_length;
+ data_length -= apdu_length;
+ }
+
+}
+
+static void en50221_sl_transport_callback(void *arg, int reason, uint8_t *data, uint32_t data_length,
+ uint8_t slot_id, uint8_t connection_id)
+{
+ struct en50221_session_layer_private *private = (struct en50221_session_layer_private *) arg;
+ uint32_t i;
+
+ // deal with the reason for this callback
+ switch(reason) {
+ case T_CALLBACK_REASON_DATA:
+ // fallthrough into rest of this function
+ break;
+
+ case T_CALLBACK_REASON_CONNECTIONOPEN:
+ {
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_sl_session_callback cb = private->session;
+ void *cb_arg = private->session_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+
+ if (cb)
+ cb(cb_arg, S_SCALLBACK_REASON_TC_CONNECT, slot_id, connection_id, 0);
+ return;
+ }
+
+ case T_CALLBACK_REASON_CAMCONNECTIONOPEN:
+ {
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_sl_session_callback cb = private->session;
+ void *cb_arg = private->session_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+
+ if (cb)
+ cb(cb_arg, S_SCALLBACK_REASON_TC_CAMCONNECT, slot_id, connection_id, 0);
+ return;
+ }
+
+ case T_CALLBACK_REASON_CONNECTIONCLOSE:
+ {
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_sl_session_callback cb = private->session;
+ void *cb_arg = private->session_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+
+ for(i=0; i< private->max_sessions; i++) {
+ pthread_mutex_lock(&private->sessions[i].session_lock);
+
+ if (private->sessions[i].state == S_STATE_IDLE) {
+ pthread_mutex_unlock(&private->sessions[i].session_lock);
+ continue;
+ }
+ if (private->sessions[i].connection_id != connection_id) {
+ pthread_mutex_unlock(&private->sessions[i].session_lock);
+ continue;
+ }
+
+ private->sessions[i].state = S_STATE_IDLE;
+
+ uint8_t slot_id = private->sessions[i].slot_id;
+ uint32_t resource_id = private->sessions[i].resource_id;
+ pthread_mutex_unlock(&private->sessions[i].session_lock);
+
+ if (cb)
+ cb(cb_arg, S_SCALLBACK_REASON_CLOSE, slot_id, i, resource_id);
+ }
+ return;
+ }
+
+ case T_CALLBACK_REASON_SLOTCLOSE:
+ {
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_sl_session_callback cb = private->session;
+ void *cb_arg = private->session_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+
+ for(i=0; i< private->max_sessions; i++) {
+ pthread_mutex_lock(&private->sessions[i].session_lock);
+
+ if (private->sessions[i].state == S_STATE_IDLE) {
+ pthread_mutex_unlock(&private->sessions[i].session_lock);
+ continue;
+ }
+ if (private->sessions[i].slot_id != slot_id) {
+ pthread_mutex_unlock(&private->sessions[i].session_lock);
+ continue;
+ }
+ private->sessions[i].state = S_STATE_IDLE;
+
+ uint32_t resource_id = private->sessions[i].resource_id;
+ pthread_mutex_unlock(&private->sessions[i].session_lock);
+
+ if (cb)
+ cb(cb_arg, S_SCALLBACK_REASON_CLOSE, slot_id, i, resource_id);
+
+ }
+ return;
+ }
+ }
+
+ // sanity check data length
+ if (data_length < 1) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %i\n", slot_id);
+ return;
+ }
+
+ // deal with the data
+ uint8_t spdu_tag = data[0];
+ switch(spdu_tag)
+ {
+ case ST_OPEN_SESSION_REQ:
+ en50221_sl_handle_open_session_request(private, data+1, data_length-1, slot_id, connection_id);
+ break;
+
+ case ST_CLOSE_SESSION_REQ:
+ en50221_sl_handle_close_session_request(private, data+1, data_length-1, slot_id, connection_id);
+ break;
+
+ case ST_SESSION_NUMBER:
+ en50221_sl_handle_session_package(private, data+1, data_length-1, slot_id, connection_id);
+ break;
+
+ case ST_CREATE_SESSION_RES:
+ en50221_sl_handle_create_session_response(private, data+1, data_length-1, slot_id, connection_id);
+ break;
+
+ case ST_CLOSE_SESSION_RES:
+ en50221_sl_handle_close_session_response(private, data+1, data_length-1, slot_id, connection_id);
+ break;
+
+ default:
+ print(LOG_LEVEL, ERROR, 1, "Received unknown session tag %02x from module on slot %i", spdu_tag, slot_id);
+ break;
+ }
+}
+
+static int en50221_sl_alloc_new_session(struct en50221_session_layer_private *private,
+ uint32_t resource_id,
+ uint8_t slot_id,
+ uint8_t connection_id,
+ en50221_sl_resource_callback callback, void* arg)
+{
+ int session_number = -1;
+ uint32_t i;
+ for(i = 1; i < private->max_sessions; i++) {
+ if (private->sessions[i].state == S_STATE_IDLE) {
+ session_number = i;
+ break;
+ }
+ }
+ if (session_number == -1) {
+ private->error = EN50221ERR_OUTOFSESSIONS;
+ return -1;
+ }
+
+ // setup the session
+ private->sessions[session_number].state = S_STATE_IN_CREATION;
+ private->sessions[session_number].resource_id = resource_id;
+ private->sessions[session_number].slot_id = slot_id;
+ private->sessions[session_number].connection_id = connection_id;
+ private->sessions[session_number].callback = callback;
+ private->sessions[session_number].callback_arg = arg;
+
+ // ok
+ return session_number;
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_session.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_session.h
new file mode 100644
index 0000000..c7cc6a8
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_session.h
@@ -0,0 +1,212 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 session layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian@jusst.de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+
+#ifndef __EN50221_SESSION_H__
+#define __EN50221_SESSION_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <libdvben50221/en50221_transport.h>
+
+#define S_SCALLBACK_REASON_CAMCONNECTING 0x00 // CAM originated session connecting to resource (check for availability)
+#define S_SCALLBACK_REASON_CAMCONNECTED 0x01 // CAM originated session connection established succesfully
+#define S_SCALLBACK_REASON_CAMCONNECTFAIL 0x02 // CAM originated session connection failed
+#define S_SCALLBACK_REASON_CONNECTED 0x03 // Host originated session ACKed by CAM.
+#define S_SCALLBACK_REASON_CONNECTFAIL 0x04 // Host originated session NACKed by CAM.
+#define S_SCALLBACK_REASON_CLOSE 0x05 // Session closed
+#define S_SCALLBACK_REASON_TC_CONNECT 0x06 // A host originated transport connection has been established.
+#define S_SCALLBACK_REASON_TC_CAMCONNECT 0x07 // A CAM originated transport connection has been established.
+
+
+/**
+ * Opaque type representing a session layer.
+ */
+typedef void *en50221_session_layer;
+
+/**
+ * Type definition for resource callback function - called by session layer when data
+ * arrives for a particular resource.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number.
+ * @param resource_id Resource id.
+ * @param data The data.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, or -1 on failure.
+ */
+typedef int (*en50221_sl_resource_callback)(void *arg, uint8_t slot_id,
+ uint16_t session_number, uint32_t resource_id,
+ uint8_t *data, uint32_t data_length);
+
+/**
+ * Type definition for resource lookup callback function - used by the session layer to
+ * look up requested resources.
+ *
+ * @param arg Private argument.
+ * @param slot_id Slot id the request came from.
+ * @param requested_resource_id Resource id requested.
+ * @param callback_out Output parameter for pointer to resource callback function.
+ * @param arg_out Output parameter for arg to pass to resource callback.
+ * @param resource_id_out Set this to the resource_id connected to (e.g. may differ from resource_id due to versions).
+ * @return 0 on success,
+ * -1 if the resource was not found,
+ * -2 if it exists, but had a lower version, or
+ * -3 if it exists, but was unavailable.
+ */
+typedef int (*en50221_sl_lookup_callback)(void *arg, uint8_t slot_id, uint32_t requested_resource_id,
+ en50221_sl_resource_callback *callback_out, void **arg_out,
+ uint32_t *resource_id_out);
+
+
+/**
+ * Type definition for session callback function - used to inform top level code when a CAM
+ * modifies a session to a resource.
+ *
+ * @param arg Private argument.
+ * @param reason One of the S_CCALLBACK_REASON_* values above.
+ * @param slot_id Slot id concerned.
+ * @param session_number Session number.
+ * @param resource_id Resource id.
+ * @return 0 on sucess, or -1 on error.
+ */
+typedef int (*en50221_sl_session_callback)(void *arg, int reason,
+ uint8_t slot_id, uint16_t session_number, uint32_t resource_id);
+
+/**
+ * Construct a new instance of the session layer.
+ *
+ * @param tl The en50221_transport_layer instance to use.
+ * @param max_sessions Maximum number of sessions supported.
+ * @return The en50221_session_layer instance, or NULL on error.
+ */
+extern en50221_session_layer en50221_sl_create(en50221_transport_layer tl, uint32_t max_sessions);
+
+/**
+ * Destroy an instance of the session layer.
+ *
+ * @param tl The en50221_session_layer instance.
+ */
+extern void en50221_sl_destroy(en50221_session_layer sl);
+
+/**
+ * Gets the last error.
+ *
+ * @param tl The en50221_session_layer instance.
+ * @return One of the EN50221ERR_* values.
+ */
+extern int en50221_sl_get_error(en50221_session_layer tl);
+
+/**
+ * Register the callback for resource lookup.
+ *
+ * @param sl The en50221_session_layer instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_sl_register_lookup_callback(en50221_session_layer sl,
+ en50221_sl_lookup_callback callback, void *arg);
+
+/**
+ * Register the callback for informing about session from a cam.
+ *
+ * @param sl The en50221_session_layer instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_sl_register_session_callback(en50221_session_layer sl,
+ en50221_sl_session_callback callback, void *arg);
+
+/**
+ * Create a new session to a module in a slot.
+ *
+ * @param sl The en50221_session_layer instance.
+ * @param slot The slot to connect to.
+ * @param resource_id The resource_id to connect to.
+ * @param callback The callback for received data.
+ * @param arg Argument to pass to the callback.
+ * @return The new session_number, or -1 on error.
+ */
+extern int en50221_sl_create_session(en50221_session_layer sl, int slot_id, uint8_t connection_id,
+ uint32_t resource_id,
+ en50221_sl_resource_callback callback, void* arg);
+
+/**
+ * Destroy a session.
+ *
+ * @param sl The en50221_session_layer instance.
+ * @param session_number The session to destroy.
+ * @return 0 on success, or -1 on error.
+ */
+extern int en50221_sl_destroy_session(en50221_session_layer sl, uint16_t session_number);
+
+/**
+ * this function is used to take a data-block, pack into
+ * into a SPDU (SESSION_NUMBER) and send it to the transport layer
+ *
+ * @param sl The en50221_session_layer instance to use.
+ * @param session_number Session number concerned.
+ * @param data Data to send.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, or -1 on error.
+ */
+extern int en50221_sl_send_data(en50221_session_layer sl, uint16_t session_number, uint8_t *data, uint16_t data_length);
+
+/**
+ * this function is used to take a data-block, pack into
+ * into a SPDU (SESSION_NUMBER) and send it to the transport layer
+ *
+ * @param sl The en50221_session_layer instance to use.
+ * @param session_number Session number concerned.
+ * @param vector IOVEC to send.
+ * @param iov_count Number of elements in io vector.
+ * @return 0 on success, or -1 on error.
+ */
+extern int en50221_sl_send_datav(en50221_session_layer sl, uint16_t session_number,
+ struct iovec *vector, int iov_count);
+
+/**
+ * this is used to send a message to all sessions, linked
+ * to resource res
+ *
+ * @param tl The en50221_session_layer instance to use.
+ * @param slot_id Set to -1 to send to any slot. Other values will send to only that slot.
+ * @param resource_id Resource id concerned.
+ * @param data Data to send.
+ * @param data_length Length of data in bytes.
+ * @return 0 on success, or -1 on error.
+ */
+extern int en50221_sl_broadcast_data(en50221_session_layer sl, int slot_id, uint32_t resource_id,
+ uint8_t *data, uint16_t data_length);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_transport.c b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_transport.c
new file mode 100644
index 0000000..ff7c936
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_transport.c
@@ -0,0 +1,1240 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 transport layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <pthread.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <sys/poll.h>
+#include <time.h>
+#include <libdvbmisc/dvbmisc.h>
+#include <libdvbapi/dvbca.h>
+#include "en50221_errno.h"
+#include "en50221_transport.h"
+#include "asn_1.h"
+
+// these are the Transport Tags, like
+// described in EN50221, Annex A.4.1.13 (pg70)
+#define T_SB 0x80 // sb primitive h<--m
+#define T_RCV 0x81 // receive primitive h-->m
+#define T_CREATE_T_C 0x82 // create transport connection primitive h-->m
+#define T_C_T_C_REPLY 0x83 // ctc reply primitive h<--m
+#define T_DELETE_T_C 0x84 // delete tc primitive h<->m
+#define T_D_T_C_REPLY 0x85 // dtc reply primitive h<->m
+#define T_REQUEST_T_C 0x86 // request transport connection primitive h<--m
+#define T_NEW_T_C 0x87 // new tc / reply to t_request primitive h-->m
+#define T_T_C_ERROR 0x77 // error creating tc primitive h-->m
+#define T_DATA_LAST 0xA0 // convey data from higher constructed h<->m
+ // layers
+#define T_DATA_MORE 0xA1 // convey data from higher constructed h<->m
+ // layers
+
+struct en50221_message {
+ struct en50221_message *next;
+ uint32_t length;
+ uint8_t data[0];
+};
+
+struct en50221_connection {
+ uint32_t state; // the current state: idle/in_delete/in_create/active
+ struct timeval tx_time; // time last request was sent from host->module, or 0 if ok
+ struct timeval last_poll_time; // time of last poll transmission
+ uint8_t *chain_buffer; // used to save parts of chained packets
+ uint32_t buffer_length;
+
+ struct en50221_message *send_queue;
+ struct en50221_message *send_queue_tail;
+};
+
+struct en50221_slot {
+ int ca_hndl;
+ uint8_t slot; // CAM slot
+ struct en50221_connection *connections;
+
+ pthread_mutex_t slot_lock;
+
+ uint32_t response_timeout;
+ uint32_t poll_delay;
+};
+
+struct en50221_transport_layer_private
+{
+ uint8_t max_slots;
+ uint8_t max_connections_per_slot;
+ struct en50221_slot *slots;
+ struct pollfd *slot_pollfds;
+ int slots_changed;
+
+ pthread_mutex_t global_lock;
+ pthread_mutex_t setcallback_lock;
+
+ int error;
+ int error_slot;
+
+ en50221_tl_callback callback;
+ void *callback_arg;
+};
+
+static int en50221_tl_process_data(struct en50221_transport_layer_private *tl, uint8_t slot_id,
+ uint8_t *data, uint32_t data_length);
+static int en50221_tl_poll_tc(struct en50221_transport_layer_private *tl, uint8_t slot_id, uint8_t connection_id);
+static int en50221_tl_alloc_new_tc(struct en50221_transport_layer_private *tl, uint8_t slot_id);
+static void queue_message(struct en50221_transport_layer_private *tl, uint8_t slot_id,
+ uint8_t connection_id, struct en50221_message *msg);
+static int en50221_tl_handle_create_tc_reply(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id);
+static int en50221_tl_handle_delete_tc(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id);
+static int en50221_tl_handle_delete_tc_reply(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id);
+static int en50221_tl_handle_request_tc(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id);
+static int en50221_tl_handle_data_more(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id,
+ uint8_t *data, uint32_t data_length);
+static int en50221_tl_handle_data_last(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id,
+ uint8_t *data, uint32_t data_length);
+static int en50221_tl_handle_sb(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id,
+ uint8_t *data, uint32_t data_length);
+
+
+en50221_transport_layer en50221_tl_create(uint8_t max_slots, uint8_t max_connections_per_slot)
+{
+ struct en50221_transport_layer_private *private = NULL;
+ int i;
+ int j;
+
+ // setup structure
+ private = (struct en50221_transport_layer_private*) malloc(sizeof(struct en50221_transport_layer_private));
+ if (private == NULL)
+ goto error_exit;
+ private->max_slots = max_slots;
+ private->max_connections_per_slot = max_connections_per_slot;
+ private->slots = NULL;
+ private->slot_pollfds = NULL;
+ private->slots_changed = 1;
+ private->callback = NULL;
+ private->callback_arg = NULL;
+ private->error_slot = 0;
+ private->error = 0;
+ pthread_mutex_init(&private->global_lock, NULL);
+ pthread_mutex_init(&private->setcallback_lock, NULL);
+
+ // create the slots
+ private->slots = malloc(sizeof(struct en50221_slot) * max_slots);
+ if (private->slots == NULL)
+ goto error_exit;
+
+ // set them up
+ for(i=0; i< max_slots; i++) {
+ private->slots[i].ca_hndl = -1;
+
+ // create the connections for this slot
+ private->slots[i].connections = malloc(sizeof(struct en50221_connection) * max_connections_per_slot);
+ if (private->slots[i].connections == NULL)
+ goto error_exit;
+
+ // create a mutex for the slot
+ pthread_mutex_init(&private->slots[i].slot_lock, NULL);
+
+ // set them up
+ for(j = 0; j < max_connections_per_slot; j++) {
+ private->slots[i].connections[j].state = T_STATE_IDLE;
+ private->slots[i].connections[j].tx_time.tv_sec = 0;
+ private->slots[i].connections[j].last_poll_time.tv_sec = 0;
+ private->slots[i].connections[j].last_poll_time.tv_usec = 0;
+ private->slots[i].connections[j].chain_buffer = NULL;
+ private->slots[i].connections[j].buffer_length = 0;
+ private->slots[i].connections[j].send_queue = NULL;
+ private->slots[i].connections[j].send_queue_tail = NULL;
+ }
+ }
+
+ // create the pollfds
+ private->slot_pollfds = malloc(sizeof(struct pollfd) * max_slots);
+ if (private->slot_pollfds == NULL) {
+ goto error_exit;
+ }
+ memset(private->slot_pollfds, 0, sizeof(struct pollfd) * max_slots);
+
+ return private;
+
+error_exit:
+ en50221_tl_destroy(private);
+ return NULL;
+}
+
+// Destroy an instance of the transport layer
+void en50221_tl_destroy(en50221_transport_layer tl)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+ int i, j;
+
+ if (private) {
+ if (private->slots) {
+ for(i=0; i< private->max_slots; i++) {
+ if (private->slots[i].connections) {
+ for(j=0; j<private->max_connections_per_slot; j++) {
+ if (private->slots[i].connections[j].chain_buffer) {
+ free(private->slots[i].connections[j].chain_buffer);
+ }
+
+ struct en50221_message *cur_msg = private->slots[i].connections[j].send_queue;
+ while(cur_msg) {
+ struct en50221_message *next_msg = cur_msg->next;
+ free(cur_msg);
+ cur_msg = next_msg;
+ }
+ private->slots[i].connections[j].send_queue = NULL;
+ private->slots[i].connections[j].send_queue_tail = NULL;
+ }
+ free(private->slots[i].connections);
+ pthread_mutex_destroy(&private->slots[i].slot_lock);
+ }
+ }
+ free(private->slots);
+ }
+ if (private->slot_pollfds) {
+ free(private->slot_pollfds);
+ }
+ pthread_mutex_destroy(&private->setcallback_lock);
+ pthread_mutex_destroy(&private->global_lock);
+ free(private);
+ }
+}
+
+// this can be called from the user-space app to
+// register new slots that we should work with
+int en50221_tl_register_slot(en50221_transport_layer tl, int ca_hndl, uint8_t slot,
+ uint32_t response_timeout, uint32_t poll_delay)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+
+ // lock
+ pthread_mutex_lock(&private->global_lock);
+
+ // we browse through the array of slots
+ // to look for the first unused one
+ int i;
+ int16_t slot_id = -1;
+ for(i=0; i < private->max_slots; i++) {
+ if (private->slots[i].ca_hndl == -1) {
+ slot_id = i;
+ break;
+ }
+ }
+ if (slot_id == -1) {
+ private->error = EN50221ERR_OUTOFSLOTS;
+ pthread_mutex_unlock(&private->global_lock);
+ return -1;
+ }
+
+ // set up the slot struct
+ pthread_mutex_lock(&private->slots[slot_id].slot_lock);
+ private->slots[slot_id].ca_hndl = ca_hndl;
+ private->slots[slot_id].slot = slot;
+ private->slots[slot_id].response_timeout = response_timeout;
+ private->slots[slot_id].poll_delay = poll_delay;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+
+ private->slots_changed = 1;
+ pthread_mutex_unlock(&private->global_lock);
+ return slot_id;
+}
+
+void en50221_tl_destroy_slot(en50221_transport_layer tl, uint8_t slot_id)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+ int i;
+
+ if (slot_id >= private->max_slots)
+ return;
+
+ // lock
+ pthread_mutex_lock(&private->global_lock);
+
+ // clear the slot
+ pthread_mutex_lock(&private->slots[slot_id].slot_lock);
+ private->slots[slot_id].ca_hndl = -1;
+ for(i=0; i<private->max_connections_per_slot; i++) {
+ private->slots[slot_id].connections[i].state = T_STATE_IDLE;
+ private->slots[slot_id].connections[i].tx_time.tv_sec = 0;
+ private->slots[slot_id].connections[i].last_poll_time.tv_sec = 0;
+ private->slots[slot_id].connections[i].last_poll_time.tv_usec = 0;
+ if (private->slots[slot_id].connections[i].chain_buffer) {
+ free(private->slots[slot_id].connections[i].chain_buffer);
+ }
+ private->slots[slot_id].connections[i].chain_buffer = NULL;
+ private->slots[slot_id].connections[i].buffer_length = 0;
+
+ struct en50221_message *cur_msg = private->slots[slot_id].connections[i].send_queue;
+ while(cur_msg) {
+ struct en50221_message *next_msg = cur_msg->next;
+ free(cur_msg);
+ cur_msg = next_msg;
+ }
+ private->slots[slot_id].connections[i].send_queue = NULL;
+ private->slots[slot_id].connections[i].send_queue_tail = NULL;
+ }
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+
+ // tell upper layers
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_tl_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+ if (cb)
+ cb(cb_arg, T_CALLBACK_REASON_SLOTCLOSE, NULL, 0, slot_id, 0);
+
+ private->slots_changed = 1;
+ pthread_mutex_unlock(&private->global_lock);
+}
+
+int en50221_tl_poll(en50221_transport_layer tl)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+ uint8_t data[4096];
+ int slot_id;
+ int j;
+
+ // make up pollfds if the slots have changed
+ pthread_mutex_lock(&private->global_lock);
+ if (private->slots_changed) {
+ for(slot_id = 0; slot_id < private->max_slots; slot_id++) {
+ if (private->slots[slot_id].ca_hndl != -1) {
+ private->slot_pollfds[slot_id].fd = private->slots[slot_id].ca_hndl;
+ private->slot_pollfds[slot_id].events = POLLIN|POLLPRI|POLLERR;
+ private->slot_pollfds[slot_id].revents = 0;
+ } else {
+ private->slot_pollfds[slot_id].fd = 0;
+ private->slot_pollfds[slot_id].events = 0;
+ private->slot_pollfds[slot_id].revents = 0;
+ }
+ }
+ private->slots_changed = 0;
+ }
+ pthread_mutex_unlock(&private->global_lock);
+
+ // anything happened?
+ if (poll(private->slot_pollfds, private->max_slots, 10) < 0) {
+ private->error_slot = -1;
+ private->error = EN50221ERR_CAREAD;
+ return -1;
+ }
+
+ // go through all slots (even though poll may not have reported any events
+ for(slot_id = 0; slot_id < private->max_slots; slot_id++) {
+
+ // check if this slot is still used and get its handle
+ pthread_mutex_lock(&private->slots[slot_id].slot_lock);
+ if (private->slots[slot_id].ca_hndl == -1) {
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ continue;
+ }
+ int ca_hndl = private->slots[slot_id].ca_hndl;
+
+ if (private->slot_pollfds[slot_id].revents & (POLLPRI | POLLIN)) {
+ // read data
+ uint8_t r_slot_id;
+ uint8_t connection_id;
+ int readcnt = dvbca_link_read(ca_hndl, &r_slot_id, &connection_id, data, sizeof(data));
+ if (readcnt < 0) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_CAREAD;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // process it if we got some
+ if (readcnt > 0) {
+ if (private->slots[slot_id].slot != r_slot_id) {
+ // this message is for an other CAM of the same CA
+ int new_slot_id;
+ for(new_slot_id = 0; new_slot_id < private->max_slots; new_slot_id++) {
+ if ((private->slots[new_slot_id].ca_hndl == ca_hndl) && (private->slots[new_slot_id].slot == r_slot_id))
+ break;
+ }
+ if (new_slot_id != private->max_slots) {
+ // we found the requested CAM
+ pthread_mutex_lock(&private->slots[new_slot_id].slot_lock);
+ if (en50221_tl_process_data(private, new_slot_id, data, readcnt)) {
+ pthread_mutex_unlock(&private->slots[new_slot_id].slot_lock);
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ pthread_mutex_unlock(&private->slots[new_slot_id].slot_lock);
+ } else {
+ private->error = EN50221ERR_BADSLOTID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ }
+ else if (en50221_tl_process_data(private, slot_id, data, readcnt)) {
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ }
+ } else if (private->slot_pollfds[slot_id].revents & POLLERR) {
+ // an error was reported
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_CAREAD;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // poll the connections on this slot + check for timeouts
+ for(j=0; j < private->max_connections_per_slot; j++) {
+ // ignore connection if idle
+ if (private->slots[slot_id].connections[j].state == T_STATE_IDLE) {
+ continue;
+ }
+
+ // send queued data
+ if (private->slots[slot_id].connections[j].state & (T_STATE_IN_CREATION|T_STATE_ACTIVE|T_STATE_ACTIVE_DELETEQUEUED)) {
+ // send data if there is some to go and we're not waiting for a response already
+ if (private->slots[slot_id].connections[j].send_queue &&
+ (private->slots[slot_id].connections[j].tx_time.tv_sec == 0)) {
+
+ // get the message
+ struct en50221_message *msg = private->slots[slot_id].connections[j].send_queue;
+ if (msg->next != NULL) {
+ private->slots[slot_id].connections[j].send_queue = msg->next;
+ } else {
+ private->slots[slot_id].connections[j].send_queue = NULL;
+ private->slots[slot_id].connections[j].send_queue_tail = NULL;
+ }
+
+ // send the message
+ if (dvbca_link_write(private->slots[slot_id].ca_hndl, private->slots[slot_id].slot, j, msg->data, msg->length) < 0) {
+ free(msg);
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_CAWRITE;
+ print(LOG_LEVEL, ERROR, 1, "CAWrite failed");
+ return -1;
+ }
+ gettimeofday(&private->slots[slot_id].connections[j].tx_time, 0);
+
+ // fixup connection state for T_DELETE_T_C
+ if (msg->length && (msg->data[0] == T_DELETE_T_C)) {
+ private->slots[slot_id].connections[j].state = T_STATE_IN_DELETION;
+ if (private->slots[slot_id].connections[j].chain_buffer) {
+ free(private->slots[slot_id].connections[j].chain_buffer);
+ }
+ private->slots[slot_id].connections[j].chain_buffer = NULL;
+ private->slots[slot_id].connections[j].buffer_length = 0;
+ }
+
+ free(msg);
+ }
+ }
+
+ // poll it if we're not expecting a reponse and the poll time has elapsed
+ if (private->slots[slot_id].connections[j].state & T_STATE_ACTIVE) {
+ if ((private->slots[slot_id].connections[j].tx_time.tv_sec == 0) &&
+ (time_after(private->slots[slot_id].connections[j].last_poll_time, private->slots[slot_id].poll_delay))) {
+
+ gettimeofday(&private->slots[slot_id].connections[j].last_poll_time, 0);
+ if (en50221_tl_poll_tc(private, slot_id, j)) {
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ }
+ }
+
+ // check for timeouts - in any state
+ if (private->slots[slot_id].connections[j].tx_time.tv_sec &&
+ (time_after(private->slots[slot_id].connections[j].tx_time, private->slots[slot_id].response_timeout))) {
+
+ if (private->slots[slot_id].connections[j].state & (T_STATE_IN_CREATION|T_STATE_IN_DELETION)) {
+ private->slots[slot_id].connections[j].state = T_STATE_IDLE;
+ } else if (private->slots[slot_id].connections[j].state & (T_STATE_ACTIVE|T_STATE_ACTIVE_DELETEQUEUED)) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_TIMEOUT;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ }
+ }
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ }
+
+ return 0;
+}
+
+void en50221_tl_register_callback(en50221_transport_layer tl, en50221_tl_callback callback, void *arg)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+
+ pthread_mutex_lock(&private->setcallback_lock);
+ private->callback = callback;
+ private->callback_arg = arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+}
+
+int en50221_tl_get_error_slot(en50221_transport_layer tl)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+ return private->error_slot;
+}
+
+int en50221_tl_get_error(en50221_transport_layer tl)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+ return private->error;
+}
+
+int en50221_tl_send_data(en50221_transport_layer tl, uint8_t slot_id, uint8_t connection_id,
+ uint8_t *data, uint32_t data_size)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+
+#ifdef DEBUG_TXDATA
+ printf("[[[[[[[[[[[[[[[[[[[[\n");
+ uint32_t ii=0;
+ for(ii=0;ii<data_size;ii++) {
+ printf("%02x: %02x\n", ii, data[ii]);
+ }
+ printf("]]]]]]]]]]]]]]]]]]]]\n");
+#endif
+
+ if (slot_id >= private->max_slots) {
+ private->error = EN50221ERR_BADSLOTID;
+ return -1;
+ }
+
+ pthread_mutex_lock(&private->slots[slot_id].slot_lock);
+ if (private->slots[slot_id].ca_hndl == -1) {
+ private->error = EN50221ERR_BADSLOTID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ if (connection_id >= private->max_connections_per_slot) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCONNECTIONID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ if (private->slots[slot_id].connections[connection_id].state != T_STATE_ACTIVE) {
+ private->error = EN50221ERR_BADCONNECTIONID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // allocate msg structure
+ struct en50221_message *msg = malloc(sizeof(struct en50221_message)+data_size+10);
+ if (msg == NULL) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_OUTOFMEMORY;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // make up data to send
+ int length_field_len;
+ msg->data[0] = T_DATA_LAST;
+ if ((length_field_len = asn_1_encode(data_size + 1, msg->data + 1, 3)) < 0) {
+ free(msg);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_ASNENCODE;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ msg->data[1 + length_field_len] = connection_id;
+ memcpy(msg->data+1+length_field_len+1, data, data_size);
+ msg->length = 1+length_field_len+1+data_size;
+
+ // queue it for transmission
+ queue_message(private, slot_id, connection_id, msg);
+
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return 0;
+}
+
+int en50221_tl_send_datav(en50221_transport_layer tl, uint8_t slot_id, uint8_t connection_id,
+ struct iovec *vector, int iov_count)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+
+#ifdef DEBUG_TXDATA
+ printf("[[[[[[[[[[[[[[[[[[[[\n");
+ uint32_t ii=0;
+ uint32_t iipos=0;
+ for(ii=0;ii<(uint32_t) iov_count;ii++) {
+ uint32_t jj;
+ for(jj=0; jj< vector[ii].iov_len; jj++) {
+ printf("%02x: %02x\n", jj+iipos, *((uint8_t*) (vector[ii].iov_base) +jj));
+ }
+ iipos += vector[ii].iov_len;
+ }
+ printf("]]]]]]]]]]]]]]]]]]]]\n");
+#endif
+
+ if (slot_id >= private->max_slots) {
+ private->error = EN50221ERR_BADSLOTID;
+ return -1;
+ }
+
+ pthread_mutex_lock(&private->slots[slot_id].slot_lock);
+ if (private->slots[slot_id].ca_hndl == -1) {
+ private->error = EN50221ERR_BADSLOTID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ if (connection_id >= private->max_connections_per_slot) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCONNECTIONID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ if (private->slots[slot_id].connections[connection_id].state != T_STATE_ACTIVE) {
+ private->error = EN50221ERR_BADCONNECTIONID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // calculate the total length of the data to send
+ uint32_t data_size = 0;
+ int i;
+ for(i=0; i< iov_count; i++) {
+ data_size += vector[i].iov_len;
+ }
+
+ // allocate msg structure
+ struct en50221_message *msg = malloc(sizeof(struct en50221_message)+data_size+10);
+ if (msg == NULL) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_OUTOFMEMORY;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // make up data to send
+ int length_field_len;
+ msg->data[0] = T_DATA_LAST;
+ if ((length_field_len = asn_1_encode(data_size + 1, msg->data + 1, 3)) < 0) {
+ free(msg);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_ASNENCODE;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ msg->data[1 + length_field_len] = connection_id;
+ msg->length = 1+length_field_len+1+data_size;
+ msg->next = NULL;
+
+ // merge the iovecs
+ uint32_t pos = 1+length_field_len+1;
+ for(i=0; i< iov_count; i++) {
+ memcpy(msg->data+pos, vector[i].iov_base, vector[i].iov_len);
+ pos += vector[i].iov_len;
+ }
+
+ // queue it for transmission
+ queue_message(private, slot_id, connection_id, msg);
+
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return 0;
+}
+
+int en50221_tl_new_tc(en50221_transport_layer tl, uint8_t slot_id)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+
+ // check
+ if (slot_id >= private->max_slots) {
+ private->error = EN50221ERR_BADSLOTID;
+ return -1;
+ }
+
+ pthread_mutex_lock(&private->slots[slot_id].slot_lock);
+ if (private->slots[slot_id].ca_hndl == -1) {
+ private->error = EN50221ERR_BADSLOTID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // allocate a new connection if possible
+ int conid = en50221_tl_alloc_new_tc(private, slot_id);
+ if (conid == -1) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_OUTOFCONNECTIONS;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // allocate msg structure
+ struct en50221_message *msg = malloc(sizeof(struct en50221_message)+3);
+ if (msg == NULL) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_OUTOFMEMORY;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // make up the data to send
+ msg->data[0] = T_CREATE_T_C;
+ msg->data[1] = 1;
+ msg->data[2] = conid;
+ msg->length = 3;
+ msg->next = NULL;
+
+ // queue it for transmission
+ queue_message(private, slot_id, conid, msg);
+
+ // done
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return conid;
+}
+
+int en50221_tl_del_tc(en50221_transport_layer tl, uint8_t slot_id, uint8_t connection_id)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+
+ // check
+ if (slot_id >= private->max_slots) {
+ private->error = EN50221ERR_BADSLOTID;
+ return -1;
+ }
+
+ pthread_mutex_lock(&private->slots[slot_id].slot_lock);
+ if (private->slots[slot_id].ca_hndl == -1) {
+ private->error = EN50221ERR_BADSLOTID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ if (connection_id >= private->max_connections_per_slot) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCONNECTIONID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ if (!(private->slots[slot_id].connections[connection_id].state &
+ (T_STATE_ACTIVE|T_STATE_IN_DELETION))) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADSTATE;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // allocate msg structure
+ struct en50221_message *msg = malloc(sizeof(struct en50221_message)+3);
+ if (msg == NULL) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_OUTOFMEMORY;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+
+ // make up the data to send
+ msg->data[0] = T_DELETE_T_C;
+ msg->data[1] = 1;
+ msg->data[2] = connection_id;
+ msg->length = 3;
+ msg->next = NULL;
+
+ // queue it for transmission
+ queue_message(private, slot_id, connection_id, msg);
+ private->slots[slot_id].connections[connection_id].state = T_STATE_ACTIVE_DELETEQUEUED;
+
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return 0;
+}
+
+int en50221_tl_get_connection_state(en50221_transport_layer tl,
+ uint8_t slot_id, uint8_t connection_id)
+{
+ struct en50221_transport_layer_private *private = (struct en50221_transport_layer_private *) tl;
+
+ if (slot_id >= private->max_slots) {
+ private->error = EN50221ERR_BADSLOTID;
+ return -1;
+ }
+
+ pthread_mutex_lock(&private->slots[slot_id].slot_lock);
+ if (private->slots[slot_id].ca_hndl == -1) {
+ private->error = EN50221ERR_BADSLOTID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ if (connection_id >= private->max_connections_per_slot) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCONNECTIONID;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ return -1;
+ }
+ int state = private->slots[slot_id].connections[connection_id].state;
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+
+ return state;
+}
+
+
+
+
+// ask the module for new data
+static int en50221_tl_poll_tc(struct en50221_transport_layer_private *private, uint8_t slot_id, uint8_t connection_id)
+{
+ gettimeofday(&private->slots[slot_id].connections[connection_id].tx_time, 0);
+
+ // send command
+ uint8_t hdr[3];
+ hdr[0] = T_DATA_LAST;
+ hdr[1] = 1;
+ hdr[2] = connection_id;
+ if (dvbca_link_write(private->slots[slot_id].ca_hndl, private->slots[slot_id].slot, connection_id, hdr, 3) < 0) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_CAWRITE;
+ return -1;
+ }
+ return 0;
+}
+
+// handle incoming data
+static int en50221_tl_process_data(struct en50221_transport_layer_private *private, uint8_t slot_id,
+ uint8_t *data, uint32_t data_length)
+{
+ int result;
+
+#ifdef DEBUG_RXDATA
+ printf("-------------------\n");
+ uint32_t ii=0;
+ for(ii=0; ii< data_length; ii++) {
+ printf("%02x: %02x\n", ii, data[ii]);
+ }
+ printf("+++++++++++++++++++\n");
+#endif
+
+ // process the received data
+ while(data_length) {
+ // parse the header
+ uint8_t tpdu_tag = data[0];
+ uint16_t asn_data_length;
+ int length_field_len;
+ if ((length_field_len = asn_1_decode(&asn_data_length, data + 1, data_length - 1)) < 0) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid asn from module on slot %02x\n", slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCAMDATA;
+ return -1;
+ }
+ if ((asn_data_length < 1) || (asn_data_length > (data_length-(1+length_field_len)))) {
+ print(LOG_LEVEL, ERROR, 1, "Received data with invalid length from module on slot %02x\n", slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCAMDATA;
+ return -1;
+ }
+ uint8_t connection_id = data[1 + length_field_len];
+ data += 1 + length_field_len + 1;
+ data_length -= (1 + length_field_len + 1);
+ asn_data_length--;
+
+ // check the connection_id
+ if (connection_id >= private->max_connections_per_slot) {
+ print(LOG_LEVEL, ERROR, 1, "Received bad connection id %02x from module on slot %02x\n", connection_id, slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCONNECTIONID;
+ return -1;
+ }
+
+ // process the TPDUs
+ switch(tpdu_tag) {
+ case T_C_T_C_REPLY:
+ if ((result = en50221_tl_handle_create_tc_reply(private, slot_id, connection_id)) < 0) {
+ return -1;
+ }
+ break;
+ case T_DELETE_T_C:
+ if ((result = en50221_tl_handle_delete_tc(private, slot_id, connection_id)) < 0) {
+ return -1;
+ }
+ break;
+ case T_D_T_C_REPLY:
+ if ((result = en50221_tl_handle_delete_tc_reply(private, slot_id, connection_id)) < 0) {
+ return -1;
+ }
+ break;
+ case T_REQUEST_T_C:
+ if ((result = en50221_tl_handle_request_tc(private, slot_id, connection_id)) < 0) {
+ return -1;
+ }
+ break;
+ case T_DATA_MORE:
+ if ((result = en50221_tl_handle_data_more(private, slot_id, connection_id, data, asn_data_length)) < 0) {
+ return -1;
+ }
+ break;
+ case T_DATA_LAST:
+ if ((result = en50221_tl_handle_data_last(private, slot_id, connection_id, data, asn_data_length)) < 0) {
+ return -1;
+ }
+ break;
+ case T_SB:
+ if ((result = en50221_tl_handle_sb(private, slot_id, connection_id, data, asn_data_length)) < 0) {
+ return -1;
+ }
+ break;
+ default:
+ print(LOG_LEVEL, ERROR, 1, "Recieved unexpected TPDU tag %02x from module on slot %02x\n",
+ tpdu_tag, slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCAMDATA;
+ return -1;
+ }
+
+ // skip over the consumed data
+ data += asn_data_length;
+ data_length -= asn_data_length;
+ }
+
+ return 0;
+}
+
+static int en50221_tl_handle_create_tc_reply(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id)
+{
+ // set this connection to state active
+ if (private->slots[slot_id].connections[connection_id].state == T_STATE_IN_CREATION) {
+ private->slots[slot_id].connections[connection_id].state = T_STATE_ACTIVE;
+ private->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
+
+ // tell upper layers
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_tl_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+ if (cb)
+ cb(cb_arg, T_CALLBACK_REASON_CONNECTIONOPEN, NULL, 0, slot_id, connection_id);
+ } else {
+ print(LOG_LEVEL, ERROR, 1, "Received T_C_T_C_REPLY for connection not in "
+ "T_STATE_IN_CREATION from module on slot %02x\n", slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCAMDATA;
+ return -1;
+ }
+
+ return 0;
+}
+
+static int en50221_tl_handle_delete_tc(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id)
+{
+ // immediately delete this connection and send D_T_C_REPLY
+ if (private->slots[slot_id].connections[connection_id].state & (T_STATE_ACTIVE|T_STATE_IN_DELETION))
+ {
+ // clear down the slot
+ private->slots[slot_id].connections[connection_id].state = T_STATE_IDLE;
+ if (private->slots[slot_id].connections[connection_id].chain_buffer) {
+ free(private->slots[slot_id].connections[connection_id].chain_buffer);
+ }
+ private->slots[slot_id].connections[connection_id].chain_buffer = NULL;
+ private->slots[slot_id].connections[connection_id].buffer_length = 0;
+
+ // send the reply
+ uint8_t hdr[3];
+ hdr[0] = T_D_T_C_REPLY;
+ hdr[1] = 1;
+ hdr[2] = connection_id;
+ if (dvbca_link_write(private->slots[slot_id].ca_hndl, private->slots[slot_id].slot, connection_id, hdr, 3) < 0) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_CAWRITE;
+ return -1;
+ }
+
+ // tell upper layers
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_tl_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+ if (cb)
+ cb(cb_arg, T_CALLBACK_REASON_CONNECTIONCLOSE, NULL, 0, slot_id, connection_id);
+ }
+ else {
+ print(LOG_LEVEL, ERROR, 1, "Received T_DELETE_T_C for inactive connection from module on slot %02x\n",
+ slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCAMDATA;
+ return -1;
+ }
+
+ return 0;
+}
+
+static int en50221_tl_handle_delete_tc_reply(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id)
+{
+ // delete this connection, should be in T_STATE_IN_DELETION already
+ if (private->slots[slot_id].connections[connection_id].state == T_STATE_IN_DELETION) {
+ private->slots[slot_id].connections[connection_id].state = T_STATE_IDLE;
+ } else {
+ print(LOG_LEVEL, ERROR, 1, "Received T_D_T_C_REPLY received for connection not in "
+ "T_STATE_IN_DELETION from module on slot %02x\n", slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCAMDATA;
+ return -1;
+ }
+
+ return 0;
+}
+
+static int en50221_tl_handle_request_tc(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id)
+{
+ // allocate a new connection if possible
+ int conid = en50221_tl_alloc_new_tc(private, slot_id);
+ int ca_hndl = private->slots[slot_id].ca_hndl;
+ if (conid == -1) {
+ print(LOG_LEVEL, ERROR, 1, "Too many connections requested by module on slot %02x\n", slot_id);
+
+ // send the error
+ uint8_t hdr[4];
+ hdr[0] = T_T_C_ERROR;
+ hdr[1] = 2;
+ hdr[2] = connection_id;
+ hdr[3] = 1;
+ if (dvbca_link_write(ca_hndl, private->slots[slot_id].slot, connection_id, hdr, 4) < 0) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_CAWRITE;
+ return -1;
+ }
+ private->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
+ } else {
+ // send the NEW_T_C on the connection we received it on
+ uint8_t hdr[4];
+ hdr[0] = T_NEW_T_C;
+ hdr[1] = 2;
+ hdr[2] = connection_id;
+ hdr[3] = conid;
+ if (dvbca_link_write(ca_hndl, private->slots[slot_id].slot, connection_id, hdr, 4) < 0) {
+ private->slots[slot_id].connections[conid].state = T_STATE_IDLE;
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_CAWRITE;
+ return -1;
+ }
+ private->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
+
+ // send the CREATE_T_C on the new connnection
+ hdr[0] = T_CREATE_T_C;
+ hdr[1] = 1;
+ hdr[2] = conid;
+ if (dvbca_link_write(ca_hndl, private->slots[slot_id].slot, conid, hdr, 3) < 0) {
+ private->slots[slot_id].connections[conid].state = T_STATE_IDLE;
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_CAWRITE;
+ return -1;
+ }
+ gettimeofday(&private->slots[slot_id].connections[conid].tx_time, 0);
+
+ // tell upper layers
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_tl_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+ if (cb)
+ cb(cb_arg, T_CALLBACK_REASON_CAMCONNECTIONOPEN, NULL, 0, slot_id, conid);
+ }
+
+ return 0;
+}
+
+static int en50221_tl_handle_data_more(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id,
+ uint8_t *data, uint32_t data_length)
+{
+ // connection in correct state?
+ if (private->slots[slot_id].connections[connection_id].state != T_STATE_ACTIVE) {
+ print(LOG_LEVEL, ERROR, 1, "Received T_DATA_MORE for connection not in "
+ "T_STATE_ACTIVE from module on slot %02x\n", slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCAMDATA;
+ return -1;
+ }
+
+ // a chained data packet is coming in, save
+ // it to the buffer and wait for more
+ private->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
+ int new_data_length =
+ private->slots[slot_id].connections[connection_id].buffer_length + data_length;
+ uint8_t *new_data_buffer =
+ realloc(private->slots[slot_id].connections[connection_id].chain_buffer, new_data_length);
+ if (new_data_buffer == NULL) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_OUTOFMEMORY;
+ return -1;
+ }
+ private->slots[slot_id].connections[connection_id].chain_buffer = new_data_buffer;
+
+ memcpy(private->slots[slot_id].connections[connection_id].chain_buffer +
+ private->slots[slot_id].connections[connection_id].buffer_length,
+ data, data_length);
+ private->slots[slot_id].connections[connection_id].buffer_length = new_data_length;
+
+ return 0;
+}
+
+static int en50221_tl_handle_data_last(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id,
+ uint8_t *data, uint32_t data_length)
+{
+ // connection in correct state?
+ if (private->slots[slot_id].connections[connection_id].state != T_STATE_ACTIVE) {
+ print(LOG_LEVEL, ERROR, 1, "Received T_DATA_LAST received for connection not in "
+ "T_STATE_ACTIVE from module on slot %02x\n", slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCAMDATA;
+ return -1;
+ }
+
+ // last package of a chain or single package comes in
+ private->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
+ if (private->slots[slot_id].connections[connection_id].chain_buffer == NULL)
+ {
+ // single package => dispatch immediately
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_tl_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+
+ if (cb && data_length) {
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ cb(cb_arg, T_CALLBACK_REASON_DATA, data, data_length, slot_id, connection_id);
+ pthread_mutex_lock(&private->slots[slot_id].slot_lock);
+ }
+ }
+ else
+ {
+ int new_data_length = private->slots[slot_id].connections[connection_id].buffer_length + data_length;
+ uint8_t *new_data_buffer =
+ realloc(private->slots[slot_id].connections[connection_id].chain_buffer, new_data_length);
+ if (new_data_buffer == NULL) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_OUTOFMEMORY;
+ return -1;
+ }
+
+ memcpy(new_data_buffer + private->slots[slot_id].connections[connection_id].buffer_length, data, data_length);
+
+ // clean the buffer position
+ private->slots[slot_id].connections[connection_id].chain_buffer = NULL;
+ private->slots[slot_id].connections[connection_id].buffer_length = 0;
+
+ // tell the upper layers
+ pthread_mutex_lock(&private->setcallback_lock);
+ en50221_tl_callback cb = private->callback;
+ void *cb_arg = private->callback_arg;
+ pthread_mutex_unlock(&private->setcallback_lock);
+ if (cb && data_length) {
+ pthread_mutex_unlock(&private->slots[slot_id].slot_lock);
+ cb(cb_arg, T_CALLBACK_REASON_DATA, new_data_buffer, new_data_length, slot_id, connection_id);
+ pthread_mutex_lock(&private->slots[slot_id].slot_lock);
+ }
+
+ free(new_data_buffer);
+ }
+
+ return 0;
+}
+
+static int en50221_tl_handle_sb(struct en50221_transport_layer_private *private,
+ uint8_t slot_id, uint8_t connection_id,
+ uint8_t *data, uint32_t data_length)
+{
+ // is the connection id ok?
+ if (private->slots[slot_id].connections[connection_id].state != T_STATE_ACTIVE) {
+ print(LOG_LEVEL, ERROR, 1, "Received T_SB for connection not in T_STATE_ACTIVE from module on slot %02x\n",
+ slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCAMDATA;
+ return -1;
+ }
+
+ // did we get enough data in the T_SB?
+ if (data_length != 1) {
+ print(LOG_LEVEL, ERROR, 1, "Recieved T_SB with invalid length from module on slot %02x\n", slot_id);
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_BADCAMDATA;
+ return -1;
+ }
+
+ // tell it to send the data if it says there is some
+ if (data[0] & 0x80) {
+ int ca_hndl = private->slots[slot_id].ca_hndl;
+
+ // send the RCV
+ uint8_t hdr[3];
+ hdr[0] = T_RCV;
+ hdr[1] = 1;
+ hdr[2] = connection_id;
+ if (dvbca_link_write(ca_hndl, private->slots[slot_id].slot, connection_id, hdr, 3) < 0) {
+ private->error_slot = slot_id;
+ private->error = EN50221ERR_CAWRITE;
+ return -1;
+ }
+ gettimeofday(&private->slots[slot_id].connections[connection_id].tx_time, 0);
+
+ } else {
+ // no data - indicate not waiting for anything now
+ private->slots[slot_id].connections[connection_id].tx_time.tv_sec = 0;
+ }
+
+ return 0;
+}
+
+static int en50221_tl_alloc_new_tc(struct en50221_transport_layer_private *private, uint8_t slot_id)
+{
+ // we browse through the array of connection
+ // types, to look for the first unused one
+ int i, conid = -1;
+ for(i=1; i < private->max_connections_per_slot; i++) {
+ if (private->slots[slot_id].connections[i].state == T_STATE_IDLE) {
+ conid = i;
+ break;
+ }
+ }
+ if (conid == -1) {
+ print(LOG_LEVEL, ERROR, 1, "CREATE_T_C failed: no more connections available\n");
+ return -1;
+ }
+
+ // set up the connection struct
+ private->slots[slot_id].connections[conid].state = T_STATE_IN_CREATION;
+ private->slots[slot_id].connections[conid].chain_buffer = NULL;
+ private->slots[slot_id].connections[conid].buffer_length = 0;
+
+ return conid;
+}
+
+static void queue_message(struct en50221_transport_layer_private *private, uint8_t slot_id,
+ uint8_t connection_id, struct en50221_message *msg)
+{
+ msg->next = NULL;
+ if (private->slots[slot_id].connections[connection_id].send_queue_tail) {
+ private->slots[slot_id].connections[connection_id].send_queue_tail->next = msg;
+ } else {
+ private->slots[slot_id].connections[connection_id].send_queue = msg;
+ private->slots[slot_id].connections[connection_id].send_queue_tail = msg;
+ }
+}
diff --git a/kaffeine/src/input/dvb/lib/libdvben50221/en50221_transport.h b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_transport.h
new file mode 100644
index 0000000..59dc64c
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvben50221/en50221_transport.h
@@ -0,0 +1,231 @@
+/*
+ en50221 encoder An implementation for libdvb
+ an implementation for the en50221 session layer
+
+ Copyright (C) 2004, 2005 Manu Abraham (manu@kromtek.com)
+ Copyright (C) 2005 Julian Scheel (julian at jusst dot de)
+ Copyright (C) 2006 Andrew de Quincey (adq_dvb@lidskialf.net)
+
+ This library is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as
+ published by the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+
+#ifndef __EN50221_TRANSPORT_H__
+#define __EN50221_TRANSPORT_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdlib.h>
+#include <stdint.h>
+#include <sys/uio.h>
+
+/**
+ * Callback reasons.
+ */
+#define T_CALLBACK_REASON_CONNECTIONOPEN 0x00 // A connection we opened _to_ the cam has been ACKed
+#define T_CALLBACK_REASON_CAMCONNECTIONOPEN 0x01 // The cam has opened a connection to _us_.
+#define T_CALLBACK_REASON_DATA 0x02 // Data received
+#define T_CALLBACK_REASON_CONNECTIONCLOSE 0x03 // The cam has told us to close a connection.
+#define T_CALLBACK_REASON_SLOTCLOSE 0x04 // The cam in the supplied slot id has been removed.
+
+// these are the states a TC can be in
+#define T_STATE_IDLE 0x01 // this transport connection is not in use
+#define T_STATE_ACTIVE 0x02 // this transport connection is in use
+#define T_STATE_ACTIVE_DELETEQUEUED 0x04 // this transport connection is about to be deleted
+#define T_STATE_IN_CREATION 0x08 // this transport waits for a T_C_T_C_REPLY to become active
+#define T_STATE_IN_DELETION 0x10 // this transport waits for T_D_T_C_REPLY to become idle again
+
+/**
+ * Opaque type representing a transport layer.
+ */
+typedef void *en50221_transport_layer;
+
+/**
+ * Type definition for callback function - used when events are received from a module.
+ *
+ * **IMPORTANT** For all callback reasons except T_CALLBACK_REASON_DATA, an internal lock is held in the
+ * transport layer. Therefore, to avoid deadlock, you *must not* call back into the transport layer for
+ * these reasons.
+ *
+ * However, for T_CALLBACK_REASON_DATA, the internal lock is not held, so calling back into the transport
+ * layer is fine in this case.
+ *
+ * @param arg Private data.
+ * @param reason One of the T_CALLBACK_REASON_* values.
+ * @param data The data.
+ * @param data_length Length of the data.
+ * @param slot_id Slot_id the data was received from.
+ * @param connection_id Connection_id the data was received from.
+ */
+typedef void (*en50221_tl_callback)(void *arg, int reason,
+ uint8_t *data, uint32_t data_length,
+ uint8_t slot_id, uint8_t connection_id);
+
+
+/**
+ * Construct a new instance of the transport layer.
+ *
+ * @param max_slots Maximum number of slots to support.
+ * @param max_connections_per_slot Maximum connections per slot.
+ * @return The en50221_transport_layer instance, or NULL on error.
+ */
+extern en50221_transport_layer en50221_tl_create(uint8_t max_slots, uint8_t max_connections_per_slot);
+
+/**
+ * Destroy an instance of the transport layer.
+ *
+ * @param tl The en50221_transport_layer instance.
+ */
+extern void en50221_tl_destroy(en50221_transport_layer tl);
+
+/**
+ * Register a new slot with the library.
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @param ca_hndl FD for talking to the slot.
+ * @param slot CAM slot where the requested CAM of the CA is in.
+ * @param response_timeout Maximum timeout in ms to a response we send before signalling a timeout.
+ * @param poll_delay Interval between polls in ms.
+ * @return slot_id on sucess, or -1 on error.
+ */
+extern int en50221_tl_register_slot(en50221_transport_layer tl, int ca_hndl,
+ uint8_t slot, uint32_t response_timeout,
+ uint32_t poll_delay);
+
+/**
+ * Destroy a registered slot - e.g. if a CAM is removed, or an error occurs. Does
+ * not attempt to reset the CAM.
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @param slot_id Slot to destroy.
+ */
+extern void en50221_tl_destroy_slot(en50221_transport_layer tl, uint8_t slot_id);
+
+/**
+ * Performs one iteration of the transport layer poll -
+ * checking for incoming data furthermore it will handle
+ * the timeouts of certain commands like T_DELETE_T_C it
+ * should be called by the application regularly, generally
+ * faster than the poll delay.
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @return 0 on succes, or -1 if there was an error of some sort.
+ */
+extern int en50221_tl_poll(en50221_transport_layer tl);
+
+/**
+ * Register the callback for data reception.
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @param callback The callback. Set to NULL to remove the callback completely.
+ * @param arg Private data passed as arg0 of the callback.
+ */
+extern void en50221_tl_register_callback(en50221_transport_layer tl,
+ en50221_tl_callback callback, void *arg);
+
+/**
+ * Gets the ID of the slot an error occurred on.
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @return The offending slot id.
+ */
+extern int en50221_tl_get_error_slot(en50221_transport_layer tl);
+
+/**
+ * Gets the last error.
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @return One of the EN50221ERR_* values.
+ */
+extern int en50221_tl_get_error(en50221_transport_layer tl);
+
+/**
+ * This function is used to take a data-block, pack into
+ * into a TPDU (DATA_LAST) and send it to the device
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @param slot_id ID of the slot.
+ * @param connection_id Connection id.
+ * @param data Data to send.
+ * @param data_length Number of bytes to send.
+ * @return 0 on success, or -1 on error.
+ */
+extern int en50221_tl_send_data(en50221_transport_layer tl,
+ uint8_t slot_id, uint8_t connection_id,
+ uint8_t *data, uint32_t data_length);
+
+/**
+ * This function is used to take a data-block, pack into
+ * into a TPDU (DATA_LAST) and send it to the device
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @param slot_id ID of the slot.
+ * @param connection_id Connection id.
+ * @param vector iov to send.
+ * @param io_count Number of elements in vector.
+ * @return 0 on success, or -1 on error.
+ */
+extern int en50221_tl_send_datav(en50221_transport_layer tl, uint8_t slot_id,
+ uint8_t connection_id, struct iovec *vector,
+ int iov_count);
+
+/**
+ * Create a new transport connection to the cam.
+ *
+ * **IMPORTANT** When this function returns, it means the request to create a connection
+ * has been submitted. You will need to poll using en50221_tl_get_connection_state() to find out
+ * if/when the connection is established. A callback with T_CALLBACK_REASON_CONNECTIONOPEN reason
+ * will also be sent when it is acked by the CAM.
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @param slot_id ID of the slot.
+ * @return The allocated connection id on success, or -1 on error.
+ */
+extern int en50221_tl_new_tc(en50221_transport_layer tl, uint8_t slot_id);
+
+/**
+ * Deallocates a transport connection.
+ *
+ * **IMPORTANT** When this function returns, it means the request to destroy a connection
+ * has been submitted. You will need to poll using en50221_tl_get_connection_state() to find out
+ * if/when the connection is destroyed.
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @param slot_id ID of the slot.
+ * @param connection_id Connection id to send the request _on_.
+ * @return 0 on success, or -1 on error.
+ */
+extern int en50221_tl_del_tc(en50221_transport_layer tl, uint8_t slot_id,
+ uint8_t connection_id);
+
+/**
+ * Checks the state of a connection.
+ *
+ * @param tl The en50221_transport_layer instance.
+ * @param slot_id ID of the slot.
+ * @param connection_id Connection id to send the request _on_.
+ * @return One of the T_STATE_* values.
+ */
+extern int en50221_tl_get_connection_state(en50221_transport_layer tl,
+ uint8_t slot_id, uint8_t connection_id);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libdvbmisc/dvbmisc.h b/kaffeine/src/input/dvb/lib/libdvbmisc/dvbmisc.h
new file mode 100644
index 0000000..75713f4
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libdvbmisc/dvbmisc.h
@@ -0,0 +1,72 @@
+/*
+ libdvbmisc - DVB miscellaneous library
+
+ Copyright (C) 2005 Manu Abraham <manu@kromtek.com>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+ This library 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
+ Lesser General Public License for more details.
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+
+#ifndef DVB_MISC_H
+#define DVB_MISC_H
+
+#include <stdarg.h>
+#include <stdint.h>
+#include <stdio.h>
+#include <sys/time.h>
+
+#define ERROR 0
+#define NOTICE 1
+#define INFO 2
+#define DEBUG 3
+
+#define print(x, y, z, fmt, arg...) do { \
+ if (z) { \
+ if ((x > ERROR) && (x > y)) \
+ vprint("%s: " fmt "\n", __func__ , ##arg); \
+ else if ((x > NOTICE) && (x > y)) \
+ vprint("%s: " fmt "\n",__func__ , ##arg); \
+ else if ((x > INFO) && (x > y)) \
+ vprint("%s: " fmt "\n", __func__ , ##arg); \
+ else if ((x > DEBUG) && (x > y)) \
+ vprint("%s: " fmt "\n", __func__ , ##arg); \
+ } else { \
+ if (x > y) \
+ vprint(fmt, ##arg); \
+ } \
+} while(0)
+
+static inline void vprint(char *fmt, ...)
+{
+ va_list args;
+
+ va_start(args, fmt);
+ vfprintf(stderr, fmt, args);
+ va_end(args);
+}
+
+static inline int time_after(struct timeval oldtime, uint32_t delta_ms)
+{
+ // calculate the oldtime + add on the delta
+ uint64_t oldtime_ms = (oldtime.tv_sec * 1000) + (oldtime.tv_usec / 1000);
+ oldtime_ms += delta_ms;
+
+ // calculate the nowtime
+ struct timeval nowtime;
+ gettimeofday(&nowtime, 0);
+ uint64_t nowtime_ms = (nowtime.tv_sec * 1000) + (nowtime.tv_usec / 1000);
+
+ // check
+ return nowtime_ms > oldtime_ms;
+}
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/Makefile.am b/kaffeine/src/input/dvb/lib/libucsi/Makefile.am
new file mode 100644
index 0000000..071f310
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/Makefile.am
@@ -0,0 +1,17 @@
+noinst_LTLIBRARIES = libucsi.la
+
+SUBDIRS = dvb mpeg .
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/dvb/lib
+
+libucsi_la_SOURCES = crc32.c \
+ section_buf.c \
+ transport_packet.c
+
+libucsi_la_LDFLAGS = ./mpeg \
+ ./dvb
+
+libucsi_la_LIBADD = ./mpeg/libdvbmpeg.la \
+ ./dvb/libdvbdvb.la
+
+CFLAGS = -g -O2 -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -fPIC
diff --git a/kaffeine/src/input/dvb/lib/libucsi/atsc/descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/atsc/descriptor.h
new file mode 100644
index 0000000..a18b29d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/atsc/descriptor.h
@@ -0,0 +1,70 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_ATSC_DESCRIPTOR_H
+#define _UCSI_ATSC_DESCRIPTOR_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/endianops.h>
+
+/**
+ * Enumeration of ATSC descriptor tags.
+ */
+enum atsc_descriptor_tag {
+
+/* A 52/A describes a
+ * dtag_atsc_ac3_registration = 0x05, */
+
+/* A90 describes a
+ * dtag_atsc_association_tag = 0x14, */
+
+ dtag_atsc_stuffing = 0x80,
+ dtag_atsc_ac3_audio = 0x81,
+ dtag_atsc_caption_service = 0x86,
+ dtag_atsc_content_advisory = 0x87,
+ dtag_atsc_ca = 0x88,
+ dtag_atsc_extended_channel_name = 0xa0,
+ dtag_atsc_service_location = 0xa1,
+ dtag_atsc_time_shifted_service = 0xa2,
+ dtag_atsc_component_name = 0xa3,
+ dtag_atsc_data_service = 0xa4,
+ dtag_atsc_pid_count = 0xa5,
+ dtag_atsc_download = 0xa6,
+ dtag_atsc_MPE = 0xa7,
+ dtag_atsc_dcc_departing_request = 0xa8,
+ dtag_atsc_dcc_arriving_request = 0xa9,
+ dtag_atsc_redistribution_control = 0xaa,
+ dtag_atsc_dcc_location_code = 0xab,
+ dtag_atsc_private_information = 0xad,
+ dtag_atsc_module_link = 0xb4,
+ dtag_atsc_crc32 = 0xb5,
+ dtag_atsc_group_link = 0xb8,
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/atsc/section.h b/kaffeine/src/input/dvb/lib/libucsi/atsc/section.h
new file mode 100644
index 0000000..e693b9d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/atsc/section.h
@@ -0,0 +1,69 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_ATSC_SECTION_H
+#define _UCSI_ATSC_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**
+ * Enumeration of ATSC section tags.
+ */
+enum atsc_section_tag {
+/* 0xC0-0xC6 [ATSC coordinated values which are defined in other standards.] */
+ stag_atsc_master_guide = 0xc7,
+ stag_atsc_terrestrial_virtual_channel = 0xc8,
+ stag_atsc_cable_virtual_channel = 0xc9,
+ stag_atsc_rating_region = 0xca,
+ stag_atsc_event_informationen = 0xcb,
+ stag_atsc_extended_text = 0xcc,
+ stag_atsc_system_time = 0xcd,
+
+ stag_atsc_data_event = 0xce,
+ stag_atsc_data_service = 0xcf,
+ stag_atsc_network_resources = 0xd1,
+ stag_atsc_long_term_serivce = 0xd2,
+/* identical to DVB/ISO ?
+ 0x3F DSM-CC Addressable Section Table
+ 0x3B DSM-CC Section Table
+ 0x3C DSM-CC Section Table */
+
+ /* 0xCE-0xD2 [ATSC coordinated values which are defined in other standards.] */
+ stag_atsc_directed_channel_change = 0xd3,
+ stag_atsc_directed_channel_change_selection_code = 0xd4,
+
+ /* 0xD5-0xDF [ATSC coordinated values which are defined in other standards.] */
+ stag_atsc_aggregate_event_information = 0xd6,
+ stag_atsc_aggregate_extended_text = 0xd7,
+ stag_atsc_satellite_virtual_channel = 0xda,
+
+ /* 0xE0-0xE5 [Used in other systems] */
+ /* 0xE6-0xFE [Reserved for future ATSC use] */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/crc32.c b/kaffeine/src/input/dvb/lib/libucsi/crc32.c
new file mode 100644
index 0000000..dc1de5c
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/crc32.c
@@ -0,0 +1,89 @@
+/**
+ * crc32 calculation routines.
+ *
+ * Copyright (c) 2005 by Andrew de Quincey <adq_dvb@lidskialf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdint.h>
+
+uint32_t crc32tbl[] =
+{
+ 0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9,
+ 0x130476dc, 0x17c56b6b, 0x1a864db2, 0x1e475005,
+ 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,
+ 0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd,
+ 0x4c11db70, 0x48d0c6c7, 0x4593e01e, 0x4152fda9,
+ 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,
+ 0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011,
+ 0x791d4014, 0x7ddc5da3, 0x709f7b7a, 0x745e66cd,
+ 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,
+ 0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5,
+ 0xbe2b5b58, 0xbaea46ef, 0xb7a96036, 0xb3687d81,
+ 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,
+ 0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49,
+ 0xc7361b4c, 0xc3f706fb, 0xceb42022, 0xca753d95,
+ 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,
+ 0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d,
+ 0x34867077, 0x30476dc0, 0x3d044b19, 0x39c556ae,
+ 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,
+ 0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16,
+ 0x018aeb13, 0x054bf6a4, 0x0808d07d, 0x0cc9cdca,
+ 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,
+ 0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02,
+ 0x5e9f46bf, 0x5a5e5b08, 0x571d7dd1, 0x53dc6066,
+ 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,
+ 0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e,
+ 0xbfa1b04b, 0xbb60adfc, 0xb6238b25, 0xb2e29692,
+ 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,
+ 0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a,
+ 0xe0b41de7, 0xe4750050, 0xe9362689, 0xedf73b3e,
+ 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,
+ 0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686,
+ 0xd5b88683, 0xd1799b34, 0xdc3abded, 0xd8fba05a,
+ 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,
+ 0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb,
+ 0x4f040d56, 0x4bc510e1, 0x46863638, 0x42472b8f,
+ 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,
+ 0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47,
+ 0x36194d42, 0x32d850f5, 0x3f9b762c, 0x3b5a6b9b,
+ 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,
+ 0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623,
+ 0xf12f560e, 0xf5ee4bb9, 0xf8ad6d60, 0xfc6c70d7,
+ 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,
+ 0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f,
+ 0xc423cd6a, 0xc0e2d0dd, 0xcda1f604, 0xc960ebb3,
+ 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,
+ 0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b,
+ 0x9b3660c6, 0x9ff77d71, 0x92b45ba8, 0x9675461f,
+ 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,
+ 0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640,
+ 0x4e8ee645, 0x4a4ffbf2, 0x470cdd2b, 0x43cdc09c,
+ 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,
+ 0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24,
+ 0x119b4be9, 0x155a565e, 0x18197087, 0x1cd86d30,
+ 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,
+ 0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088,
+ 0x2497d08d, 0x2056cd3a, 0x2d15ebe3, 0x29d4f654,
+ 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,
+ 0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c,
+ 0xe3a1cbc1, 0xe760d676, 0xea23f0af, 0xeee2ed18,
+ 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,
+ 0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0,
+ 0x9abc8bd5, 0x9e7d9662, 0x933eb0bb, 0x97ffad0c,
+ 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,
+ 0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4
+};
diff --git a/kaffeine/src/input/dvb/lib/libucsi/crc32.h b/kaffeine/src/input/dvb/lib/libucsi/crc32.h
new file mode 100644
index 0000000..5d77e84
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/crc32.h
@@ -0,0 +1,58 @@
+/**
+ * crc32 calculation routines.
+ *
+ * Copyright (c) 2005 by Andrew de Quincey <adq_dvb@lidskialf.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_CRC32_H
+#define _UCSI_CRC32_H 1
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#define CRC32_INIT (~0)
+
+extern uint32_t crc32tbl[];
+
+/**
+ * Calculate a CRC32 over a piece of data.
+ *
+ * @param crc Current CRC value (use CRC32_INIT for first call).
+ * @param buf Buffer to calculate over.
+ * @param len Number of bytes.
+ * @return Calculated CRC.
+ */
+static inline uint32_t crc32(uint32_t crc, uint8_t* buf, int len)
+{
+ int i;
+
+ for (i=0; i< len; i++) {
+ crc = (crc << 8) ^ crc32tbl[((crc >> 24) ^ buf[i]) & 0xff];
+ }
+
+ return crc;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/descriptor.h
new file mode 100644
index 0000000..809936d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/descriptor.h
@@ -0,0 +1,129 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DESCRIPTOR_H
+#define _UCSI_DESCRIPTOR_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/endianops.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+/**
+ * Generic descriptor header.
+ */
+struct descriptor {
+ uint8_t tag;
+ uint8_t len;
+} __ucsi_packed;
+
+/**
+ * Retreive pointer to the next descriptor structure.
+ *
+ * @param buf The buffer of descriptors.
+ * @param len Size of the buffer.
+ * @param pos Current descriptor.
+ * @return Pointer to next descriptor, or NULL if there are none.
+ */
+static inline struct descriptor *
+ next_descriptor(uint8_t * buf, int len, struct descriptor * pos)
+{
+ uint8_t* next;
+
+ if (pos == NULL)
+ return NULL;
+
+ next = (uint8_t*) pos + 2 + pos->len;
+ if (next >= buf + len)
+ return NULL;
+
+ return (struct descriptor *) next;
+}
+
+
+/**
+ * The unknown descriptor.
+ */
+struct unknown_descriptor {
+ struct descriptor d;
+
+ /* uint8_t data [] */
+} __ucsi_packed;
+
+/**
+ * Retrieve pointer to the unknown descriptor's data field.
+ *
+ * @param d The descriptor.
+ * @return Pointer to the data field.
+ */
+static inline uint8_t *
+ unknown_descriptor_data(struct unknown_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct unknown_descriptor);
+}
+
+/**
+ * Retrieve size of unknown descriptor's data field.
+ *
+ * @param d The descriptor.
+ * @return Size of data field in bytes.
+ */
+static inline int
+ unknown_descriptor_data_size(struct unknown_descriptor *d)
+{
+ return d->d.len;
+}
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline int verify_descriptors(uint8_t * buf, int len)
+{
+ int pos = 0;
+
+ while (pos < len) {
+ if ((pos + 2) > len)
+ return -1;
+
+ pos += 2 + buf[pos+1];
+ }
+
+ if (pos != len)
+ return -1;
+
+ return 0;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/Makefile.am b/kaffeine/src/input/dvb/lib/libucsi/dvb/Makefile.am
new file mode 100644
index 0000000..b358273
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/Makefile.am
@@ -0,0 +1,19 @@
+noinst_LTLIBRARIES = libdvbdvb.la
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/dvb/lib
+
+libdvbdvb_la_SOURCES = bat_section.c \
+ dit_section.c \
+ eit_section.c \
+ int_section.c \
+ nit_section.c \
+ rst_section.c \
+ sdt_section.c \
+ sit_section.c \
+ st_section.c \
+ tdt_section.c \
+ tot_section.c \
+ tva_container_section.c \
+ types.c
+
+CFLAGS = -g -O2 -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -fPIC
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/ac3_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/ac3_descriptor.h
new file mode 100644
index 0000000..d60e37b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/ac3_descriptor.h
@@ -0,0 +1,88 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_AC3_DESCRIPTOR
+#define _UCSI_DVB_AC3_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_ac3_descriptor structure.
+ */
+struct dvb_ac3_descriptor {
+ struct descriptor d;
+
+ EBIT5(uint8_t ac3_type_flag : 1; ,
+ uint8_t bsid_flag : 1; ,
+ uint8_t mainid_flag : 1; ,
+ uint8_t asvc_flag : 1; ,
+ uint8_t reserved : 4; )
+ /* uint8_t additional_info[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_ac3_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_ac3_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_ac3_descriptor*
+ dvb_ac3_descriptor_codec(struct descriptor* d)
+{
+ if (d->len < (sizeof(struct dvb_ac3_descriptor) - 2))
+ return NULL;
+
+ return (struct dvb_ac3_descriptor*) d;
+}
+
+/**
+ * Retrieve pointer to additional_info field of a dvb_ac3_descriptor.
+ *
+ * @param d dvb_ac3_descriptor pointer.
+ * @return Pointer to additional_info field.
+ */
+static inline uint8_t *dvb_ac3_descriptor_additional_info(struct dvb_ac3_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_ac3_descriptor);
+}
+
+/**
+ * Determine length of additional_info field of a dvb_ac3_descriptor.
+ *
+ * @param d dvb_ac3_descriptor pointer.
+ * @return Length of field in bytes.
+ */
+static inline int dvb_ac3_descriptor_additional_info_length(struct dvb_ac3_descriptor *d)
+{
+ return d->d.len - 1;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/adaptation_field_data_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/adaptation_field_data_descriptor.h
new file mode 100644
index 0000000..69a21b8
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/adaptation_field_data_descriptor.h
@@ -0,0 +1,62 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_ADAPTATION_FIELD_DATA_DESCRIPTOR
+#define _UCSI_DVB_ADAPTATION_FIELD_DATA_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_adaptation_field_data_descriptor structure.
+ */
+struct dvb_adaptation_field_data_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint8_t reserved : 7; ,
+ uint8_t announcement_switching_data : 1; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_adaptation_field_data_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to dvb_adaptation_field_data_descriptor, or NULL on error.
+ */
+static inline struct dvb_adaptation_field_data_descriptor*
+ dvb_adaptation_field_data_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_adaptation_field_data_descriptor) - 2))
+ return NULL;
+
+ return (struct dvb_adaptation_field_data_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_descriptor.h
new file mode 100644
index 0000000..877d9c0
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_descriptor.h
@@ -0,0 +1,204 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_AIT_APPLICATION_DESCRIPTOR
+#define _UCSI_DVB_AIT_APPLICATION_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Possible values for the visibility field.
+ */
+enum {
+ AVB_AIT_APPLICATION_VISIBILITY_HIDDEN = 0x00,
+ AVB_AIT_APPLICATION_VISIBILITY_APPSONLY = 0x01,
+ AVB_AIT_APPLICATION_VISIBILITY_VISIBLE = 0x03
+};
+
+/**
+ * dvb_ait_application_descriptor structure.
+ */
+struct dvb_ait_application_descriptor {
+ struct descriptor d;
+
+ uint8_t application_profiles_length;
+ /* struct dvb_ait_application_profile profiles [] */
+ /* struct dvb_ait_application_descriptor_part2 part2 */
+} __ucsi_packed;
+
+/**
+ * An entry in the profiles field of a dvb_ait_application_descriptor.
+ */
+struct dvb_ait_application_profile {
+ uint16_t application_profile;
+ uint8_t version_major;
+ uint8_t version_minor;
+ uint8_t version_micro;
+} __ucsi_packed;
+
+/**
+ * Second part of a dvb_ait_application_descriptor structure.
+ */
+struct dvb_ait_application_descriptor_part2 {
+ EBIT3(uint8_t service_bound_flag : 1; ,
+ uint8_t visibility : 2; ,
+ uint8_t reserved : 5; )
+ uint8_t application_priority;
+ /* uint8_t transport_protocol_label[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_ait_application_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_ait_application_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_ait_application_descriptor*
+ dvb_ait_application_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint32_t pos2 = 0;
+ uint32_t len = d->len + 2;
+ uint8_t* buf = (uint8_t*) d;
+ struct dvb_ait_application_descriptor *ret =
+ (struct dvb_ait_application_descriptor*) d;
+
+ if (len < sizeof(struct dvb_ait_application_descriptor))
+ return NULL;
+
+ if (len < (sizeof(struct dvb_ait_application_descriptor) + ret->application_profiles_length))
+ return NULL;
+
+ if (ret->application_profiles_length % sizeof(struct dvb_ait_application_profile))
+ return NULL;
+
+ pos += sizeof(struct dvb_ait_application_descriptor);
+ pos2 = 0;
+ while(pos2 < ret->application_profiles_length) {
+ bswap16(buf + pos + pos2);
+ pos2 += sizeof(struct dvb_ait_application_descriptor);
+ }
+ pos += pos2;
+
+ if (len < (pos + sizeof(struct dvb_ait_application_descriptor_part2)))
+ return NULL;
+
+ return ret;
+}
+
+/**
+ * Iterator for the profiles field of a dvb_ait_application_descriptor.
+ *
+ * @param d dvb_ait_application_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_ait_application_profile.
+ */
+#define dvb_ait_application_descriptor_profiles_for_each(d, pos) \
+ for ((pos) = dvb_ait_application_descriptor_profiles_first(d); \
+ (pos); \
+ (pos) = dvb_ait_application_descriptor_profiles_next(d, pos))
+
+/**
+ * Accessor for the part2 field of a dvb_ait_application_descriptor.
+ *
+ * @param d dvb_ait_application_descriptor pointer.
+ * @return dvb_ait_application_descriptor_part2 pointer.
+ */
+static inline struct dvb_ait_application_descriptor_part2*
+ dvb_ait_application_descriptor_part2(struct dvb_ait_application_descriptor* d)
+{
+ return (struct dvb_ait_application_descriptor_part2*)
+ ((uint8_t*) d +
+ sizeof(struct dvb_ait_application_descriptor) +
+ d->application_profiles_length);
+}
+
+/**
+ * Accessor for the transport_protocol_label field of a dvb_ait_application_descriptor_part2.
+ *
+ * @param d dvb_ait_application_descriptor_part2 pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ dvb_ait_application_descriptor_part2_transport_protocol_label(struct dvb_ait_application_descriptor_part2* d)
+{
+ return (uint8_t*) d +
+ sizeof(struct dvb_ait_application_descriptor_part2);
+}
+
+/**
+ * Calculate the number of bytes in the transport_protocol_label field of a dvb_ait_application_descriptor_part2.
+ *
+ * @param d dvb_ait_application_descriptor pointer.
+ * @param part2 dvb_ait_application_descriptor_part2 pointer.
+ * @return Number of bytes.
+ */
+static inline int
+ dvb_ait_application_descriptor_part2_transport_protocol_label_length(struct dvb_ait_application_descriptor *d,
+ struct dvb_ait_application_descriptor_part2* part2)
+{
+ uint8_t *ptr = (uint8_t*) part2 + sizeof(struct dvb_ait_application_descriptor_part2);
+ uint8_t *end = (uint8_t*) d + d->d.len + 2;
+
+ return (int) (end - ptr);
+}
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_ait_application_profile*
+ dvb_ait_application_descriptor_profiles_first(struct dvb_ait_application_descriptor *d)
+{
+ if (d->application_profiles_length == 0)
+ return NULL;
+
+ return (struct dvb_ait_application_profile *)
+ ((uint8_t*) d + sizeof(struct dvb_ait_application_descriptor));
+}
+
+static inline struct dvb_ait_application_profile*
+ dvb_ait_application_descriptor_profiles_next(struct dvb_ait_application_descriptor *d,
+ struct dvb_ait_application_profile *pos)
+{
+ uint8_t *end = (uint8_t*) d +
+ sizeof(struct dvb_ait_application_descriptor) +
+ d->application_profiles_length;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_ait_application_profile);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_ait_application_profile *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_icons_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_icons_descriptor.h
new file mode 100644
index 0000000..5ea5932
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_icons_descriptor.h
@@ -0,0 +1,157 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_AIT_APPLICATION_ICONS_DESCRIPTOR
+#define _UCSI_DVB_AIT_APPLICATION_ICONS_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * Possible values for the icon_flags field.
+ */
+enum {
+ AIT_APPLICATION_ICON_FLAG_32_32 = 0x001,
+ AIT_APPLICATION_ICON_FLAG_32_32_43 = 0x002,
+ AIT_APPLICATION_ICON_FLAG_24_32_169 = 0x004,
+
+ AIT_APPLICATION_ICON_FLAG_64_64 = 0x008,
+ AIT_APPLICATION_ICON_FLAG_64_64_43 = 0x010,
+ AIT_APPLICATION_ICON_FLAG_48_64_169 = 0x020,
+
+ AIT_APPLICATION_ICON_FLAG_128_128 = 0x040,
+ AIT_APPLICATION_ICON_FLAG_128_128_43 = 0x080,
+ AIT_APPLICATION_ICON_FLAG_96_128_169 = 0x100
+};
+
+/**
+ * dvb_ait_application_icons_descriptor structure.
+ */
+struct dvb_ait_application_icons_descriptor {
+ struct descriptor d;
+
+ uint8_t icon_locator_length;
+ /* uint8_t icon_locator[] */
+ /* struct dvb_ait_application_icons_descriptor_part2 */
+} __ucsi_packed;
+
+/**
+ * Second part of a dvb_ait_application_icons_descriptor.
+ */
+struct dvb_ait_application_icons_descriptor_part2 {
+ uint16_t icon_flags;
+ /* uint8_t reserved[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_ait_application_icons_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_ait_application_icons_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_ait_application_icons_descriptor*
+ dvb_ait_application_icons_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* buf = (uint8_t*) d;
+ uint32_t pos = 0;
+ uint32_t len = d->len + 2;
+ struct dvb_ait_application_icons_descriptor *ret =
+ (struct dvb_ait_application_icons_descriptor *) d;
+
+ if (len < sizeof(struct dvb_ait_application_icons_descriptor))
+ return NULL;
+ if (len < (sizeof(struct dvb_ait_application_icons_descriptor) + ret->icon_locator_length))
+ return NULL;
+
+ pos += sizeof(struct dvb_ait_application_icons_descriptor) + ret->icon_locator_length;
+
+ if ((len - pos) < sizeof(struct dvb_ait_application_icons_descriptor_part2))
+ return NULL;
+ bswap16(buf + pos);
+
+ return ret;
+}
+/**
+ * Accessor for the icon_locator field of a dvb_ait_application_icons_descriptor.
+ *
+ * @param e dvb_ait_application_icons_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_ait_application_icons_descriptor_icon_locator(struct dvb_ait_application_icons_descriptor *e)
+{
+ return (uint8_t *) e + sizeof(struct dvb_ait_application_icons_descriptor);
+}
+
+/**
+ * Accessor for the part2 field of a dvb_ait_application_icons_descriptor.
+ *
+ * @param e dvb_ait_application_icons_descriptor Pointer.
+ * @return dvb_ait_application_icons_descriptor_part2 pointer.
+ */
+static inline struct dvb_ait_application_icons_descriptor_part2 *
+ dvb_ait_application_icons_descriptor_part2(struct dvb_ait_application_icons_descriptor *e)
+{
+ return (struct dvb_ait_application_icons_descriptor_part2 *)
+ ((uint8_t *) e + sizeof(struct dvb_ait_application_icons_descriptor) +
+ e->icon_locator_length);
+}
+
+/**
+ * Accessor for the reserved field of a dvb_ait_application_icons_descriptor_part2.
+ *
+ * @param e dvb_ait_application_icons_part2 pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_ait_application_icons_descriptor_part2_reserved(struct dvb_ait_application_icons_descriptor_part2 *e)
+{
+ return (uint8_t *) e + sizeof(struct dvb_ait_application_icons_descriptor_part2);
+}
+
+/**
+ * Calculate the number of bytes in the reserved field of a dvb_ait_application_icons_descriptor_part2.
+ *
+ * @param d dvb_ait_application_icons_descriptorpointer.
+ * @param part2 dvb_ait_application_icons_descriptor_part2 pointer.
+ * @return Number of bytes.
+ */
+static inline int
+ dvb_ait_application_icons_descriptor_part2_reserved_length(struct dvb_ait_application_icons_descriptor *d,
+ struct dvb_ait_application_icons_descriptor_part2* part2)
+{
+ uint8_t *ptr = (uint8_t*) part2 + sizeof(struct dvb_ait_application_icons_descriptor_part2);
+ uint8_t *end = (uint8_t*) d + d->d.len + 2;
+
+ return (int) (end - ptr);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_name_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_name_descriptor.h
new file mode 100644
index 0000000..a4b719e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_application_name_descriptor.h
@@ -0,0 +1,145 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_AIT_APPLICATION_NAME_DESCRIPTOR
+#define _UCSI_DVB_AIT_APPLICATION_NAME_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_ait_application_name_descriptor structure.
+ */
+struct dvb_ait_application_name_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_ait_application_name names[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the names field of a dvb_ait_application_name_descriptor.
+ */
+struct dvb_ait_application_name {
+ iso639lang_t language_code;
+ uint8_t application_name_length;
+ /* uint8_t name[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_ait_application_name_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_ait_application_name_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_ait_application_name_descriptor*
+ dvb_ait_application_name_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+
+ while(pos < len) {
+ struct dvb_ait_application_name *e =
+ (struct dvb_ait_application_name*) (buf + pos);
+
+ pos += sizeof(struct dvb_ait_application_name);
+
+ if (pos > len)
+ return NULL;
+
+ pos += e->application_name_length;
+
+ if (pos > len)
+ return NULL;
+ }
+
+ return (struct dvb_ait_application_name_descriptor*) d;
+}
+
+/**
+ * Iterator for entries in the names field of a dvb_ait_application_name_descriptor.
+ *
+ * @param d dvb_ait_application_name_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_ait_application_name.
+ */
+#define dvb_ait_application_name_descriptor_names_for_each(d, pos) \
+ for ((pos) = dvb_ait_application_name_descriptor_names_first(d); \
+ (pos); \
+ (pos) = dvb_ait_application_name_descriptor_names_next(d, pos))
+
+/**
+ * Accessor for the name field of a dvb_ait_application_name.
+ *
+ * @param e dvb_ait_application_name pointer.
+ * @return Pointer to the name field.
+ */
+static inline uint8_t *
+ dvb_ait_application_name_name(struct dvb_ait_application_name *e)
+{
+ return (uint8_t *) e + sizeof(struct dvb_ait_application_name);
+}
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_ait_application_name*
+ dvb_ait_application_name_descriptor_names_first(struct dvb_ait_application_name_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_ait_application_name *)
+ ((uint8_t*) d + sizeof(struct dvb_ait_application_name_descriptor));
+}
+
+static inline struct dvb_ait_application_name*
+ dvb_ait_application_name_descriptor_names_next(struct dvb_ait_application_name_descriptor *d,
+ struct dvb_ait_application_name *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_ait_application_name) +
+ pos->application_name_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_ait_application_name *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h
new file mode 100644
index 0000000..34f584a
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/ait_external_application_authorisation_descriptor.h
@@ -0,0 +1,125 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_AIT_EXTERNAL_APPLICATION_AUTHORISATION_DESCRIPTOR
+#define _UCSI_DVB_AIT_EXTERNAL_APPLICATION_AUTHORISATION_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_ait_external_application_authorisation_descriptor structure.
+ */
+struct dvb_ait_external_application_authorisation_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_ait_external_application_authorisation auths[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the auths field of a dvb_ait_external_application_authorisation_descriptor.
+ */
+struct dvb_ait_external_application_authorisation {
+ uint32_t organization_id;
+ uint16_t application_id;
+ uint8_t application_priority;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_ait_external_application_authorisation_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_ait_external_application_authorisation_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_ait_external_application_authorisation_descriptor*
+ dvb_ait_external_application_authorisation_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+
+ if (len % sizeof(struct dvb_ait_external_application_authorisation))
+ return NULL;
+
+ while(pos < len) {
+ bswap32(buf + pos);
+ bswap32(buf + pos + 4);
+ pos += sizeof(struct dvb_ait_external_application_authorisation);
+ }
+
+ return (struct dvb_ait_external_application_authorisation_descriptor*) d;
+}
+
+/**
+ * Iterator for entries in the auths field of a dvb_ait_external_application_authorisation_descriptor.
+ *
+ * @param d dvb_ait_external_application_authorisation_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_ait_external_application_authorisation.
+ */
+#define dvb_ait_external_application_authorisation_descriptor_auths_for_each(d, pos) \
+ for ((pos) = dvb_ait_external_application_authorisation_descriptor_auths_first(d); \
+ (pos); \
+ (pos) = dvb_ait_external_application_authorisation_descriptor_auths_next(d, pos))
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_ait_external_application_authorisation*
+ dvb_ait_external_application_authorisation_descriptor_auths_first(struct dvb_ait_external_application_authorisation_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_ait_external_application_authorisation *)
+ ((uint8_t*) d + sizeof(struct dvb_ait_external_application_authorisation_descriptor));
+}
+
+static inline struct dvb_ait_external_application_authorisation*
+ dvb_ait_external_application_authorisation_descriptor_auths_next(struct dvb_ait_external_application_authorisation_descriptor *d,
+ struct dvb_ait_external_application_authorisation *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_ait_external_application_authorisation);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_ait_external_application_authorisation *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/ancillary_data_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/ancillary_data_descriptor.h
new file mode 100644
index 0000000..7a0280d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/ancillary_data_descriptor.h
@@ -0,0 +1,67 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_ANCILLARY_DATA_DESCRIPTOR
+#define _UCSI_DVB_ANCILLARY_DATA_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_ancillary_data_descriptor structure.
+ */
+struct dvb_ancillary_data_descriptor {
+ struct descriptor d;
+ EBIT8(uint8_t reserved : 1; ,
+ uint8_t rds_via_udcp : 1; ,
+ uint8_t mpeg4_ancillary_data : 1; ,
+ uint8_t scale_factor_error_check : 1; ,
+ uint8_t dab_ancillary_data : 1; ,
+ uint8_t announcement_switching_data : 1; ,
+ uint8_t extended_ancillary_data : 1; ,
+ uint8_t dvd_video_ancillary_data : 1; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_ancillary_data_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_ancillary_data_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_ancillary_data_descriptor*
+ dvb_ancillary_data_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_ancillary_data_descriptor) - 2))
+ return NULL;
+
+ return (struct dvb_ancillary_data_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/announcement_support_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/announcement_support_descriptor.h
new file mode 100644
index 0000000..55a570b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/announcement_support_descriptor.h
@@ -0,0 +1,219 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_ANNOUNCEMENT_SUPPORT_DESCRIPTOR
+#define _UCSI_DVB_ANNOUNCEMENT_SUPPORT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Possible values for announcement_support_indicator.
+ */
+enum {
+ DVB_ANNOUNCEMENT_SUPPORT_EMERGENCY = 0x01,
+ DVB_ANNOUNCEMENT_SUPPORT_ROAD_TRAFFIC_FLASH = 0x02,
+ DVB_ANNOUNCEMENT_SUPPORT_PUBLIC_TRANSPORT_FLASH = 0x04,
+ DVB_ANNOUNCEMENT_SUPPORT_WARNING_MESSAGE = 0x08,
+ DVB_ANNOUNCEMENT_SUPPORT_NEWS_FLASH = 0x10,
+ DVB_ANNOUNCEMENT_SUPPORT_WEATHER_FLASH = 0x20,
+ DVB_ANNOUNCEMENT_SUPPORT_EVENT_ANNOUNCEMENT = 0x40,
+ DVB_ANNOUNCEMENT_SUPPORT_PERSONAL_CALL = 0x80
+};
+
+/**
+ * Possible values for announcement_type.
+ */
+enum {
+ DVB_ANNOUNCEMENT_TYPE_EMERGENCY = 0x00,
+ DVB_ANNOUNCEMENT_TYPE_ROAD_TRAFFIC_FLASH = 0x01,
+ DVB_ANNOUNCEMENT_TYPE_PUBLIC_TRANSPORT_FLASH = 0x02,
+ DVB_ANNOUNCEMENT_TYPE_WARNING_MESSAGE = 0x03,
+ DVB_ANNOUNCEMENT_TYPE_NEWS_FLASH = 0x04,
+ DVB_ANNOUNCEMENT_TYPE_WEATHER_FLASH = 0x05,
+ DVB_ANNOUNCEMENT_TYPE_EVENT_ANNOUNCEMENT = 0x06,
+ DVB_ANNOUNCEMENT_TYPE_PERSONAL_CALL = 0x07
+};
+
+/**
+ * Possible values for reference_type.
+ */
+enum {
+ DVB_REFERENCE_TYPE_AUDIO = 0x00,
+ DVB_REFERENCE_TYPE_OTHER_AUDIO = 0x01,
+ DVB_REFERENCE_TYPE_OTHER_SERVICE = 0x02,
+ DVB_REFERENCE_TYPE_OTHER_TS = 0x03
+};
+
+/**
+ * dvb_announcement_support_descriptor structure.
+ */
+struct dvb_announcement_support_descriptor {
+ struct descriptor d;
+ uint16_t announcement_support_indicator;
+ /* struct dvb_announcement_support_entry entries[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the entries field of a dvb_announcement_support_descriptor.
+ */
+struct dvb_announcement_support_entry {
+ EBIT3(uint8_t announcement_type : 4; ,
+ uint8_t reserved : 1; ,
+ uint8_t reference_type : 3; )
+ /* Only if reference_type == 1, 2 or 3:
+ * struct dvb_announcement_support_reference reference */
+} __ucsi_packed;
+
+/**
+ * The optional reference field only present in a dvb_announcement_support_descriptor if
+ * its reference_type field is 1,2 or 3.
+ */
+struct dvb_announcement_support_reference {
+ uint16_t original_network_id;
+ uint16_t transport_stream_id;
+ uint16_t service_id;
+ uint8_t component_tag;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_announcement_support_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_announcement_support_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_announcement_support_descriptor*
+ dvb_announcement_support_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t len = d->len;
+
+ if (len < (sizeof(struct dvb_announcement_support_descriptor) - 2))
+ return NULL;
+
+ bswap16(buf+pos);
+
+ pos += 2;
+
+ while(pos < len) {
+ struct dvb_announcement_support_entry *e =
+ (struct dvb_announcement_support_entry*) (buf+pos);
+
+ pos += sizeof(struct dvb_announcement_support_entry);
+
+ if (pos > len)
+ return NULL;
+
+ if ((e->reference_type == 1) ||
+ (e->reference_type == 2) ||
+ (e->reference_type == 3)) {
+ if ((pos + sizeof(struct dvb_announcement_support_reference)) > len)
+ return NULL;
+
+ bswap16(buf+pos);
+ bswap16(buf+pos+2);
+ bswap16(buf+pos+4);
+
+ pos += sizeof(struct dvb_announcement_support_reference);
+ }
+ }
+
+ return (struct dvb_announcement_support_descriptor*) d;
+}
+
+/**
+ * Iterator for the entries field of a dvb_announcement_support_descriptor.
+ *
+ * @param d dvb_announcement_support_descriptor pointer.
+ * @param pod Variable holding a pointer to the current dvb_announcement_support_entry.
+ */
+#define dvb_announcement_support_descriptor_entries_for_each(d, pos) \
+ for ((pos) = dvb_announcement_support_descriptor_entries_first(d); \
+ (pos); \
+ (pos) = dvb_announcement_support_descriptor_entries_next(d, pos))
+
+/**
+ * Accessor for the reference field of a dvb_announcement_support_entry if present.
+ *
+ * @param entry dvb_announcement_support_entry pointer.
+ * @return dvb_announcement_support_reference pointer, or NULL on error.
+ */
+static inline struct dvb_announcement_support_reference*
+ dvb_announcement_support_entry_reference(struct dvb_announcement_support_entry* entry)
+{
+ if ((entry->reference_type != 0x01) &&
+ (entry->reference_type != 0x02) &&
+ (entry->reference_type != 0x03))
+ return NULL;
+
+ return (struct dvb_announcement_support_reference*)
+ ((uint8_t*) entry + sizeof(struct dvb_announcement_support_entry));
+}
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_announcement_support_entry*
+ dvb_announcement_support_descriptor_entries_first(struct dvb_announcement_support_descriptor *d)
+{
+ if (d->d.len == 2)
+ return NULL;
+
+ return (struct dvb_announcement_support_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_announcement_support_descriptor));
+}
+
+static inline struct dvb_announcement_support_entry*
+ dvb_announcement_support_descriptor_entries_next(struct dvb_announcement_support_descriptor *d,
+ struct dvb_announcement_support_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t* next = (uint8_t*) pos + sizeof(struct dvb_announcement_support_entry);
+ struct dvb_announcement_support_reference* reference =
+ dvb_announcement_support_entry_reference(pos);
+
+ if (reference)
+ next += sizeof(struct dvb_announcement_support_reference);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_announcement_support_entry *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/application_signalling_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/application_signalling_descriptor.h
new file mode 100644
index 0000000..c1d50ff
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/application_signalling_descriptor.h
@@ -0,0 +1,124 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_APPLICATION_SIGNALLING_DESCRIPTOR
+#define _UCSI_DVB_APPLICATION_SIGNALLING_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_application_signalling_descriptor structure.
+ */
+struct dvb_application_signalling_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_application_signalling_entry entries[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the entries field of a dvb_application_signalling_descriptor.
+ */
+struct dvb_application_signalling_entry {
+ uint16_t application_type;
+ EBIT2(uint8_t reserved : 3; ,
+ uint8_t AIT_version_number : 5; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_application_signalling_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_application_signalling_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_application_signalling_descriptor*
+ dvb_application_signalling_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+ uint8_t* buf = (uint8_t*) d + 2;
+
+ pos += sizeof(struct dvb_application_signalling_descriptor) - 2;
+ if (len % sizeof(struct dvb_application_signalling_entry))
+ return NULL;
+
+ while(pos < len) {
+ bswap16(buf+pos);
+ pos+=3;
+ }
+
+ return (struct dvb_application_signalling_descriptor*) d;
+}
+
+/**
+ * Iterator for the entries field of a dvb_application_signalling_descriptor.
+ *
+ * @param d dvb_application_signalling_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_application_signalling_entry.
+ */
+#define dvb_application_signalling_descriptor_entries_for_each(d, pos) \
+ for ((pos) = dvb_application_signalling_descriptor_entries_first(d); \
+ (pos); \
+ (pos) = dvb_application_signalling_descriptor_entries_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_application_signalling_entry*
+ dvb_application_signalling_descriptor_entries_first(struct dvb_application_signalling_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_application_signalling_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_application_signalling_descriptor));
+}
+
+static inline struct dvb_application_signalling_entry*
+ dvb_application_signalling_descriptor_countries_next(struct dvb_application_signalling_descriptor *d,
+ struct dvb_application_signalling_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_application_signalling_entry);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_application_signalling_entry *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/bat_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/bat_section.c
new file mode 100644
index 0000000..afbeb0f
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/bat_section.c
@@ -0,0 +1,77 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/bat_section.h>
+
+struct dvb_bat_section * dvb_bat_section_codec(struct section_ext * ext)
+{
+ uint8_t * buf = (uint8_t *) ext;
+ unsigned int pos = sizeof(struct section_ext);
+ unsigned int len = section_ext_length(ext);
+ struct dvb_bat_section * ret = (struct dvb_bat_section *) ext;
+
+ if (len < sizeof(struct dvb_bat_section))
+ return NULL;
+
+ bswap16(buf + pos);
+ pos += 2;
+
+ if ((pos + ret->bouquet_descriptors_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, ret->bouquet_descriptors_length))
+ return NULL;
+ pos += ret->bouquet_descriptors_length;
+
+ if ((pos + sizeof(struct dvb_bat_section_part2)) > len)
+ return NULL;
+
+ bswap16(buf + pos);
+ pos += sizeof(struct dvb_bat_section_part2);
+
+ while (pos < len) {
+ struct dvb_bat_transport * transport =
+ (struct dvb_bat_transport *) (buf + pos);
+
+ if ((pos + sizeof(struct dvb_bat_transport)) > len)
+ return NULL;
+
+ bswap16(buf + pos);
+ bswap16(buf + pos + 2);
+ bswap16(buf + pos + 4);
+
+ pos += sizeof(struct dvb_bat_transport);
+
+ if ((pos + transport->transport_descriptors_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos,
+ transport->transport_descriptors_length))
+ return NULL;
+
+ pos += transport->transport_descriptors_length;
+ }
+
+ if (pos != len)
+ return NULL;
+
+ return ret;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/bat_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/bat_section.h
new file mode 100644
index 0000000..277d5ab
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/bat_section.h
@@ -0,0 +1,211 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_BAT_SECTION_H
+#define _UCSI_DVB_BAT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * dvb_bat_section structure.
+ */
+struct dvb_bat_section {
+ struct section_ext head;
+
+ EBIT2(uint16_t reserved_1 : 4; ,
+ uint16_t bouquet_descriptors_length :12; );
+ /* struct descriptor descriptors[] */
+ /* struct dvb_bat_section_part2 part2 */
+};
+
+/**
+ * Second part of a dvb_bat_section, following the variable length descriptors field.
+ */
+struct dvb_bat_section_part2 {
+ EBIT2(uint16_t reserved_2 : 4; ,
+ uint16_t transport_stream_loop_length :12; );
+ /* struct dvb_bat_transport transports[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the transports field of a dvb_bat_section_part2.
+ */
+struct dvb_bat_transport {
+ uint16_t transport_stream_id;
+ uint16_t original_network_id;
+ EBIT2(uint16_t reserved : 4; ,
+ uint16_t transport_descriptors_length :12; );
+ /* struct descriptor descriptors[] */
+};
+
+/**
+ * Process a dvb_bat_section.
+ *
+ * @param section Generic section pointer.
+ * @return dvb_bat_section pointer, or NULL on error.
+ */
+struct dvb_bat_section *dvb_bat_section_codec(struct section_ext *section);
+
+/**
+ * Accessor for the bouquet_id field of a BAT.
+ *
+ * @param bat BAT pointer.
+ * @return The bouquet_id.
+ */
+static inline uint16_t dvb_bat_section_bouquet_id(struct dvb_bat_section *bat)
+{
+ return bat->head.table_id_ext;
+}
+
+/**
+ * Iterator for the descriptors field in a dvb_bat_section.
+ *
+ * @param bat dvb_bat_section pointer.
+ * @param pos Variable containing a pointer to the current descriptor.
+ */
+#define dvb_bat_section_descriptors_for_each(bat, pos) \
+ for ((pos) = dvb_bat_section_descriptors_first(bat); \
+ (pos); \
+ (pos) = dvb_bat_section_descriptors_next(bat, pos))
+
+/**
+ * Accessor for the second part of a dvb_bat_section.
+ *
+ * @param bat dvb_bat_section pointer.
+ * @return dvb_bat_section_part2 pointer.
+ */
+static inline struct dvb_bat_section_part2 *
+ dvb_bat_section_part2(struct dvb_bat_section *bat)
+{
+ return (struct dvb_bat_section_part2 *)
+ ((uint8_t*) bat +
+ sizeof(struct dvb_bat_section) +
+ bat->bouquet_descriptors_length);
+
+}
+
+/**
+ * Iterator for the transports field of a dvb_bat_section_part2.
+ *
+ * @param part2 dvb_bat_section_part2 pointer.
+ * @param pos Variable containing a pointer to the current dvb_bat_transport.
+ */
+#define dvb_bat_section_transports_for_each(part2, pos) \
+ for ((pos) = dvb_bat_section_transports_first(part2); \
+ (pos); \
+ (pos) = dvb_bat_section_transports_next(part2, pos))
+
+/**
+ * Iterator for the descriptors field of a dvb_bat_transport.
+ *
+ * @param transport dvb_bat_transport pointer.
+ * @param pos Variable containing a pointer to the current descriptor.
+ */
+#define dvb_bat_transport_descriptors_for_each(transport, pos) \
+ for ((pos) = dvb_bat_transport_descriptors_first(transport); \
+ (pos); \
+ (pos) = dvb_bat_transport_descriptors_next(transport, pos))
+
+
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct descriptor *
+ dvb_bat_section_descriptors_first(struct dvb_bat_section *bat)
+{
+ if (bat->bouquet_descriptors_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t *) bat + sizeof(struct dvb_bat_section));
+}
+
+static inline struct descriptor *
+ dvb_bat_section_descriptors_next(struct dvb_bat_section *bat,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) bat + sizeof(struct dvb_bat_section),
+ bat->bouquet_descriptors_length,
+ pos);
+}
+
+static inline struct dvb_bat_transport *
+ dvb_bat_section_transports_first(struct dvb_bat_section_part2 *part2)
+{
+ if (part2->transport_stream_loop_length == 0)
+ return NULL;
+
+ return (struct dvb_bat_transport *)
+ ((uint8_t *) part2 + sizeof(struct dvb_bat_section_part2));
+}
+
+static inline struct dvb_bat_transport *
+ dvb_bat_section_transports_next(struct dvb_bat_section_part2 *part2,
+ struct dvb_bat_transport *pos)
+{
+ uint8_t *end = (uint8_t*) part2 + sizeof(struct dvb_bat_section_part2) +
+ part2->transport_stream_loop_length;
+ uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_bat_transport) +
+ pos->transport_descriptors_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_bat_transport *) next;
+}
+
+static inline struct descriptor *
+ dvb_bat_transport_descriptors_first(struct dvb_bat_transport *t)
+{
+ if (t->transport_descriptors_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t*)t + sizeof(struct dvb_bat_transport));
+}
+
+static inline struct descriptor *
+ dvb_bat_transport_descriptors_next(struct dvb_bat_transport *t,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) t + sizeof(struct dvb_bat_transport),
+ t->transport_descriptors_length,
+ pos);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/bouquet_name_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/bouquet_name_descriptor.h
new file mode 100644
index 0000000..a298849
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/bouquet_name_descriptor.h
@@ -0,0 +1,82 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_BOUQUET_NAME_DESCRIPTOR
+#define _UCSI_DVB_BOUQUET_NAME_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_bouquet_name_descriptor structure.
+ */
+struct dvb_bouquet_name_descriptor {
+ struct descriptor d;
+
+ /* uint8_t name[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_bouquet_name_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_bouquet_name_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_bouquet_name_descriptor*
+ dvb_bouquet_name_descriptor_codec(struct descriptor* d)
+{
+ return (struct dvb_bouquet_name_descriptor*) d;
+}
+
+/**
+ * Accessor for the name field of a dvb_bouquet_name_descriptor.
+ *
+ * @param d dvb_bouquet_name_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_bouquet_name_descriptor_name(struct dvb_bouquet_name_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_bouquet_name_descriptor);
+}
+
+/**
+ * Determine the length of the name field of a dvb_bouquet_name_descriptor in bytes.
+ *
+ * @param d dvb_bouquet_name_descriptor pointer.
+ * @return Length of the field in bytes.
+ */
+static inline int
+ dvb_bouquet_name_descriptor_name_length(struct dvb_bouquet_name_descriptor *d)
+{
+ return d->d.len;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/ca_identifier_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/ca_identifier_descriptor.h
new file mode 100644
index 0000000..ac670a9
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/ca_identifier_descriptor.h
@@ -0,0 +1,94 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_CA_IDENTIFIER_DESCRIPTOR
+#define _UCSI_DVB_CA_IDENTIFIER_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_ca_identifier_descriptor structure.
+ */
+struct dvb_ca_identifier_descriptor {
+ struct descriptor d;
+
+ /* uint16_t ca_system_ids[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_ca_identifier_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_ca_identifier_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_ca_identifier_descriptor*
+ dvb_ca_identifier_descriptor_codec(struct descriptor* d)
+{
+ uint32_t len = d->len;
+ uint8_t *buf = (uint8_t*) d + 2;
+ uint32_t pos = 0;
+
+ if (len % 2)
+ return NULL;
+
+ while(pos < len) {
+ bswap16(buf+pos);
+ pos+=2;
+ }
+
+ return (struct dvb_ca_identifier_descriptor*) d;
+}
+
+/**
+ * Accessor for the ca_system_ids field of a dvb_ca_identifier_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint16_t *
+ dvb_ca_identifier_descriptor_ca_system_ids(struct dvb_ca_identifier_descriptor *d)
+{
+ return (uint16_t *) ((uint8_t *) d + sizeof(struct dvb_ca_identifier_descriptor));
+}
+
+/**
+ * Calculate the number of entries in the ca_system_ids field of a dvb_ca_identifier_descriptor.
+ *
+ * @param d dvb_ca_identifier_descriptor pointer.
+ * @return Number of entries.
+ */
+static inline int
+ dvb_ca_identifier_descriptor_ca_system_ids_count(struct dvb_ca_identifier_descriptor *d)
+{
+ return d->d.len >> 1;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/cable_delivery_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/cable_delivery_descriptor.h
new file mode 100644
index 0000000..70b0c98
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/cable_delivery_descriptor.h
@@ -0,0 +1,70 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_CABLE_DELIVERY_DESCRIPTOR
+#define _UCSI_DVB_CABLE_DELIVERY_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_cable_delivery_descriptor structure.
+ */
+struct dvb_cable_delivery_descriptor {
+ struct descriptor d;
+
+ uint32_t frequency; // BCD, units 100Hz
+ EBIT2(uint16_t reserved : 12; ,
+ uint16_t fec_outer : 4; )
+ uint8_t modulation;
+ EBIT2(uint32_t symbol_rate : 28; , // BCD, units 100Hz
+ uint32_t fec_inner : 4; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_cable_delivery_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_cable_delivery_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_cable_delivery_descriptor*
+ dvb_cable_delivery_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_cable_delivery_descriptor) - 2))
+ return NULL;
+
+ bswap32((uint8_t*) d + 2);
+ bswap16((uint8_t*) d + 6);
+ bswap32((uint8_t*) d + 9);
+
+ return (struct dvb_cable_delivery_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/cell_frequency_link_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/cell_frequency_link_descriptor.h
new file mode 100644
index 0000000..b6285bd
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/cell_frequency_link_descriptor.h
@@ -0,0 +1,190 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_CELL_FREQUENCY_LINK_DESCRIPTOR
+#define _UCSI_DVB_CELL_FREQUENCY_LINK_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_cell_frequency_link_descriptor structure.
+ */
+struct dvb_cell_frequency_link_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_cell_frequency_link_cell cells[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the cells field of a dvb_cell_frequency_link_descriptor.
+ */
+struct dvb_cell_frequency_link_cell {
+ uint16_t cell_id;
+ uint32_t frequency;
+ uint8_t subcell_loop_info_length;
+ /* struct dvb_cell_frequency_link_subcell subcells[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the subcells field of a dvb_cell_frequency_link_cell.
+ */
+struct dvb_cell_frequency_link_cell_subcell {
+ uint8_t cell_id_extension;
+ uint32_t transposer_frequency;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_cell_frequency_link_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_cell_frequency_link_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_cell_frequency_link_descriptor*
+ dvb_cell_frequency_link_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint32_t pos2 = 0;
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t len = d->len;
+
+ while(pos < len) {
+ struct dvb_cell_frequency_link_cell *e =
+ (struct dvb_cell_frequency_link_cell*) (buf+pos);
+
+ if ((pos + sizeof(struct dvb_cell_frequency_link_cell)) > len)
+ return NULL;
+
+ bswap16(buf+pos);
+ bswap32(buf+pos+2);
+
+ pos += sizeof(struct dvb_cell_frequency_link_cell);
+
+ if ((pos + e->subcell_loop_info_length) > len)
+ return NULL;
+
+ if (e->subcell_loop_info_length % sizeof(struct dvb_cell_frequency_link_cell_subcell))
+ return NULL;
+
+ pos2 = 0;
+ while(pos2 < e->subcell_loop_info_length) {
+ bswap32(buf+pos+pos2+1);
+
+ pos2 += sizeof(struct dvb_cell_frequency_link_cell_subcell);
+ }
+
+ pos += e->subcell_loop_info_length;
+ }
+
+ return (struct dvb_cell_frequency_link_descriptor*) d;
+}
+
+/**
+ * Iterator for the cells field of a dvb_cell_frequency_link_descriptor.
+ *
+ * @param d dvb_cell_frequency_link_descriptor pointer.
+ * @param pos Variable holding a pointer to the current dvb_cell_frequency_link_cell.
+ */
+#define dvb_cell_frequency_link_descriptor_cells_for_each(d, pos) \
+ for ((pos) = dvb_cell_frequency_link_descriptor_cells_first(d); \
+ (pos); \
+ (pos) = dvb_cell_frequency_link_descriptor_cells_next(d, pos))
+
+/**
+ * Iterator for the subcells field of a dvb_cell_frequency_link_cell.
+ *
+ * @param cell dvb_cell_frequency_link_cell pointer.
+ * @param pos Variable holding a pointer to the current dvb_cell_frequency_link_cell_subcell.
+ */
+#define dvb_cell_frequency_link_cell_subcells_for_each(cell, pos) \
+ for ((pos) = dvb_cell_frequency_link_cell_subcells_first(cell); \
+ (pos); \
+ (pos) = dvb_cell_frequency_link_cell_subcells_next(cell, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_cell_frequency_link_cell*
+ dvb_cell_frequency_link_descriptor_cells_first(struct dvb_cell_frequency_link_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_cell_frequency_link_cell *)
+ ((uint8_t*) d + sizeof(struct dvb_cell_frequency_link_descriptor));
+}
+
+static inline struct dvb_cell_frequency_link_cell*
+ dvb_cell_frequency_link_descriptor_cells_next(struct dvb_cell_frequency_link_descriptor *d,
+ struct dvb_cell_frequency_link_cell *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_cell_frequency_link_cell) +
+ pos->subcell_loop_info_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_cell_frequency_link_cell *) next;
+}
+
+static inline struct dvb_cell_frequency_link_cell_subcell*
+ dvb_cell_frequency_cell_subcells_first(struct dvb_cell_frequency_link_cell *d)
+{
+ if (d->subcell_loop_info_length == 0)
+ return NULL;
+
+ return (struct dvb_cell_frequency_link_cell_subcell*)
+ ((uint8_t*) d + sizeof(struct dvb_cell_frequency_link_cell));
+}
+
+static inline struct dvb_cell_frequency_link_cell_subcell*
+ dvb_cell_frequency_cell_subcells_next(struct dvb_cell_frequency_link_cell *cell,
+ struct dvb_cell_frequency_link_cell_subcell *pos)
+{
+ uint8_t *end = (uint8_t*) cell + cell->subcell_loop_info_length;
+ uint8_t *next = (uint8_t*) pos +
+ sizeof(struct dvb_cell_frequency_link_cell_subcell);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_cell_frequency_link_cell_subcell *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/cell_list_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/cell_list_descriptor.h
new file mode 100644
index 0000000..6a42ce4
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/cell_list_descriptor.h
@@ -0,0 +1,201 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_CELL_LIST_DESCRIPTOR
+#define _UCSI_DVB_CELL_LIST_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_cell_list_descriptor structure.
+ */
+struct dvb_cell_list_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_cell_list_entry cells[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the cells field of a dvb_cell_list_descriptor.
+ */
+struct dvb_cell_list_entry {
+ uint16_t cell_id;
+ uint16_t cell_latitude;
+ uint16_t cell_longitude;
+ EBIT3(uint32_t cell_extend_of_latitude :12; ,
+ uint32_t cell_extend_of_longitude :12; ,
+ uint32_t subcell_info_loop_length : 8; )
+ /* struct dvb_subcell_list_entry subcells[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the subcells field of a dvb_cell_list_entry.
+ */
+struct dvb_subcell_list_entry {
+ uint8_t cell_id_extension;
+ uint16_t subcell_latitude;
+ uint16_t subcell_longitude;
+ EBIT2(uint32_t subcell_extend_of_latitude :12; ,
+ uint32_t subcell_extend_of_longitude :12; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_cell_list_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_cell_list_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_cell_list_descriptor*
+ dvb_cell_list_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint32_t pos2 = 0;
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t len = d->len;
+
+ while(pos < len) {
+ struct dvb_cell_list_entry *e =
+ (struct dvb_cell_list_entry*) (buf+pos);
+
+ if ((pos + sizeof(struct dvb_cell_list_entry)) > len)
+ return NULL;
+
+ bswap16(buf+pos);
+ bswap16(buf+pos+2);
+ bswap16(buf+pos+4);
+ bswap32(buf+pos+6);
+
+ pos += sizeof(struct dvb_cell_list_entry);
+
+ if ((pos + e->subcell_info_loop_length) > len)
+ return NULL;
+
+ if (e->subcell_info_loop_length % sizeof(struct dvb_subcell_list_entry))
+ return NULL;
+
+ pos2 = 0;
+ while(pos2 < e->subcell_info_loop_length) {
+ bswap16(buf+pos+pos2+1);
+ bswap16(buf+pos+pos2+3);
+ bswap24(buf+pos+pos2+5);
+
+ pos2 += sizeof(struct dvb_subcell_list_entry);
+ }
+
+ pos += e->subcell_info_loop_length;
+ }
+
+ return (struct dvb_cell_list_descriptor*) d;
+}
+
+/**
+ * Iterator for the cells field of a dvb_cell_list_descriptor.
+ *
+ * @param d dvb_cell_list_descriptor pointer.
+ * @param pos Variable holding a pointer to the current dvb_cell_list_entry.
+ */
+#define dvb_cell_list_descriptor_cells_for_each(d, pos) \
+ for ((pos) = dvb_cell_list_descriptor_cells_first(d); \
+ (pos); \
+ (pos) = dvb_cell_list_descriptor_cells_next(d, pos))
+
+/**
+ * Iterator for the subcells field of a dvb_cell_list_entry.
+ *
+ * @param cell dvb_cell_list_entry pointer.
+ * @param pos Variable holding a pointer to the current dvb_subcell_list_entry.
+ */
+#define dvb_cell_list_entry_subcells_for_each(cell, pos) \
+ for ((pos) = dvb_cell_list_entry_subcells_first(cell); \
+ (pos); \
+ (pos) = dvb_cell_list_entry_subcells_next(cell, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_cell_list_entry*
+ dvb_cell_list_descriptor_cells_first(struct dvb_cell_list_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_cell_list_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_cell_list_descriptor));
+}
+
+static inline struct dvb_cell_list_entry*
+ dvb_cell_list_descriptor_cells_next(struct dvb_cell_list_descriptor *d,
+ struct dvb_cell_list_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_cell_list_entry) +
+ pos->subcell_info_loop_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_cell_list_entry *) next;
+}
+
+static inline struct dvb_subcell_list_entry*
+ dvb_cell_list_entry_subcells_first(struct dvb_cell_list_entry *d)
+{
+ if (d->subcell_info_loop_length == 0)
+ return NULL;
+
+ return (struct dvb_subcell_list_entry*)
+ ((uint8_t*) d + sizeof(struct dvb_cell_list_entry));
+}
+
+static inline struct dvb_subcell_list_entry*
+ dvb_cell_list_entry_subcells_next(struct dvb_cell_list_entry *d,
+ struct dvb_subcell_list_entry *pos)
+{
+ uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_subcell_list_entry);
+ uint8_t *end = (uint8_t*) d +
+ sizeof(struct dvb_cell_list_entry) +
+ d->subcell_info_loop_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_subcell_list_entry *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/component_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/component_descriptor.h
new file mode 100644
index 0000000..154e235
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/component_descriptor.h
@@ -0,0 +1,147 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_COMPONENT_DESCRIPTOR
+#define _UCSI_DVB_COMPONENT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * Possible values for stream_content.
+ */
+enum {
+ DVB_STREAM_CONTENT_VIDEO = 0x01,
+ DVB_STREAM_CONTENT_AUDIO = 0x02,
+ DVB_STREAM_CONTENT_SUBTITLE = 0x03,
+ DVB_STREAM_CONTENT_AC3 = 0x04
+};
+
+/**
+ * Possible values for component_type.
+ */
+enum {
+ DVB_COMPONENT_TYPE_VIDEO_43_25Hz = 0x01,
+ DVB_COMPONENT_TYPE_VIDEO_169_PAN_25Hz = 0x02,
+ DVB_COMPONENT_TYPE_VIDEO_169_NOPAN_25Hz = 0x03,
+ DVB_COMPONENT_TYPE_VIDEO_GT169_25Hz = 0x04,
+
+ DVB_COMPONENT_TYPE_VIDEO_43_30Hz = 0x05,
+ DVB_COMPONENT_TYPE_VIDEO_169_PAN_30Hz = 0x06,
+ DVB_COMPONENT_TYPE_VIDEO_169_NOPAN_30Hz = 0x07,
+ DVB_COMPONENT_TYPE_VIDEO_GT169_30Hz = 0x08,
+
+ DVB_COMPONENT_TYPE_HDVIDEO_43_25Hz = 0x09,
+ DVB_COMPONENT_TYPE_HDVIDEO_169_PAN_25Hz = 0x0a,
+ DVB_COMPONENT_TYPE_HDVIDEO_169_NOPAN_25Hz = 0x0b,
+ DVB_COMPONENT_TYPE_HDVIDEO_GT169_25Hz = 0x0c,
+
+ DVB_COMPONENT_TYPE_HDVIDEO_43_30Hz = 0x0d,
+ DVB_COMPONENT_TYPE_HDVIDEO_169_PAN_30Hz = 0x0e,
+ DVB_COMPONENT_TYPE_HDVIDEO_169_NOPAN_30Hz = 0x0f,
+ DVB_COMPONENT_TYPE_HDVIDEO_GT169_30Hz = 0x10,
+
+ DVB_COMPONENT_TYPE_AUDIO_SINGLE_MONO = 0x01,
+ DVB_COMPONENT_TYPE_AUDIO_DUAL_MONO = 0x02,
+ DVB_COMPONENT_TYPE_AUDIO_STEREO = 0x03,
+ DVB_COMPONENT_TYPE_AUDIO_MULTI_LINGUAL_MULTI_CHAN= 0x04,
+ DVB_COMPONENT_TYPE_AUDIO_SURROUND = 0x05,
+ DVB_COMPONENT_TYPE_AUDIO_VISUAL_IMPAIRED = 0x40,
+ DVB_COMPONENT_TYPE_AUDIO_HARDHEAR = 0x41,
+ DVB_COMPONENT_TYPE_AUDIO_SUPPLEMENTARY = 0x42,
+
+ DVB_COMPONENT_TYPE_SUBTITLE_TELETEXT = 0x01,
+ DVB_COMPONENT_TYPE_SUBTITLE_ASSOC_TELETEXT = 0x02,
+ DVB_COMPONENT_TYPE_SUBTITLE_VBI = 0x03,
+ DVB_COMPONENT_TYPE_SUBTITLE_DVB = 0x10,
+ DVB_COMPONENT_TYPE_SUBTITLE_DVB_43 = 0x11,
+ DVB_COMPONENT_TYPE_SUBTITLE_DVB_169 = 0x12,
+ DVB_COMPONENT_TYPE_SUBTITLE_DVB_2211 = 0x13,
+ DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR = 0x20,
+ DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR_43 = 0x21,
+ DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR_169 = 0x22,
+ DVB_COMPONENT_TYPE_SUBTITLE_DVB_HARDHEAR_2211 = 0x23
+};
+
+/**
+ * dvb_component_descriptor structure.
+ */
+struct dvb_component_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint8_t reserved : 4; ,
+ uint8_t stream_content : 4; )
+ uint8_t component_type;
+ uint8_t component_tag;
+ iso639lang_t language_code;
+ /* uint8_t text[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_component_descriptor.
+ *
+ * @param d Pointer to a generic descriptor.
+ * @return dvb_component_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_component_descriptor*
+ dvb_component_descriptor_codec(struct descriptor* d)
+{
+ if (d->len < (sizeof(struct dvb_component_descriptor) - 2))
+ return NULL;
+
+ return (struct dvb_component_descriptor*) d;
+}
+
+/**
+ * Accessor for the text field of a dvb_component_descriptor.
+ *
+ * @param d dvb_component_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_component_descriptor_text(struct dvb_component_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_component_descriptor);
+}
+
+/**
+ * Determine the length of the text field of a dvb_component_descriptor.
+ *
+ * @param d dvb_component_descriptor pointer.
+ * @return Length of the field in bytes.
+ */
+static inline int
+ dvb_component_descriptor_text_length(struct dvb_component_descriptor *d)
+{
+ return d->d.len - 6;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/content_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/content_descriptor.h
new file mode 100644
index 0000000..5cc16dc
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/content_descriptor.h
@@ -0,0 +1,116 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_CONTENT_DESCRIPTOR
+#define _UCSI_DVB_CONTENT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+// FIXME: the nibbles
+
+/**
+ * dvb_content_descriptor structure.
+ */
+struct dvb_content_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_content_nibble nibbles[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the nibbles field of a dvb_content_descriptor.
+ */
+struct dvb_content_nibble {
+ EBIT2(uint8_t content_nibble_level_1 : 4; ,
+ uint8_t content_nibble_level_2 : 4; )
+ EBIT2(uint8_t user_nibble_1 : 4; ,
+ uint8_t user_nibble_2 : 4; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_content_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_content_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_content_descriptor*
+ dvb_content_descriptor_codec(struct descriptor* d)
+{
+ if (d->len % sizeof(struct dvb_content_nibble))
+ return NULL;
+
+ return (struct dvb_content_descriptor*) d;
+}
+
+/**
+ * Iterator for the nibbles field of a dvb_content_descriptor.
+ *
+ * @param d dvb_content_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_content_nibble.
+ */
+#define dvb_content_descriptor_nibbles_for_each(d, pos) \
+ for ((pos) = dvb_content_descriptor_nibbles_first(d); \
+ (pos); \
+ (pos) = dvb_content_descriptor_nibbles_next(d, pos))
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_content_nibble*
+ dvb_content_descriptor_nibbles_first(struct dvb_content_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_content_nibble *)
+ ((uint8_t*) d + sizeof(struct dvb_content_descriptor));
+}
+
+static inline struct dvb_content_nibble*
+ dvb_content_descriptor_nibbles_next(struct dvb_content_descriptor *d,
+ struct dvb_content_nibble *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_content_nibble);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_content_nibble *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/content_identifier_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/content_identifier_descriptor.h
new file mode 100644
index 0000000..63d24a1
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/content_identifier_descriptor.h
@@ -0,0 +1,222 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_CONTENT_IDENTIFIER_DESCRIPTOR
+#define _UCSI_DVB_CONTENT_IDENTIFIER_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+
+/**
+ * Possible values for the crid_type.
+ */
+enum {
+ DVB_CRID_TYPE_NONE = 0x00,
+ DVB_CRID_TYPE_ITEM = 0x01,
+ DVB_CRID_TYPE_SERIES = 0x02,
+ DVB_CRID_TYPE_RECOMMENDATION = 0x03
+};
+
+/**
+ * Possible values for the crid_location.
+ */
+enum {
+ DVB_CRID_LOCATION_THIS_DESCRIPTOR = 0x00,
+ DVB_CRID_LOCATION_CIT = 0x01
+};
+
+/**
+ * dvb_content_identifier_descriptor structure.
+ */
+struct dvb_content_identifier_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_content_identifier_entry entries[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the entries field of a dvb_content_identifier_descriptor.
+ */
+struct dvb_content_identifier_entry {
+ EBIT2(uint8_t crid_type : 6; ,
+ uint8_t crid_location : 2; )
+ /* struct dvb_content_identifier_data_00 data0 */
+ /* struct dvb_content_identifier_data_01 data1 */
+} __ucsi_packed;
+
+/**
+ * The data if crid_location == 0
+ */
+struct dvb_content_identifier_entry_data_0 {
+ uint8_t crid_length;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * The data if crid_location == 1
+ */
+struct dvb_content_identifier_entry_data_1 {
+ uint16_t crid_ref;
+} __ucsi_packed;
+
+
+/**
+ * Process a dvb_content_identifier_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return dvb_content_identifier_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_content_identifier_descriptor*
+ dvb_content_identifier_descriptor_codec(struct descriptor* d)
+{
+ uint32_t len = d->len + 2;
+ uint32_t pos = 2;
+ uint8_t *buf = (uint8_t*) d;
+
+ while(pos < len) {
+ struct dvb_content_identifier_entry *e =
+ (struct dvb_content_identifier_entry*) (buf + pos);
+
+ if (len < (pos+1))
+ return NULL;
+ pos++;
+
+ switch(e->crid_location) {
+ case 0:
+ if (len < (pos + 1))
+ return NULL;
+ if (len < (pos + 1 + buf[pos]))
+ return NULL;
+ pos += 1 + buf[pos];
+ break;
+
+ case 1:
+ if (len < (pos+2))
+ return NULL;
+ bswap16(buf+pos);
+ break;
+ }
+ }
+
+ if (pos != len)
+ return NULL;
+
+ return (struct dvb_content_identifier_descriptor*) d;
+}
+
+/**
+ * Iterator for entries field of a dvb_content_identifier_descriptor.
+ *
+ * @param d dvb_content_identifier_descriptor pointer.
+ * @param pos Variable holding a pointer to the current dvb_content_identifier_entry.
+ */
+#define dvb_content_identifier_descriptor_entries_for_each(d, pos) \
+ for ((pos) = dvb_content_identifier_descriptor_entries_first(d); \
+ (pos); \
+ (pos) = dvb_content_identifier_descriptor_entries_next(d, pos))
+
+/**
+ * Accessor for the data0 field of a dvb_content_identifier_entry.
+ *
+ * @param d dvb_content_identifier_entry pointer.
+ * @return Pointer, or NULL on error.
+ */
+static inline struct dvb_content_identifier_entry_data_0*
+ dvb_content_identifier_entry_data_0(struct dvb_content_identifier_entry *d)
+{
+ if (d->crid_location != 0)
+ return NULL;
+ return (struct dvb_content_identifier_entry_data_0*)
+ ((uint8_t*) d + sizeof(struct dvb_content_identifier_entry));
+}
+
+/**
+ * Accessor for the data1 field of a dvb_content_identifier_entry.
+ *
+ * @param d dvb_content_identifier_entry pointer.
+ * @return Pointer, or NULL on error.
+ */
+static inline struct dvb_content_identifier_entry_data_1*
+ dvb_content_identifier_entry_data_1(struct dvb_content_identifier_entry *d)
+{
+ if (d->crid_location != 1)
+ return NULL;
+ return (struct dvb_content_identifier_entry_data_1*)
+ ((uint8_t*) d + sizeof(struct dvb_content_identifier_entry));
+}
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_content_identifier_entry*
+ dvb_content_identifier_descriptor_entries_first(struct dvb_content_identifier_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_content_identifier_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_content_identifier_descriptor));
+}
+
+static inline struct dvb_content_identifier_entry*
+ dvb_content_identifier_descriptor_entries_next(struct dvb_content_identifier_descriptor *d,
+ struct dvb_content_identifier_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_content_identifier_entry);
+
+ if (next >= end)
+ return NULL;
+
+ switch(pos->crid_location) {
+ case 0:
+ if ((next+2) >= end)
+ return NULL;
+ if ((next+2+next[1]) >= end)
+ return NULL;
+ break;
+
+ case 1:
+ if ((next+3) >= end)
+ return NULL;
+ break;
+ }
+
+ return (struct dvb_content_identifier_entry*) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/country_availability_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/country_availability_descriptor.h
new file mode 100644
index 0000000..29a6b9a
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/country_availability_descriptor.h
@@ -0,0 +1,120 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_COUNTRY_AVAILABILITY_DESCRIPTOR
+#define _UCSI_DVB_COUNTRY_AVAILABILITY_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_country_availability_descriptor structure.
+ */
+struct dvb_country_availability_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint8_t country_availability_flag : 1; ,
+ uint8_t reserved : 7; )
+ /* struct dvb_country_availability_entry countries[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the countries field of a dvb_country_availability_descriptor.
+ */
+struct dvb_country_availability_entry {
+ iso639country_t country_code;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_country_availability_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_country_availability_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_country_availability_descriptor*
+ dvb_country_availability_descriptor_codec(struct descriptor* d)
+{
+ uint32_t len = d->len;
+
+ if (len < (sizeof(struct dvb_country_availability_descriptor) - 2))
+ return NULL;
+
+ if ((len - 1) % sizeof(struct dvb_country_availability_entry))
+ return NULL;
+
+ return (struct dvb_country_availability_descriptor*) d;
+}
+
+/**
+ * Iterator for the countries field of a dvb_country_availability_descriptor.
+ *
+ * @param d dvb_country_availability_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_country_availability_entry.
+ */
+#define dvb_country_availability_descriptor_countries_for_each(d, pos) \
+ for ((pos) = dvb_country_availability_descriptor_countries_first(d); \
+ (pos); \
+ (pos) = dvb_country_availability_descriptor_countries_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_country_availability_entry*
+ dvb_country_availability_descriptor_countries_first(struct dvb_country_availability_descriptor *d)
+{
+ if (d->d.len == 1)
+ return NULL;
+
+ return (struct dvb_country_availability_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_country_availability_descriptor));
+}
+
+static inline struct dvb_country_availability_entry*
+ dvb_country_availability_descriptor_countries_next(struct dvb_country_availability_descriptor *d,
+ struct dvb_country_availability_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_country_availability_entry);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_country_availability_entry *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/data_broadcast_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/data_broadcast_descriptor.h
new file mode 100644
index 0000000..069e1db
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/data_broadcast_descriptor.h
@@ -0,0 +1,139 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_DATA_BROADCAST_DESCRIPTOR
+#define _UCSI_DVB_DATA_BROADCAST_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_data_broadcast_descriptor structure.
+ */
+struct dvb_data_broadcast_descriptor {
+ struct descriptor d;
+
+ uint16_t data_broadcast_id;
+ uint8_t component_tag;
+ uint8_t selector_length;
+ /* uint8_t selector[] */
+ /* struct dvb_data_broadcast_descriptor_part2 part2 */
+} __ucsi_packed;
+
+/**
+ * Second part of a dvb_data_broadcast_descriptor following the variable length selector field.
+ */
+struct dvb_data_broadcast_descriptor_part2 {
+ iso639lang_t language_code;
+ uint8_t text_length;
+ /* uint8_t text[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_data_broadcast_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_data_broadcast_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_data_broadcast_descriptor*
+ dvb_data_broadcast_descriptor_codec(struct descriptor* d)
+{
+ struct dvb_data_broadcast_descriptor *p =
+ (struct dvb_data_broadcast_descriptor *) d;
+ struct dvb_data_broadcast_descriptor_part2 *p2;
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t pos = sizeof(struct dvb_data_broadcast_descriptor) - 2;
+ uint32_t len = d->len;
+
+ if (pos > len)
+ return NULL;
+
+ bswap16(buf + 2);
+
+ pos += p->selector_length;
+
+ if (pos > len)
+ return NULL;
+
+ p2 = (struct dvb_data_broadcast_descriptor_part2*) (buf + 2 + pos);
+
+ pos += sizeof(struct dvb_data_broadcast_descriptor_part2);
+
+ if (pos > len)
+ return NULL;
+
+ pos += p2->text_length;
+
+ if (pos != len)
+ return NULL;
+
+ return p;
+}
+
+/**
+ * Accessor for the selector field of a dvb_data_broadcast_descriptor.
+ *
+ * @param d dvb_data_broadcast_descriptor pointer.
+ * @return pointer to the field.
+ */
+static inline uint8_t *
+ dvb_data_broadcast_descriptor_selector(struct dvb_data_broadcast_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_data_broadcast_descriptor);
+}
+
+/**
+ * Accessor for the second part of a dvb_data_broadcast_descriptor.
+ *
+ * @param d dvb_data_broadcast_descriptor pointer.
+ * @return dvb_data_broadcast_descriptor_part2 pointer.
+ */
+static inline struct dvb_data_broadcast_descriptor_part2 *
+ dvb_data_broadcast_descriptor_part2(struct dvb_data_broadcast_descriptor *d)
+{
+ return (struct dvb_data_broadcast_descriptor_part2*)
+ ((uint8_t*) d + sizeof(struct dvb_data_broadcast_descriptor) +
+ d->selector_length);
+}
+
+/**
+ * Accessor for the text field in a dvb_data_broadcast_descriptor_part2.
+ *
+ * @param d dvb_data_broadcast_descriptor_part2 pointer.
+ * @return pointer to the field.
+ */
+static inline uint8_t *
+ dvb_data_broadcast_descriptor_part2_text(struct dvb_data_broadcast_descriptor_part2 *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_data_broadcast_descriptor_part2);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/data_broadcast_id_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/data_broadcast_id_descriptor.h
new file mode 100644
index 0000000..8547d8f
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/data_broadcast_id_descriptor.h
@@ -0,0 +1,90 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_DATA_BROADCAST_ID_DESCRIPTOR
+#define _UCSI_DVB_DATA_BROADCAST_ID_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_data_broadcast_id_descriptor structure.
+ */
+struct dvb_data_broadcast_id_descriptor {
+ struct descriptor d;
+
+ uint16_t data_broadcast_id;
+ /* uint8_t id_selector_byte[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_data_broadcast_id_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_data_broadcast_id_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_data_broadcast_id_descriptor*
+ dvb_data_broadcast_id_descriptor_codec(struct descriptor* d)
+{
+ if (d->len < (sizeof(struct dvb_data_broadcast_id_descriptor) - 2))
+ return NULL;
+
+ bswap16((uint8_t*) d + 2);
+
+ return (struct dvb_data_broadcast_id_descriptor*) d;
+}
+
+/**
+ * Accessor for the selector_byte field of a dvb_data_broadcast_id_descriptor.
+ *
+ * @param d dvb_data_broadcast_id_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_data_broadcast_id_descriptor_id_selector_byte(struct dvb_data_broadcast_id_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_data_broadcast_id_descriptor);
+}
+
+/**
+ * Determine the length of the selector_byte field of a dvb_data_broadcast_id_descriptor.
+ *
+ * @param d dvb_data_broadcast_id_descriptor pointer.
+ * @return Length of the field in bytes.
+ */
+static inline int
+ dvb_data_broadcast_id_descriptor_id_selector_byte_length(struct dvb_data_broadcast_id_descriptor *d)
+{
+ return d->d.len - 2;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+#include <libucsi/dvb/mhp_data_broadcast_id_descriptor.h>
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/default_authority_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/default_authority_descriptor.h
new file mode 100644
index 0000000..0b0ba73
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/default_authority_descriptor.h
@@ -0,0 +1,82 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_DEFAULT_AUTHORITY_DESCRIPTOR
+#define _UCSI_DVB_DEFAULT_AUTHORITY_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_default_authority_descriptor structure.
+ */
+struct dvb_default_authority_descriptor {
+ struct descriptor d;
+
+ /* char name[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_default_authority_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_default_authority_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_default_authority_descriptor*
+ dvb_default_authority_descriptor_codec(struct descriptor* d)
+{
+ return (struct dvb_default_authority_descriptor*) d;
+}
+
+/**
+ * Accessor for the name field in a dvb_default_authority_descriptor.
+ *
+ * @param d dvb_default_authority_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_default_authority_descriptor_name(struct dvb_default_authority_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_default_authority_descriptor);
+}
+
+/**
+ * Calculate the length of the name field in a dvb_default_authority_descriptor.
+ *
+ * @param d dvb_default_authority_descriptor pointer.
+ * @return Length of the field in bytes.
+ */
+static inline int
+ dvb_default_authority_descriptor_name_length(struct dvb_default_authority_descriptor *d)
+{
+ return d->d.len;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/descriptor.h
new file mode 100644
index 0000000..0772601
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/descriptor.h
@@ -0,0 +1,198 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_DESCRIPTOR_H
+#define _UCSI_DVB_DESCRIPTOR_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/dvb/ac3_descriptor.h>
+#include <libucsi/dvb/adaptation_field_data_descriptor.h>
+#include <libucsi/dvb/ancillary_data_descriptor.h>
+#include <libucsi/dvb/announcement_support_descriptor.h>
+#include <libucsi/dvb/application_signalling_descriptor.h>
+#include <libucsi/dvb/bouquet_name_descriptor.h>
+#include <libucsi/dvb/ca_identifier_descriptor.h>
+#include <libucsi/dvb/cable_delivery_descriptor.h>
+#include <libucsi/dvb/cell_frequency_link_descriptor.h>
+#include <libucsi/dvb/cell_list_descriptor.h>
+#include <libucsi/dvb/component_descriptor.h>
+#include <libucsi/dvb/content_descriptor.h>
+#include <libucsi/dvb/content_identifier_descriptor.h>
+#include <libucsi/dvb/country_availability_descriptor.h>
+#include <libucsi/dvb/data_broadcast_descriptor.h>
+#include <libucsi/dvb/data_broadcast_id_descriptor.h>
+#include <libucsi/dvb/default_authority_descriptor.h>
+#include <libucsi/dvb/dsng_descriptor.h>
+#include <libucsi/dvb/extended_event_descriptor.h>
+#include <libucsi/dvb/frequency_list_descriptor.h>
+#include <libucsi/dvb/linkage_descriptor.h>
+#include <libucsi/dvb/local_time_offset_descriptor.h>
+#include <libucsi/dvb/mosaic_descriptor.h>
+#include <libucsi/dvb/multilingual_bouquet_name_descriptor.h>
+#include <libucsi/dvb/multilingual_component_descriptor.h>
+#include <libucsi/dvb/multilingual_network_name_descriptor.h>
+#include <libucsi/dvb/multilingual_service_name_descriptor.h>
+#include <libucsi/dvb/network_name_descriptor.h>
+#include <libucsi/dvb/nvod_reference_descriptor.h>
+#include <libucsi/dvb/parental_rating_descriptor.h>
+#include <libucsi/dvb/partial_transport_stream_descriptor.h>
+#include <libucsi/dvb/pdc_descriptor.h>
+#include <libucsi/dvb/private_data_specifier_descriptor.h>
+#include <libucsi/dvb/related_content_descriptor.h>
+#include <libucsi/dvb/satellite_delivery_descriptor.h>
+#include <libucsi/dvb/s2_satellite_delivery_descriptor.h>
+#include <libucsi/dvb/scrambling_descriptor.h>
+#include <libucsi/dvb/service_availability_descriptor.h>
+#include <libucsi/dvb/service_descriptor.h>
+#include <libucsi/dvb/service_identifier_descriptor.h>
+#include <libucsi/dvb/service_list_descriptor.h>
+#include <libucsi/dvb/service_move_descriptor.h>
+#include <libucsi/dvb/short_event_descriptor.h>
+#include <libucsi/dvb/short_smoothing_buffer_descriptor.h>
+#include <libucsi/dvb/stream_identifier_descriptor.h>
+#include <libucsi/dvb/stuffing_descriptor.h>
+#include <libucsi/dvb/subtitling_descriptor.h>
+#include <libucsi/dvb/telephone_descriptor.h>
+#include <libucsi/dvb/teletext_descriptor.h>
+#include <libucsi/dvb/terrestrial_delivery_descriptor.h>
+#include <libucsi/dvb/time_shifted_event_descriptor.h>
+#include <libucsi/dvb/time_shifted_service_descriptor.h>
+#include <libucsi/dvb/transport_stream_descriptor.h>
+#include <libucsi/dvb/tva_id_descriptor.h>
+#include <libucsi/dvb/vbi_data_descriptor.h>
+#include <libucsi/dvb/vbi_teletext_descriptor.h>
+#include <libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h>
+#include <libucsi/dvb/rnt_rar_over_ip_descriptor.h>
+#include <libucsi/dvb/rnt_rnt_scan_descriptor.h>
+#include <libucsi/dvb/ait_application_descriptor.h>
+#include <libucsi/dvb/ait_application_name_descriptor.h>
+#include <libucsi/dvb/ait_external_application_authorisation_descriptor.h>
+#include <libucsi/dvb/ait_application_icons_descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * The following are not implemented just now
+ */
+/*
+#include <libucsi/dvb/ait_transport_protocol_descriptor.h>
+#include <libucsi/dvb/ait_dvb_j_application_descriptor.h>
+#include <libucsi/dvb/ait_dvb_j_application_location_descriptor.h>
+#include <libucsi/dvb/ait_dvb_html_application_descriptor.h>
+#include <libucsi/dvb/ait_dvb_html_application_location_descriptor.h>
+#include <libucsi/dvb/ait_dvb_html_application_boundary_descriptor.h>
+#include <libucsi/dvb/ait_prefetch_descriptor.h>
+#include <libucsi/dvb/ait_dii_location_descriptor.h>
+#include <libucsi/dvb/ait_ip_signalling_descriptor.h>
+*/
+
+/**
+ * Enumeration of DVB descriptor tags.
+ */
+enum dvb_descriptor_tag {
+ dtag_dvb_network_name = 0x40,
+ dtag_dvb_service_list = 0x41,
+ dtag_dvb_stuffing = 0x42,
+ dtag_dvb_satellite_delivery_system = 0x43,
+ dtag_dvb_cable_delivery_system = 0x44,
+ dtag_dvb_vbi_data = 0x45,
+ dtag_dvb_vbi_teletext = 0x46,
+ dtag_dvb_bouquet_name = 0x47,
+ dtag_dvb_service = 0x48,
+ dtag_dvb_country_availability = 0x49,
+ dtag_dvb_linkage = 0x4a,
+ dtag_dvb_nvod_reference = 0x4b,
+ dtag_dvb_time_shifted_service = 0x4c,
+ dtag_dvb_short_event = 0x4d,
+ dtag_dvb_extended_event = 0x4e,
+ dtag_dvb_time_shifted_event = 0x4f,
+ dtag_dvb_component = 0x50,
+ dtag_dvb_mosaic = 0x51,
+ dtag_dvb_stream_identifier = 0x52,
+ dtag_dvb_ca_identifier = 0x53,
+ dtag_dvb_content = 0x54,
+ dtag_dvb_parental_rating = 0x55,
+ dtag_dvb_teletext = 0x56,
+ dtag_dvb_telephone = 0x57,
+ dtag_dvb_local_time_offset = 0x58,
+ dtag_dvb_subtitling = 0x59,
+ dtag_dvb_terrestial_delivery_system = 0x5a,
+ dtag_dvb_multilingual_network_name = 0x5b,
+ dtag_dvb_multilingual_bouquet_name = 0x5c,
+ dtag_dvb_multilingual_service_name = 0x5d,
+ dtag_dvb_multilingual_component = 0x5e,
+ dtag_dvb_private_data_specifier = 0x5f,
+ dtag_dvb_service_move = 0x60,
+ dtag_dvb_short_smoothing_buffer = 0x61,
+ dtag_dvb_frequency_list = 0x62,
+ dtag_dvb_partial_transport_stream = 0x63,
+ dtag_dvb_data_broadcast = 0x64,
+ dtag_dvb_scrambling = 0x65,
+ dtag_dvb_data_broadcast_id = 0x66,
+ dtag_dvb_transport_stream = 0x67,
+ dtag_dvb_dsng = 0x68,
+ dtag_dvb_pdc = 0x69,
+ dtag_dvb_ac3 = 0x6a,
+ dtag_dvb_ancillary_data = 0x6b,
+ dtag_dvb_cell_list = 0x6c,
+ dtag_dvb_cell_frequency_link = 0x6d,
+ dtag_dvb_announcement_support = 0x6e,
+ dtag_dvb_application_signalling = 0x6f,
+ dtag_dvb_adaptation_field_data = 0x70,
+ dtag_dvb_service_identifier = 0x71,
+ dtag_dvb_service_availability = 0x72,
+ dtag_dvb_default_authority = 0x73,
+ dtag_dvb_related_content = 0x74,
+ dtag_dvb_tva_id = 0x75,
+ dtag_dvb_content_identifier = 0x76,
+ dtag_dvb_time_slice_fec_identifier = 0x77,
+ dtag_dvb_ecm_repetition_rate = 0x78,
+ dtag_dvb_s2_satellite_delivery_descriptor= 0x79,
+
+ /* descriptors which may only appear in an RNT */
+ dtag_dvb_rnt_rar_over_dvb_stream = 0x40,
+ dtag_dvb_rnt_rar_over_ip = 0x41,
+ dtag_dvb_rnt_rnt_scan = 0x42,
+
+ /* descriptors which may only appear in an AIT */
+ dtag_dvb_ait_application = 0x00,
+ dtag_dvb_ait_application_name = 0x01,
+ dtag_dvb_ait_transport_protocol = 0x02,
+ dtag_dvb_ait_dvb_j_application = 0x03,
+ dtag_dvb_ait_dvb_j_application_location = 0x04,
+ dtag_dvb_ait_external_application_authorisation = 0x05,
+ dtag_dvb_ait_dvb_html_application = 0x08,
+ dtag_dvb_ait_dvb_html_application_location = 0x09,
+ dtab_dvb_ait_dvb_html_application_boundary = 0x0a,
+ dtag_dvb_ait_application_icons = 0x0b,
+ dtag_dvb_ait_prefetch = 0x0c,
+ dtag_dvb_ait_dii_location = 0x0d,
+ dtag_dvb_ait_ip_signalling = 0x11
+};/*__ucsi_packed;*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/dit_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/dit_section.c
new file mode 100644
index 0000000..4f69d4e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/dit_section.c
@@ -0,0 +1,32 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/dit_section.h>
+
+struct dvb_dit_section * dvb_dit_section_codec(struct section * section)
+{
+ struct dvb_dit_section * ret = (struct dvb_dit_section *)section;
+
+ if (section->length < 1)
+ return NULL;
+
+ return ret;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/dit_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/dit_section.h
new file mode 100644
index 0000000..69fce4f
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/dit_section.h
@@ -0,0 +1,54 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_DIT_SECTION_H
+#define _UCSI_DVB_DIT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * dvb_dit_section structure.
+ */
+struct dvb_dit_section {
+ struct section head;
+
+ EBIT2(uint8_t transition_flag : 1; ,
+ uint8_t reserved : 7; );
+};
+
+/**
+ * Process a dvb_dit_section.
+ *
+ * @param section Pointer to a generic section header.
+ * @return Pointer to a dvb_dit_section, or NULL on error.
+ */
+struct dvb_dit_section * dvb_dit_section_codec(struct section *section);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/dsng_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/dsng_descriptor.h
new file mode 100644
index 0000000..6fd369b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/dsng_descriptor.h
@@ -0,0 +1,80 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_DSNG_DESCRIPTOR
+#define _UCSI_DVB_DSNG_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_dsng_descriptor structure.
+ */
+struct dvb_dsng_descriptor {
+ struct descriptor d;
+
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_dsng_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to a dvb_dsng_descriptor, or NULL on error.
+ */
+static inline struct dvb_dsng_descriptor*
+ dvb_dsng_descriptor_codec(struct descriptor* d)
+{
+ return (struct dvb_dsng_descriptor*) d;
+}
+
+/**
+ * Accessor for the data field in a dvb_dsng_descriptor.
+ *
+ * @param d dvb_dsng_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *dvb_dsng_descriptor_data(struct dvb_dsng_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_dsng_descriptor);
+}
+
+/**
+ * Determine the length of the data field in a dvb_dsng_descriptor.
+ *
+ * @param d dvb_dsng_descriptor pointer.
+ * @return Length of the field in bytes.
+ */
+static inline int dvb_dsng_descriptor_data_length(struct dvb_dsng_descriptor *d)
+{
+ return d->d.len;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/eit_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/eit_section.c
new file mode 100644
index 0000000..ce22a58
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/eit_section.c
@@ -0,0 +1,63 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/eit_section.h>
+
+struct dvb_eit_section *dvb_eit_section_codec(struct section_ext * ext)
+{
+ uint8_t * buf = (uint8_t *) ext;
+ unsigned int pos = sizeof(struct section_ext);
+ unsigned int len = section_ext_length(ext);
+
+ if (len < sizeof(struct dvb_eit_section))
+ return NULL;
+
+ bswap16(buf + pos);
+ pos += 2;
+ bswap16(buf + pos);
+ pos += 4;
+
+ while (pos < len) {
+ struct dvb_eit_event * event =
+ (struct dvb_eit_event *) (buf + pos);
+
+ if ((pos + sizeof(struct dvb_eit_event)) > len)
+ return NULL;
+
+ bswap16(buf + pos);
+ bswap16(buf + pos + 10);
+
+ pos += sizeof(struct dvb_eit_event);
+
+ if ((pos + event->descriptors_loop_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, event->descriptors_loop_length))
+ return NULL;
+
+ pos += event->descriptors_loop_length;
+ }
+
+ if (pos != len)
+ return NULL;
+
+ return (struct dvb_eit_section *) ext;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/eit_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/eit_section.h
new file mode 100644
index 0000000..9064224
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/eit_section.h
@@ -0,0 +1,160 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_EIT_SECTION_H
+#define _UCSI_DVB_EIT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+#include <libucsi/dvb/types.h>
+
+
+/**
+ * dvb_eit_section structure.
+ */
+struct dvb_eit_section {
+ struct section_ext head;
+
+ uint16_t transport_stream_id;
+ uint16_t original_network_id;
+ uint8_t segment_last_section_number;
+ uint8_t last_table_id;
+ /* struct eit_event events[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the events field of a dvb_eit_section.
+ */
+struct dvb_eit_event {
+ uint16_t event_id;
+ dvbdate_t start_time;
+ dvbduration_t duration;
+ EBIT3(uint16_t running_status : 3; ,
+ uint16_t free_ca_mode : 1; ,
+ uint16_t descriptors_loop_length:12; );
+ /* struct descriptor descriptors[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_eit_section.
+ *
+ * @param section Pointer to a generic section_ext structure.
+ * @return Pointer to a dvb_eit_section, or NULL on error.
+ */
+struct dvb_eit_section *dvb_eit_section_codec(struct section_ext *section);
+
+/**
+ * Accessor for the service_id field of an EIT.
+ *
+ * @param eit EIT pointer.
+ * @return The service_id.
+ */
+static inline uint16_t dvb_eit_section_service_id(struct dvb_eit_section *eit)
+{
+ return eit->head.table_id_ext;
+}
+
+/**
+ * Iterator for the events field of a dvb_eit_section.
+ *
+ * @param eit dvb_eit_section pointer.
+ * @param pos Variable containing a pointer to the current dvb_eit_event.
+ */
+#define dvb_eit_section_events_for_each(eit, pos) \
+ for ((pos) = dvb_eit_section_events_first(eit); \
+ (pos); \
+ (pos) = dvb_eit_section_events_next(eit, pos))
+
+/**
+ * Iterator for the descriptors field of a dvb_eit_event.
+ *
+ * @param eit dvb_eit_event pointer.
+ * @param pos Variable containing a pointer to the current descriptor.
+ */
+#define dvb_eit_event_descriptors_for_each(event, pos) \
+ for ((pos) = dvb_eit_event_descriptors_first(event); \
+ (pos); \
+ (pos) = dvb_eit_event_descriptors_next(event, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_eit_event *
+ dvb_eit_section_events_first(struct dvb_eit_section *eit)
+{
+ int pos = sizeof(struct dvb_eit_section);
+
+ if (pos >= section_ext_length(&eit->head))
+ return NULL;
+
+ return (struct dvb_eit_event*) ((uint8_t *) eit + pos);
+}
+
+static inline struct dvb_eit_event *
+ dvb_eit_section_events_next(struct dvb_eit_section *eit,
+ struct dvb_eit_event *pos)
+{
+ uint8_t *end = (uint8_t*) eit + section_ext_length(&eit->head);
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_eit_event) +
+ pos->descriptors_loop_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_eit_event *) next;
+}
+
+static inline struct descriptor *
+ dvb_eit_event_descriptors_first(struct dvb_eit_event * t)
+{
+ if (t->descriptors_loop_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t *) t + sizeof(struct dvb_eit_event));
+}
+
+static inline struct descriptor *
+ dvb_eit_event_descriptors_next(struct dvb_eit_event * t,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) t + sizeof(struct dvb_eit_event),
+ t->descriptors_loop_length,
+ pos);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/extended_event_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/extended_event_descriptor.h
new file mode 100644
index 0000000..82d580b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/extended_event_descriptor.h
@@ -0,0 +1,232 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_EXTENDED_EVENT_DESCRIPTOR
+#define _UCSI_DVB_EXTENDED_EVENT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_extended_event_descriptor structure.
+ */
+struct dvb_extended_event_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint8_t descriptor_number : 4; ,
+ uint8_t last_descriptor_number : 4; )
+ iso639lang_t language_code;
+ uint8_t length_of_items;
+ /* struct dvb_extended_event_item items[] */
+ /* struct dvb_extended_event_descriptor_part2 part2 */
+} __ucsi_packed;
+
+/**
+ * An entry in the items field of a dvb_extended_event_descriptor.
+ */
+struct dvb_extended_event_item {
+ uint8_t item_description_length;
+ /* uint8_t item_description[] */
+ /* struct dvb_extended_event_item_part2 part2 */
+} __ucsi_packed;
+
+/**
+ * The second part of a dvb_extended_event_item, following the variable length
+ * description field.
+ */
+struct dvb_extended_event_item_part2 {
+ uint8_t item_length;
+ /* uint8_t item[] */
+} __ucsi_packed;
+
+/**
+ * The second part of a dvb_extended_event_descriptor, following the variable
+ * length items field.
+ */
+struct dvb_extended_event_descriptor_part2 {
+ uint8_t text_length;
+ /* uint8_t text[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_extended_event_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_extended_event_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_extended_event_descriptor*
+ dvb_extended_event_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+ struct dvb_extended_event_descriptor * p =
+ (struct dvb_extended_event_descriptor *) d;
+ struct dvb_extended_event_descriptor_part2 *p2;
+
+ pos += sizeof(struct dvb_extended_event_descriptor) - 2;
+
+ if (pos > len)
+ return NULL;
+
+ pos += p->length_of_items;
+
+ if (pos > len)
+ return NULL;
+
+ p2 = (struct dvb_extended_event_descriptor_part2*) (buf+pos);
+
+ pos += sizeof(struct dvb_extended_event_descriptor_part2);
+
+ if (pos > len)
+ return NULL;
+
+ pos += p2->text_length;
+
+ if (pos != len)
+ return NULL;
+
+ return p;
+}
+
+/**
+ * Iterator for the items field of a dvb_extended_event_descriptor.
+ *
+ * @param d dvb_extended_event_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_extended_event_item.
+ */
+#define dvb_extended_event_descriptor_items_for_each(d, pos) \
+ for ((pos) = dvb_extended_event_descriptor_items_first(d); \
+ (pos); \
+ (pos) = dvb_extended_event_descriptor_items_next(d, pos))
+
+/**
+ * Accessor for the description field of a dvb_extended_event_item.
+ *
+ * @param d dvb_extended_event_item pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ dvb_extended_event_item_description(struct dvb_extended_event_item *d)
+{
+ return (uint8_t*) d + sizeof(struct dvb_extended_event_item);
+}
+
+/**
+ * Accessor for the second part of a dvb_extended_event_item.
+ *
+ * @param dvb_extended_event_item pointer.
+ * @return dvb_extended_event_item_part2 pointer.
+ */
+static inline struct dvb_extended_event_item_part2*
+ dvb_extended_event_item_part2(struct dvb_extended_event_item *d)
+{
+ return (struct dvb_extended_event_item_part2*)
+ ((uint8_t*) d + sizeof(struct dvb_extended_event_item) +
+ d->item_description_length);
+}
+
+/**
+ * Accessor for the item field of a dvb_extended_event_item_part2.
+ *
+ * @param d dvb_extended_event_item_part2 pointer.
+ * @return Pointer to the item field.
+ */
+static inline uint8_t*
+ dvb_extended_event_item_part2_item(struct dvb_extended_event_item_part2 *d)
+{
+ return (uint8_t*) d + sizeof(struct dvb_extended_event_item_part2);
+}
+
+/**
+ * Accessor for the second part of a dvb_extended_event_descriptor.
+ *
+ * @param d dvb_extended_event_descriptor pointer.
+ * @return dvb_extended_event_descriptor_part2 pointer.
+ */
+static inline struct dvb_extended_event_descriptor_part2*
+ dvb_extended_event_descriptor_part2(struct dvb_extended_event_descriptor *d)
+{
+ return (struct dvb_extended_event_descriptor_part2*)
+ ((uint8_t*) d + sizeof(struct dvb_extended_event_descriptor) +
+ d->length_of_items);
+}
+
+/**
+ * Accessor for the text field of an dvb_extended_event_descriptor_part2.
+ *
+ * @param d dvb_extended_event_descriptor_part2 pointer.
+ * @return Pointer to the text field.
+ */
+static inline uint8_t*
+ dvb_extended_event_descriptor_part2_text(struct dvb_extended_event_descriptor_part2 *d)
+{
+ return (uint8_t*)
+ ((uint8_t*) d + sizeof(struct dvb_extended_event_descriptor_part2));
+}
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_extended_event_item*
+ dvb_extended_event_descriptor_items_first(struct dvb_extended_event_descriptor *d)
+{
+ if (d->length_of_items == 0)
+ return NULL;
+
+ return (struct dvb_extended_event_item *)
+ ((uint8_t*) d + sizeof(struct dvb_extended_event_descriptor));
+}
+
+static inline struct dvb_extended_event_item*
+ dvb_extended_event_descriptor_items_next(struct dvb_extended_event_descriptor *d,
+ struct dvb_extended_event_item *pos)
+{
+ struct dvb_extended_event_item_part2* part2 =
+ dvb_extended_event_item_part2(pos);
+ uint8_t *end = (uint8_t*) d + sizeof(struct dvb_extended_event_descriptor) + d->length_of_items;
+ uint8_t *next = (uint8_t *) part2 +
+ sizeof(struct dvb_extended_event_item_part2) +
+ part2->item_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_extended_event_item *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/frequency_list_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/frequency_list_descriptor.h
new file mode 100644
index 0000000..4fca751
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/frequency_list_descriptor.h
@@ -0,0 +1,107 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_FREQUENCY_LIST_DESCRIPTOR
+#define _UCSI_DVB_FREQUENCY_LIST_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Possible values for coding_type.
+ */
+enum {
+ DVB_CODING_TYPE_SATELLITE = 0x01,
+ DVB_CODING_TYPE_CABLE = 0x02,
+ DVB_CODING_TYPE_TERRESTRIAL = 0x03
+};
+
+/**
+ * dvb_frequency_list_descriptor structure.
+ */
+struct dvb_frequency_list_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint8_t reserved : 6; ,
+ uint8_t coding_type : 2; )
+ /* uint32_t centre_frequencies [] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_frequency_list_descriptor.
+ *
+ * @param d Pointer to a generic descriptor structure.
+ * @return dvb_frequency_list_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_frequency_list_descriptor*
+ dvb_frequency_list_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t len = d->len;
+
+ pos += sizeof(struct dvb_frequency_list_descriptor) - 2;
+
+ if ((len - pos) % 4)
+ return NULL;
+
+ while(pos < len) {
+ bswap32(buf+pos);
+ pos += 4;
+ }
+
+ return (struct dvb_frequency_list_descriptor*) d;
+}
+
+/**
+ * Accessor for the centre_frequencies field of a dvb_frequency_list_descriptor.
+ *
+ * @param d dvb_frequency_list_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint32_t *
+ dvb_frequency_list_descriptor_centre_frequencies(struct dvb_frequency_list_descriptor *d)
+{
+ return (uint32_t *) ((uint8_t *) d + sizeof(struct dvb_frequency_list_descriptor));
+}
+
+/**
+ * Determine the number of entries in the centre_frequencies field of a dvb_frequency_list_descriptor.
+ *
+ * @param d dvb_frequency_list_descriptor pointer.
+ * @return The number of entries.
+ */
+static inline int
+ dvb_frequency_list_descriptor_centre_frequencies_count(struct dvb_frequency_list_descriptor *d)
+{
+ return (d->d.len - 1) >> 2;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/int_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/int_section.c
new file mode 100644
index 0000000..a6ddd6e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/int_section.c
@@ -0,0 +1,80 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ * Copyright (C) 2005 Patrick Boettcher (pb@linuxtv.org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/int_section.h>
+
+struct dvb_int_section * dvb_int_section_codec(struct section_ext *ext)
+{
+ uint8_t *buf = (uint8_t *) ext;
+ struct dvb_int_section *in = (struct dvb_int_section *) ext;
+
+ unsigned int pos = sizeof(struct section_ext);
+ unsigned int len = section_ext_length(ext);
+
+ if (len < sizeof(struct dvb_int_section))
+ return NULL;
+
+ bswap32(buf+8);
+ bswap16(buf+12);
+ pos += 9;
+
+ if (len - pos < in->platform_descriptors_length)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, in->platform_descriptors_length))
+ return NULL;
+
+ pos += in->platform_descriptors_length;
+
+ while (pos < len) {
+ struct dvb_int_target *s2 = (struct dvb_int_target *) (buf + pos);
+ struct dvb_int_operational_loop *s3;
+
+ bswap16(buf + pos); /* target_descriptor_loop_length swap */
+
+ if (len - pos < s2->target_descriptors_length)
+ return NULL;
+
+ pos += sizeof(struct dvb_int_target);
+
+ if (verify_descriptors(buf + pos, s2->target_descriptors_length))
+ return NULL;
+
+ pos += s2->target_descriptors_length;
+
+ s3 = (struct dvb_int_operational_loop *) (buf + pos);
+
+ bswap16(buf + pos); /* operational_descriptor_loop_length swap */
+
+ if (len - pos < s3->operational_descriptors_length)
+ return NULL;
+
+ pos += sizeof(struct dvb_int_operational_loop);
+
+ if (verify_descriptors(buf + pos, s3->operational_descriptors_length))
+ return NULL;
+
+ pos += s3->operational_descriptors_length;
+ }
+
+ return (struct dvb_int_section *) ext;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/int_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/int_section.h
new file mode 100644
index 0000000..71ba1e8
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/int_section.h
@@ -0,0 +1,245 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ * Copyright (C) 2005 Patrick Boettcher (pb@linuxtv.org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+#ifndef _UCSI_DVB_INT_SECTION_H
+#define _UCSI_DVB_INT_SECTION_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * dvb_int_section structure - IP/MAC notification section.
+ */
+struct dvb_int_section {
+ struct section_ext head;
+
+ EBIT2(uint32_t platform_id :24; ,
+ uint32_t processing_order : 8; );
+ EBIT2(uint16_t reserved2 : 4; ,
+ uint16_t platform_descriptors_length :12; );
+ /* struct descriptor platform_descriptors[] */
+ /* struct dvb_int_target target_loop[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the target_loop field of a dvb_int_section.
+ */
+struct dvb_int_target {
+ EBIT2(uint16_t reserved3 : 4; ,
+ uint16_t target_descriptors_length :12; );
+ /* struct descriptor target_descriptors[] */
+ /* struct dvb_int_operational_loop operational_loop */
+} __ucsi_packed;
+
+/**
+ * The operational_loop field in a dvb_int_target.
+ */
+struct dvb_int_operational_loop {
+ EBIT2(uint16_t reserved4 : 4; ,
+ uint16_t operational_descriptors_length :12; );
+ /* struct descriptor operational_descriptors[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_int_section.
+ *
+ * @param section Generic section_ext pointer.
+ * @return dvb_int_section pointer, or NULL on error.
+ */
+extern struct dvb_int_section * dvb_int_section_codec(struct section_ext *section);
+
+/**
+ * Accessor for the action_type field of an INT.
+ *
+ * @param intp INT pointer.
+ * @return The action_type.
+ */
+static inline uint8_t dvb_int_section_action_type(struct dvb_int_section *intp)
+{
+ return intp->head.table_id_ext >> 8;
+}
+
+/**
+ * Accessor for the platform_id_hash field of an INT.
+ *
+ * @param intp INT pointer.
+ * @return The platform_id_hash.
+ */
+static inline uint8_t dvb_int_section_platform_id_hash(struct dvb_int_section *intp)
+{
+ return intp->head.table_id_ext & 0xff;
+}
+
+/**
+ * Iterator for platform_descriptors field in a dvb_int_section.
+ *
+ * @param intp dvb_int_section pointer.
+ * @param pos Variable holding a pointer to the current descriptor.
+ */
+#define dvb_int_section_platform_descriptors_for_each(intp, pos) \
+ for ((pos) = dvb_int_section_platform_descriptors_first(intp); \
+ (pos); \
+ (pos) = dvb_int_section_platform_descriptors_next(intp, pos))
+
+/**
+ * Iterator for the target_loop field in a dvb_int_section.
+ *
+ * @param intp dvb_int_section pointer.
+ * @param pos Variable holding a pointer to the current dvb_int_target.
+ */
+#define dvb_int_section_target_loop_for_each(intp,pos) \
+ for ((pos) = dvb_int_section_target_loop_first(intp); \
+ (pos); \
+ (pos) = dvb_int_section_target_loop_next(intp, pos))
+
+/**
+ * Iterator for the target_descriptors field in a dvb_int_target.
+ *
+ * @param target dvb_int_target pointer.
+ * @param pos Variable holding a pointer to the current descriptor.
+ */
+#define dvb_int_target_target_descriptors_for_each(target, pos) \
+ for ((pos) = dvb_int_target_target_descriptors_first(target); \
+ (pos); \
+ (pos) = dvb_int_target_target_descriptors_next(target, pos))
+
+/**
+ * Accessor for the operational_loop field of a dvb_int_target.
+ *
+ * @param target dvb_int_target pointer.
+ * @return Pointer to a dvb_int_operational_loop.
+ */
+static inline struct dvb_int_operational_loop *
+ dvb_int_target_operational_loop(struct dvb_int_target *target)
+{
+ return (struct dvb_int_operational_loop *)
+ ((uint8_t *) target + sizeof(struct dvb_int_target) + target->target_descriptors_length);
+}
+
+/**
+ * Iterator for the operational_descriptors field in a dvb_int_operational_loop.
+ *
+ * @param oploop dvb_int_operational_loop pointer.
+ * @param pos Variable holding a pointer to the current descriptor.
+ */
+#define dvb_int_operational_loop_operational_descriptors_for_each(oploop, pos) \
+ for ((pos) = dvb_int_operational_loop_operational_descriptors_first(oploop); \
+ (pos); \
+ (pos) = dvb_int_operational_loop_operational_descriptors_next(oploop, pos))
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct descriptor *
+ dvb_int_section_platform_descriptors_first(struct dvb_int_section *in)
+{
+ if (in->platform_descriptors_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t *) in + sizeof(struct dvb_int_section));
+}
+
+static inline struct descriptor *
+ dvb_int_section_platform_descriptors_next(struct dvb_int_section *in,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) in + sizeof(struct dvb_int_section),
+ in->platform_descriptors_length,
+ pos);
+}
+
+static inline struct dvb_int_target *
+ dvb_int_section_target_loop_first(struct dvb_int_section *in)
+{
+ if (sizeof(struct dvb_int_section) + in->platform_descriptors_length >= (uint32_t) section_ext_length((struct section_ext *) in))
+ return NULL;
+
+ return (struct dvb_int_target *)
+ ((uint8_t *) in + sizeof(struct dvb_int_section) + in->platform_descriptors_length);
+}
+
+static inline struct dvb_int_target *
+ dvb_int_section_target_loop_next(struct dvb_int_section *in,
+ struct dvb_int_target *pos)
+{
+ struct dvb_int_operational_loop *ol = dvb_int_target_operational_loop(pos);
+ struct dvb_int_target *next =
+ (struct dvb_int_target *) ( (uint8_t *) pos +
+ sizeof(struct dvb_int_target) + pos->target_descriptors_length +
+ sizeof(struct dvb_int_operational_loop) + ol->operational_descriptors_length);
+ struct dvb_int_target *end =
+ (struct dvb_int_target *) ((uint8_t *) in + section_ext_length((struct section_ext *) in) );
+
+ if (next >= end)
+ return 0;
+ return next;
+}
+
+static inline struct descriptor *
+ dvb_int_target_target_descriptors_first(struct dvb_int_target *tl)
+{
+ if (tl->target_descriptors_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t *) tl + sizeof(struct dvb_int_target));
+}
+
+static inline struct descriptor *
+ dvb_int_target_target_descriptors_next(struct dvb_int_target *tl,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) tl + sizeof(struct dvb_int_target),
+ tl->target_descriptors_length,
+ pos);
+}
+
+static inline struct descriptor *
+ dvb_int_operational_loop_operational_descriptors_first(struct dvb_int_operational_loop *ol)
+{
+ if (ol->operational_descriptors_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t *) ol + sizeof(struct dvb_int_operational_loop));
+}
+
+static inline struct descriptor *
+ dvb_int_operational_loop_operational_descriptors_next(struct dvb_int_operational_loop *ol,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) ol + sizeof(struct dvb_int_operational_loop),
+ ol->operational_descriptors_length,
+ pos);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/linkage_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/linkage_descriptor.h
new file mode 100644
index 0000000..f3370c8
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/linkage_descriptor.h
@@ -0,0 +1,478 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_LINKAGE_DESCRIPTOR
+#define _UCSI_DVB_LINKAGE_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * Possible values for linkage_type.
+ */
+enum {
+ DVB_LINKAGE_TYPE_INFORMATION = 0x01,
+ DVB_LINKAGE_TYPE_EPG = 0x02,
+ DVB_LINKAGE_TYPE_CA_REPLACEMENT = 0x03,
+ DVB_LINKAGE_TYPE_TS_WITH_BAT_NIT = 0x04,
+ DVB_LINKAGE_TYPE_SERVICE_REPLACMENT = 0x05,
+ DVB_LINKAGE_TYPE_DATA_BCAST = 0x06,
+ DVB_LINKAGE_TYPE_RCS_MAP = 0x07,
+ DVB_LINKAGE_TYPE_MOBILE_HANDOVER = 0x08,
+ DVB_LINKAGE_TYPE_SOFTWARE_UPDATE = 0x09,
+ DVB_LINKAGE_TYPE_TS_WITH_SSU_BAT_NIT = 0x0a,
+ DVB_LINKAGE_TYPE_IP_MAC_NOTIFICATION = 0x0b,
+ DVB_LINKAGE_TYPE_TS_WITH_INT_BAT_NIT = 0x0c
+};
+
+/**
+ * Possible values for hand_over_type.
+ */
+enum {
+ DVB_HAND_OVER_TYPE_IDENTICAL_NEIGHBOURING_COUNTRY = 0x01,
+ DVB_HAND_OVER_TYPE_LOCAL_VARIATION = 0x02,
+ DVB_HAND_OVER_TYPE_ASSOCIATED_SERVICE = 0x03
+};
+
+/**
+ * Possible values for origin_type.
+ */
+enum {
+ DVB_ORIGIN_TYPE_NIT = 0x00,
+ DVB_ORIGIN_TYPE_SDT = 0x01
+};
+
+/**
+ * dvb_linkage_descriptor structure.
+ */
+struct dvb_linkage_descriptor {
+ struct descriptor d;
+
+ uint16_t transport_stream_id;
+ uint16_t original_network_id;
+ uint16_t service_id;
+ uint8_t linkage_type;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * Data for a linkage_type of 0x08.
+ */
+struct dvb_linkage_data_08 {
+ EBIT3(uint8_t hand_over_type : 4; ,
+ uint8_t reserved : 3; ,
+ uint8_t origin_type : 1; )
+ /* uint16_t network_id if hand_over_type == 1,2,3 */
+ /* uint16_t initial_service_id if origin_type = 0 */
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * Data for an linkage_type of 0x0b (IP/MAC Notification Table).
+ */
+struct dvb_linkage_data_0b {
+ uint8_t platform_id_data_length;
+ /* struct platform_id ids[] */
+} __ucsi_packed;
+
+/**
+ * Entries in the ids field of a dvb_linkage_data_0b.
+ */
+struct dvb_platform_id {
+ EBIT2(uint32_t platform_id : 24; ,
+ uint32_t platform_name_loop_length : 8; )
+ /* struct platform_name names[] */
+} __ucsi_packed;
+
+/**
+ * Entries in the names field of a dvb_platform_id.
+ */
+struct dvb_platform_name {
+ iso639lang_t language_code;
+ uint8_t platform_name_length;
+ /* uint8_t text[] */
+} __ucsi_packed;
+
+/**
+ * Data for a linkage_type of 0x0c (IP/MAC Notification Table).
+ */
+struct dvb_linkage_data_0c {
+ uint8_t table_type;
+ /* uint16_t bouquet_id if table_type == 0x02 */
+} __ucsi_packed;
+
+
+/**
+ * Process a dvb_linkage_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_linkage_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_linkage_descriptor*
+ dvb_linkage_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t len = d->len;
+ struct dvb_linkage_descriptor *p =
+ (struct dvb_linkage_descriptor*) d;
+
+ if (len < (sizeof(struct dvb_linkage_descriptor) - 2))
+ return NULL;
+
+ bswap16(buf);
+ bswap16(buf+2);
+ bswap16(buf+4);
+
+ pos += sizeof(struct dvb_linkage_descriptor) - 2;
+
+ if (p->linkage_type == 0x08) {
+ struct dvb_linkage_data_08 *d08;
+
+ if ((len - pos) < sizeof(struct dvb_linkage_data_08))
+ return NULL;
+ d08 = (struct dvb_linkage_data_08 *) (buf+pos);
+ pos += sizeof(struct dvb_linkage_data_08);
+
+ switch(d08->hand_over_type) {
+ case 1:
+ case 2:
+ case 3:
+ if ((len - pos) < 2)
+ return NULL;
+ bswap16(buf+pos);
+ pos += 2;
+ break;
+ }
+ if (d08->origin_type == 0) {
+ if ((len - pos) < 2)
+ return NULL;
+ bswap16(buf+pos);
+ pos+=2;
+ }
+
+ } else if (p->linkage_type == 0x0b) {
+ uint32_t pos2=0;
+ struct dvb_linkage_data_0b *l_0b = (struct dvb_linkage_data_0b *) (buf + pos);
+
+ if ((len - pos) < sizeof(struct dvb_linkage_data_0b))
+ return NULL;
+
+ pos += sizeof(struct dvb_linkage_data_0b);
+ if ((len - pos) < l_0b->platform_id_data_length)
+ return NULL;
+
+ while (pos2 < l_0b->platform_id_data_length) {
+ struct dvb_platform_id *p_id = (struct dvb_platform_id *) (buf + pos + pos2);
+ if ((len - pos - pos2) < p_id->platform_name_loop_length)
+ return NULL;
+
+ pos2 += sizeof(struct dvb_platform_id) + p_id->platform_name_loop_length;
+ }
+
+ pos += pos2;
+ } else if (p->linkage_type == 0x0c) {
+ struct dvb_linkage_data_0c *l_0c = (struct dvb_linkage_data_0c *) (buf + pos);
+
+ if ((len - pos) < sizeof(struct dvb_linkage_data_0c))
+ return NULL;
+ pos += sizeof(struct dvb_linkage_data_0c);
+
+ if (l_0c->table_type == 0x02) {
+ if ((len - pos) < 2)
+ return NULL;
+ bswap16(buf+pos);
+ }
+ }
+
+ return (struct dvb_linkage_descriptor*) d;
+}
+
+/**
+ * Accessor for the data field of a dvb_linkage_descriptor.
+ *
+ * @param d dvb_linkage_descriptor pointer.
+ * @return Pointer to the data field.
+ */
+static inline uint8_t *
+ dvb_linkage_descriptor_data(struct dvb_linkage_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_linkage_descriptor);
+}
+
+/**
+ * Determine the length of the data field of a dvb_linkage_descriptor.
+ *
+ * @param d dvb_linkage_descriptor pointer.
+ * @return Length of the field in bytes.
+ */
+static inline int
+ dvb_linkage_descriptor_data_length(struct dvb_linkage_descriptor *d)
+{
+ return d->d.len - 7;
+}
+
+/**
+ * Accessor for a dvb_linkage_data_08 pointer.
+ *
+ * @param d dvb_linkage_descriptor pointer.
+ * @return Pointer to the data field.
+ */
+static inline struct dvb_linkage_data_08 *
+ dvb_linkage_data_08(struct dvb_linkage_descriptor *d)
+{
+ if (d->linkage_type != 0x08)
+ return NULL;
+ return (struct dvb_linkage_data_08 *) dvb_linkage_descriptor_data(d);
+}
+
+/**
+ * Accessor for the network_id field of a dvb_linkage_data_08.
+ *
+ * @param d dvb_linkage_descriptor pointer
+ * @param d08 dvb_linkage_data_08 pointer.
+ * @return network_id, or -1 if not present
+ */
+static inline int
+ dvb_linkage_data_08_network_id(struct dvb_linkage_descriptor *d, struct dvb_linkage_data_08 *d08)
+{
+ if (d->linkage_type != 0x08)
+ return -1;
+
+ switch(d08->hand_over_type) {
+ case 1:
+ case 2:
+ case 3:
+ return *((uint16_t*) ((uint8_t*) d08 + sizeof(struct dvb_linkage_data_08)));
+ }
+
+ return -1;
+}
+
+/**
+ * Accessor for the initial_service_id field of a dvb_linkage_data_08.
+ *
+ * @param d dvb_linkage_descriptor pointer
+ * @param d08 dvb_linkage_data_08 pointer.
+ * @return initial_service_id, or -1 if not present
+ */
+static inline int
+ dvb_linkage_data_08_initial_service_id(struct dvb_linkage_descriptor *d, struct dvb_linkage_data_08 *d08)
+{
+ uint8_t *pos;
+
+ if (d->linkage_type != 0x08)
+ return -1;
+ if (d08->origin_type != 0)
+ return -1;
+
+ pos = ((uint8_t*) d08) + sizeof(struct dvb_linkage_data_08);
+ switch(d08->hand_over_type) {
+ case 1:
+ case 2:
+ case 3:
+ pos +=2;
+ break;
+ }
+
+ return *((uint16_t*) pos);
+}
+
+/**
+ * Accessor for the data field of a dvb_linkage_data_08.
+ *
+ * @param d dvb_linkage_descriptor pointer
+ * @param d08 dvb_linkage_data_08 pointer.
+ * @param length Pointer to int destination for data length.
+ * @return Pointer to the data field, or NULL if invalid
+ */
+static inline uint8_t *
+ dvb_linkage_data_08_data(struct dvb_linkage_descriptor *d, struct dvb_linkage_data_08 *d08, int *length)
+{
+ uint8_t *pos;
+ int used = 0;
+
+ if (d->linkage_type != 0x08) {
+ *length = 0;
+ return NULL;
+ }
+
+ pos = ((uint8_t*) d08) + sizeof(struct dvb_linkage_data_08);
+ switch(d08->hand_over_type) {
+ case 1:
+ case 2:
+ case 3:
+ pos += 2;
+ used += 2;
+ break;
+ }
+ if (d08->origin_type == 0) {
+ pos+=2;
+ used+=2;
+ }
+
+ *length = dvb_linkage_descriptor_data_length(d) - (sizeof(struct dvb_linkage_data_08) + used);
+ return pos;
+}
+
+/**
+ * Accessor for a dvb_linkage_data_0b pointer.
+ *
+ * @param d dvb_linkage_descriptor pointer.
+ * @return Pointer to the data field.
+ */
+static inline struct dvb_linkage_data_0b *
+ dvb_linkage_data_0b(struct dvb_linkage_descriptor *d)
+{
+ if (d->linkage_type != 0x0b)
+ return NULL;
+ return (struct dvb_linkage_data_0b *) dvb_linkage_descriptor_data(d);
+}
+
+/**
+ * Iterator for the platform_id field of a dvb_linkage_data_0b.
+ *
+ * @param linkage dvb_linkage_data_0b pointer.
+ * @param pos Variable containing a pointer to the current dvb_platform_id.
+ */
+#define dvb_dvb_linkage_data_0b_platform_id_for_each(linkage, pos) \
+ for ((pos) = dvb_platform_id_first(linkage); \
+ (pos); \
+ (pos) = dvb_platform_id_next(linkage, pos))
+
+/**
+ * Iterator for the platform_name field of a dvb_platform_id.
+ *
+ * @param platid dvb_platform_id pointer.
+ * @param pos Variable containing a pointer to the current dvb_platform_name.
+ */
+#define dvb_platform_id_platform_name_for_each(platid, pos) \
+ for ((pos) = dvb_platform_name_first(platid); \
+ (pos); \
+ (pos) = dvb_platform_name_next(platid, pos))
+
+/**
+ * Accessor for the text field of a dvb_platform_name.
+ *
+ * @param p dvb_platform_name pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_platform_name_text(struct dvb_platform_name *p)
+{
+ return (uint8_t *) p + sizeof(struct dvb_platform_name);
+}
+
+/**
+ * Accessor for a dvb_linkage_data_0c pointer.
+ *
+ * @param d dvb_linkage_descriptor pointer.
+ * @return Pointer to the data field.
+ */
+static inline struct dvb_linkage_data_0c *
+ dvb_linkage_data_0c(struct dvb_linkage_descriptor *d)
+{
+ if (d->linkage_type != 0x0c)
+ return NULL;
+ return (struct dvb_linkage_data_0c *) dvb_linkage_descriptor_data(d);
+}
+
+/**
+ * Accessor for the bouquet_id field of a dvb_linkage_data_0c if table_id == 0x02.
+ *
+ * @param l_0c dvb_linkage_data_0c pointer.
+ * @return The bouquet field, or -1 on error.
+ */
+static inline int
+ dvb_linkage_data_0c_bouquet_id(struct dvb_linkage_data_0c *l_0c)
+{
+ if (l_0c->table_type != 0x02)
+ return -1;
+
+ return *((uint16_t *) ((uint8_t*) l_0c + 1));
+}
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_platform_id *
+ dvb_platform_id_first(struct dvb_linkage_data_0b *d)
+{
+ if (d->platform_id_data_length == 0)
+ return NULL;
+
+ return (struct dvb_platform_id *) ((uint8_t *) d + sizeof(struct dvb_linkage_data_0b));
+}
+
+static inline struct dvb_platform_id *
+ dvb_platform_id_next(struct dvb_linkage_data_0b *d,
+ struct dvb_platform_id *pos)
+{
+ uint8_t *end = (uint8_t *) d + d->platform_id_data_length;
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_platform_id) +
+ pos->platform_name_loop_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_platform_id *) next;
+}
+
+static inline struct dvb_platform_name *
+ dvb_platform_name_first(struct dvb_platform_id *p)
+{
+ if (p->platform_name_loop_length == 0)
+ return NULL;
+
+ return (struct dvb_platform_name *) ((uint8_t *) p + sizeof(struct dvb_platform_id));
+}
+
+static inline struct dvb_platform_name *
+ dvb_platform_name_next(struct dvb_platform_id *p,
+ struct dvb_platform_name *pos)
+{
+ uint8_t *end = (uint8_t *) p + p->platform_name_loop_length;
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_platform_name) +
+ pos->platform_name_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_platform_name *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/local_time_offset_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/local_time_offset_descriptor.h
new file mode 100644
index 0000000..94932ff
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/local_time_offset_descriptor.h
@@ -0,0 +1,127 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_LOCAL_TIME_OFFSET_DESCRIPTOR
+#define _UCSI_DVB_LOCAL_TIME_OFFSET_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+#include <libucsi/dvb/types.h>
+
+/**
+ * dvb_local_time_offset_descriptor parameter.
+ */
+struct dvb_local_time_offset_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_local_time_offset offsets[] */
+} __ucsi_packed;
+
+/**
+ * Entry in the offsets field of dvb_local_time_offset_descriptor.
+ */
+struct dvb_local_time_offset {
+ iso639country_t country_code;
+ EBIT3(uint8_t country_region_id : 6; ,
+ uint8_t reserved : 1; ,
+ uint8_t local_time_offset_polarity : 1; )
+ dvbhhmm_t local_time_offset;
+ dvbdate_t time_of_change;
+ dvbhhmm_t next_time_offset;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_local_time_offset_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_local_time_offset_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_local_time_offset_descriptor*
+ dvb_local_time_offset_descriptor_codec(struct descriptor* d)
+{
+ uint32_t len = d->len;
+ uint32_t pos = 0;
+
+ if (len % sizeof(struct dvb_local_time_offset))
+ return NULL;
+
+ while(pos < len) {
+ pos += sizeof(struct dvb_local_time_offset);
+ }
+
+ return (struct dvb_local_time_offset_descriptor*) d;
+}
+
+/**
+ * Iterator for the offsets field of a dvb_local_time_offset_descriptor.
+ *
+ * @param d dvb_local_time_offset_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_local_time_offset.
+ */
+#define dvb_local_time_offset_descriptor_offsets_for_each(d, pos) \
+ for ((pos) = dvb_local_time_offset_descriptor_offsets_first(d); \
+ (pos); \
+ (pos) = dvb_local_time_offset_descriptor_offsets_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_local_time_offset*
+ dvb_local_time_offset_descriptor_offsets_first(struct dvb_local_time_offset_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_local_time_offset *)
+ ((uint8_t*) d + sizeof(struct dvb_local_time_offset_descriptor));
+}
+
+static inline struct dvb_local_time_offset*
+ dvb_local_time_offset_descriptor_offsets_next(struct dvb_local_time_offset_descriptor *d,
+ struct dvb_local_time_offset *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_local_time_offset);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_local_time_offset *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h
new file mode 100644
index 0000000..d5cf435
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/mhp_data_broadcast_id_descriptor.h
@@ -0,0 +1,110 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_MHP_DATA_BROADCAST_ID_DESCRIPTOR
+#define _UCSI_DVB_MHP_DATA_BROADCAST_ID_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#ifndef _UCSI_DVB_DATA_BROADCAST_ID_DESCRIPTOR
+#error Must include dvb/data_broadcast_id_descriptor.h first
+#endif
+
+/**
+ * Broadcast IDs for MHP.
+ */
+enum {
+ DVB_BROADCAST_ID_MHP_OBJECT_CAROUSEL = 0x00f0,
+ DVB_BROADCAST_ID_MHP_MPE = 0x00f1
+};
+
+/**
+ * dvb_mhp_data_broadcast_id_descriptor structure.
+ */
+struct dvb_mhp_data_broadcast_id_descriptor {
+ struct dvb_data_broadcast_id_descriptor d;
+ /* uint16_t application_type[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_mhp_data_broadcast_id_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_mhp_data_broadcast_id_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_mhp_data_broadcast_id_descriptor*
+ dvb_mhp_data_broadcast_id_descriptor_codec(struct dvb_data_broadcast_id_descriptor* d)
+{
+ uint8_t * buf;
+ int len;
+ int pos = 0;
+ struct dvb_mhp_data_broadcast_id_descriptor *res =
+ (struct dvb_mhp_data_broadcast_id_descriptor *) d;
+
+ if ((res->d.data_broadcast_id < 0xf0) || (res->d.data_broadcast_id > 0xfe))
+ return NULL;
+
+ buf = dvb_data_broadcast_id_descriptor_id_selector_byte(d);
+ len = dvb_data_broadcast_id_descriptor_id_selector_byte_length(d);
+
+ if (len % 2)
+ return NULL;
+
+ while(pos < len) {
+ bswap16(buf+pos);
+ pos+=2;
+ }
+
+ return res;
+}
+
+/**
+ * Accessor for the application_type field of a dvb_mhp_data_broadcast_id_descriptor.
+ *
+ * @param d dvb_mhp_data_broadcast_id_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint16_t *
+ dvb_mhp_data_broadcast_id_descriptor_id_application_type(struct dvb_mhp_data_broadcast_id_descriptor *d)
+{
+ return (uint16_t *) dvb_data_broadcast_id_descriptor_id_selector_byte((struct dvb_data_broadcast_id_descriptor*) d);
+}
+
+/**
+ * Determine the number of entries in the application_type field of a dvb_mhp_data_broadcast_id_descriptor.
+ *
+ * @param d dvb_data_broadcast_id_descriptor pointer.
+ * @return Length of the field in bytes.
+ */
+static inline int
+ dvb_mhp_data_broadcast_id_descriptor_id_application_type_count(struct dvb_mhp_data_broadcast_id_descriptor *d)
+{
+ return dvb_data_broadcast_id_descriptor_id_selector_byte_length((struct dvb_data_broadcast_id_descriptor*) d) >> 1;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/mosaic_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/mosaic_descriptor.h
new file mode 100644
index 0000000..28838de
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/mosaic_descriptor.h
@@ -0,0 +1,324 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_MOSAIC_DESCRIPTOR
+#define _UCSI_DVB_MOSAIC_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_mosaic_descriptor structure.
+ */
+struct dvb_mosaic_descriptor {
+ struct descriptor d;
+
+ EBIT4(uint8_t mosaic_entry_point : 1; ,
+ uint8_t number_of_horiz_elementary_cells: 3; ,
+ uint8_t reserved : 1; ,
+ uint8_t number_of_vert_elementary_cells : 3; )
+ /* struct dvb_mosaic_info infos[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the infos field of a dvb_mosaic_descriptor.
+ */
+struct dvb_mosaic_info {
+ EBIT3(uint16_t logical_cell_id : 6; ,
+ uint16_t reserved : 7; ,
+ uint16_t logical_cell_presentation_info : 3; )
+ uint8_t elementary_cell_field_length;
+ /* struct dvb_mosaic_elementary_cell_field fields[] */
+ /* struct dvb_mosaic_info_part2 part2 */
+ /* struct dvb_mosaic_linkage linkage */
+} __ucsi_packed;
+
+/**
+ * An entry in the fields field of a dvb_mosaic_info.
+ */
+struct dvb_mosaic_elementary_cell_field {
+ EBIT2(uint8_t reserved : 2; ,
+ uint8_t elementary_cell_id : 6; )
+} __ucsi_packed;
+
+/**
+ * Part2 of dvb_mosaic_info, following the variable length fields field.
+ */
+struct dvb_mosaic_info_part2 {
+ uint8_t cell_linkage_info;
+} __ucsi_packed;
+
+struct dvb_mosaic_linkage_01 {
+ uint16_t bouquet_id;
+} __ucsi_packed;
+
+struct dvb_mosaic_linkage_02 {
+ uint16_t original_network_id;
+ uint16_t transport_stream_id;
+ uint16_t service_id;
+} __ucsi_packed;
+
+struct dvb_mosaic_linkage_03 {
+ uint16_t original_network_id;
+ uint16_t transport_stream_id;
+ uint16_t service_id;
+} __ucsi_packed;
+
+struct dvb_mosaic_linkage_04 {
+ uint16_t original_network_id;
+ uint16_t transport_stream_id;
+ uint16_t service_id;
+ uint16_t event_id;
+} __ucsi_packed;
+
+/**
+ * Structure describing the linkage field of a dvb_mosaic_info
+ */
+struct dvb_mosaic_linkage {
+ union {
+ struct dvb_mosaic_linkage_01 linkage_01;
+ struct dvb_mosaic_linkage_02 linkage_02;
+ struct dvb_mosaic_linkage_03 linkage_03;
+ struct dvb_mosaic_linkage_04 linkage_04;
+ } u;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_mosaic_descriptor.
+ *
+ * @param d Pointer to a generic descriptor structure.
+ */
+static inline struct dvb_mosaic_descriptor*
+ dvb_mosaic_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+ struct dvb_mosaic_descriptor * p =
+ (struct dvb_mosaic_descriptor *) d;
+
+ pos += (sizeof(struct dvb_mosaic_descriptor) - 2);
+
+ if (pos > len)
+ return NULL;
+
+ while(pos < len) {
+ struct dvb_mosaic_info *e =
+ (struct dvb_mosaic_info*) (buf+pos);
+ struct dvb_mosaic_info_part2 *e2;
+ struct dvb_mosaic_linkage *linkage;
+
+ if ((pos + sizeof(struct dvb_mosaic_info)) > len)
+ return NULL;
+
+ bswap16(buf + pos);
+
+ pos += sizeof(struct dvb_mosaic_info) +
+ e->elementary_cell_field_length;
+
+ if (pos > len)
+ return NULL;
+
+ e2 = (struct dvb_mosaic_info_part2*) (buf+pos);
+
+ pos += sizeof(struct dvb_mosaic_info_part2);
+
+ if (pos > len)
+ return NULL;
+
+ linkage = (struct dvb_mosaic_linkage*) (buf+pos);
+
+ switch(e2->cell_linkage_info) {
+ case 0x01:
+ if ((pos + sizeof(struct dvb_mosaic_linkage_01)) > len)
+ return NULL;
+ bswap16(buf+pos);
+ pos += sizeof(struct dvb_mosaic_linkage_01);
+ break;
+
+ case 0x02:
+ if ((pos + sizeof(struct dvb_mosaic_linkage_02)) > len)
+ return NULL;
+ bswap16(buf+pos);
+ bswap16(buf+pos+2);
+ bswap16(buf+pos+4);
+ pos += sizeof(struct dvb_mosaic_linkage_02);
+ break;
+
+ case 0x03:
+ if ((pos + sizeof(struct dvb_mosaic_linkage_03)) > len)
+ return NULL;
+ bswap16(buf+pos);
+ bswap16(buf+pos+2);
+ bswap16(buf+pos+4);
+ pos += sizeof(struct dvb_mosaic_linkage_03);
+ break;
+
+ case 0x04:
+ if ((pos + sizeof(struct dvb_mosaic_linkage_04)) > len)
+ return NULL;
+ bswap16(buf+pos);
+ bswap16(buf+pos+2);
+ bswap16(buf+pos+4);
+ bswap16(buf+pos+6);
+ pos += sizeof(struct dvb_mosaic_linkage_04);
+ break;
+ }
+ }
+
+ return p;
+}
+
+/**
+ * Iterator over the infos field of a dvb_mosaic_descriptor.
+ *
+ * @param d dvb_mosaic_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_mosaic_info.
+ */
+#define dvb_mosaic_descriptor_infos_for_each(d, pos) \
+ for ((pos) = dvb_mosaic_descriptor_infos_first(d); \
+ (pos); \
+ (pos) = dvb_mosaic_descriptor_infos_next(d, pos))
+
+/**
+ * Iterator over the fields field of a dvb_mosaic_info.
+ *
+ * @param info dvb_mosaic_info pointer.
+ * @param pos Variable containing a pointer to the current dvb_mosaic_elementary_cell_field.
+ */
+#define dvb_mosaic_info_fields_for_each(info, pos) \
+ for ((pos) = dvb_mosaic_info_fields_first(info); \
+ (pos); \
+ (pos) = dvb_mosaic_info_fields_next(info, pos))
+
+/**
+ * Accessor for the second part of the dvb_mosaic_info structure.
+ *
+ * @param entry dvb_mosaic_info pointer.
+ * @return dvb_mosaic_info_part2 pointer.
+ */
+static inline struct dvb_mosaic_info_part2*
+ dvb_mosaic_info_part2(struct dvb_mosaic_info* entry)
+{
+ return (struct dvb_mosaic_info_part2*)
+ ((uint8_t*) entry + sizeof(struct dvb_mosaic_info) +
+ entry->elementary_cell_field_length);
+}
+
+/**
+ * Accessor for the linkage field a dvb_mosaic_info structure.
+ *
+ * @param entry dvb_mosaic_info_part2 pointer.
+ * @return dvb_mosaic_linkage pointer, or NULL on error.
+ */
+static inline struct dvb_mosaic_linkage*
+ dvb_mosaic_linkage(struct dvb_mosaic_info_part2* entry)
+{
+ if ((entry->cell_linkage_info != 0x01) &&
+ (entry->cell_linkage_info != 0x02) &&
+ (entry->cell_linkage_info != 0x03) &&
+ (entry->cell_linkage_info != 0x04))
+ return NULL;
+
+ return (struct dvb_mosaic_linkage*)
+ ((uint8_t*) entry + sizeof(struct dvb_mosaic_info_part2));
+}
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_mosaic_info*
+ dvb_mosaic_descriptor_infos_first(struct dvb_mosaic_descriptor *d)
+{
+ if (d->d.len == 1)
+ return NULL;
+
+ return (struct dvb_mosaic_info *)
+ ((uint8_t*) d + sizeof(struct dvb_mosaic_descriptor));
+}
+
+static inline struct dvb_mosaic_info*
+ dvb_mosaic_descriptor_infos_next(struct dvb_mosaic_descriptor *d,
+ struct dvb_mosaic_info *pos)
+{
+ struct dvb_mosaic_info_part2* part2 = dvb_mosaic_info_part2(pos);
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_mosaic_info) +
+ pos->elementary_cell_field_length +
+ sizeof(struct dvb_mosaic_info_part2);
+
+ if (part2->cell_linkage_info == 0x01)
+ next += sizeof(struct dvb_mosaic_linkage_01);
+ else if (part2->cell_linkage_info == 0x02)
+ next += sizeof(struct dvb_mosaic_linkage_02);
+ else if (part2->cell_linkage_info == 0x03)
+ next += sizeof(struct dvb_mosaic_linkage_03);
+ else if (part2->cell_linkage_info == 0x04)
+ next += sizeof(struct dvb_mosaic_linkage_04);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_mosaic_info *) next;
+}
+
+static inline struct dvb_mosaic_elementary_cell_field*
+ dvb_mosaic_info_fields_first(struct dvb_mosaic_info *d)
+{
+ if (d->elementary_cell_field_length == 0)
+ return NULL;
+
+ return (struct dvb_mosaic_elementary_cell_field*)
+ ((uint8_t*) d + sizeof(struct dvb_mosaic_info));
+}
+
+static inline struct dvb_mosaic_elementary_cell_field*
+ dvb_mosaic_info_fields_next(struct dvb_mosaic_info *d,
+ struct dvb_mosaic_elementary_cell_field* pos)
+{
+ uint8_t *end = (uint8_t*) d + sizeof(struct dvb_mosaic_info) +
+ d->elementary_cell_field_length;
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_mosaic_elementary_cell_field);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_mosaic_elementary_cell_field *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h
new file mode 100644
index 0000000..0d8deb1
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_bouquet_name_descriptor.h
@@ -0,0 +1,145 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_MULTILINGUAL_BOUQUET_NAME_DESCRIPTOR
+#define _UCSI_DVB_MULTILINGUAL_BOUQUET_NAME_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_multilingual_bouquet_name_descriptor structure.
+ */
+struct dvb_multilingual_bouquet_name_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_multilingual_bouquet_name names[]*/
+} __ucsi_packed;
+
+/**
+ * An entry in the names field of a dvb_multilingual_bouquet_name_descriptor.
+ */
+struct dvb_multilingual_bouquet_name {
+ iso639lang_t language_code;
+ uint8_t bouquet_name_length;
+ /* uint8_t name[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_multilingual_bouquet_name_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_multilingual_bouquet_name_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_multilingual_bouquet_name_descriptor*
+ dvb_multilingual_bouquet_name_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+
+ while(pos < len) {
+ struct dvb_multilingual_bouquet_name *e =
+ (struct dvb_multilingual_bouquet_name*) (buf+pos);
+
+ pos += sizeof(struct dvb_multilingual_bouquet_name);
+
+ if (pos > len)
+ return NULL;
+
+ pos += e->bouquet_name_length;
+
+ if (pos > len)
+ return NULL;
+ }
+
+ return (struct dvb_multilingual_bouquet_name_descriptor*) d;
+}
+
+/**
+ * Iterator for entries in the names field of a dvb_multilingual_bouquet_name_descriptor.
+ *
+ * @param d dvb_multilingual_bouquet_name_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_multilingual_bouquet_name.
+ */
+#define dvb_multilingual_bouquet_name_descriptor_names_for_each(d, pos) \
+ for ((pos) = dvb_multilingual_bouquet_name_descriptor_names_first(d); \
+ (pos); \
+ (pos) = dvb_multilingual_bouquet_name_descriptor_names_next(d, pos))
+
+/**
+ * Accessor for the name field of a dvb_multilingual_bouquet_name.
+ *
+ * @param e dvb_multilingual_bouquet_name pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_multilingual_bouquet_name_name(struct dvb_multilingual_bouquet_name *e)
+{
+ return (uint8_t *) e + sizeof(struct dvb_multilingual_bouquet_name);
+}
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_multilingual_bouquet_name*
+ dvb_multilingual_bouquet_name_descriptor_names_first(struct dvb_multilingual_bouquet_name_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_multilingual_bouquet_name *)
+ ((uint8_t*) d + sizeof(struct dvb_multilingual_bouquet_name_descriptor));
+}
+
+static inline struct dvb_multilingual_bouquet_name*
+ dvb_multilingual_bouquet_name_descriptor_names_next(struct dvb_multilingual_bouquet_name_descriptor *d,
+ struct dvb_multilingual_bouquet_name *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_multilingual_bouquet_name) +
+ pos->bouquet_name_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_multilingual_bouquet_name *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_component_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_component_descriptor.h
new file mode 100644
index 0000000..ab156af
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_component_descriptor.h
@@ -0,0 +1,149 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_MULTILINGUAL_COMPONENT_DESCRIPTOR
+#define _UCSI_DVB_MULTILINGUAL_COMPONENT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_multilingual_component_descriptor structure.
+ */
+struct dvb_multilingual_component_descriptor {
+ struct descriptor d;
+
+ uint8_t component_tag;
+ /* struct dvb_multilingual_component components[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the components field of a dvb_multilingual_component_descriptor.
+ */
+struct dvb_multilingual_component {
+ iso639lang_t language_code;
+ uint8_t text_description_length;
+ /* uint8_t text_char[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_multilingual_component_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_multilingual_component_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_multilingual_component_descriptor*
+ dvb_multilingual_component_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t pos = sizeof(struct dvb_multilingual_component_descriptor) - 2;
+ uint32_t len = d->len;
+
+ if (pos > len)
+ return NULL;
+
+ while(pos < len) {
+ struct dvb_multilingual_component *e =
+ (struct dvb_multilingual_component*) (buf+pos);
+
+ pos += sizeof(struct dvb_multilingual_component);
+
+ if (pos > len)
+ return NULL;
+
+ pos += e->text_description_length;
+
+ if (pos > len)
+ return NULL;
+ }
+
+ return (struct dvb_multilingual_component_descriptor*) d;
+}
+
+/**
+ * Iterator for entries in the components field of a dvb_multilingual_component_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_multilingual_component.
+ */
+#define dvb_multilingual_component_descriptor_components_for_each(d, pos) \
+ for ((pos) = dvb_multilingual_component_descriptor_components_first(d); \
+ (pos); \
+ (pos) = dvb_multilingual_component_descriptor_components_next(d, pos))
+
+/**
+ * Accessor for the text_char field in a dvb_multilingual_component.
+ *
+ * @param e dvb_multilingual_component pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_multilingual_component_text_char(struct dvb_multilingual_component *e)
+{
+ return (uint8_t *) e + sizeof(struct dvb_multilingual_component);
+}
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_multilingual_component*
+ dvb_multilingual_component_descriptor_components_first(struct dvb_multilingual_component_descriptor *d)
+{
+ if (d->d.len == 1)
+ return NULL;
+
+ return (struct dvb_multilingual_component *)
+ ((uint8_t*) d + sizeof(struct dvb_multilingual_component_descriptor));
+}
+
+static inline struct dvb_multilingual_component*
+ dvb_multilingual_component_descriptor_components_next(struct dvb_multilingual_component_descriptor *d,
+ struct dvb_multilingual_component *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_multilingual_component) +
+ pos->text_description_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_multilingual_component *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_network_name_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_network_name_descriptor.h
new file mode 100644
index 0000000..1a7b8c4
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_network_name_descriptor.h
@@ -0,0 +1,145 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_MULTILINGUAL_NETWORK_NAME_DESCRIPTOR
+#define _UCSI_DVB_MULTILINGUAL_NETWORK_NAME_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_multilingual_network_name_descriptor structure.
+ */
+struct dvb_multilingual_network_name_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_multilingual_network_name names[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the names field of a dvb_multilingual_network_name_descriptor.
+ */
+struct dvb_multilingual_network_name {
+ iso639lang_t language_code;
+ uint8_t network_name_length;
+ /* uint8_t name[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_multilingual_network_name_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_multilingual_network_name_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_multilingual_network_name_descriptor*
+ dvb_multilingual_network_name_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+
+ while(pos < len) {
+ struct dvb_multilingual_network_name *e =
+ (struct dvb_multilingual_network_name*) (buf + pos);
+
+ pos += sizeof(struct dvb_multilingual_network_name);
+
+ if (pos > len)
+ return NULL;
+
+ pos += e->network_name_length;
+
+ if (pos > len)
+ return NULL;
+ }
+
+ return (struct dvb_multilingual_network_name_descriptor*) d;
+}
+
+/**
+ * Iterator for entries in the names field of a dvb_multilingual_network_name_descriptor.
+ *
+ * @param d dvb_multilingual_network_name_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_multilingual_network_name.
+ */
+#define dvb_multilingual_network_name_descriptor_names_for_each(d, pos) \
+ for ((pos) = dvb_multilingual_network_name_descriptor_names_first(d); \
+ (pos); \
+ (pos) = dvb_multilingual_network_name_descriptor_names_next(d, pos))
+
+/**
+ * Accessor for the name field of a dvb_multilingual_network_name.
+ *
+ * @param e dvb_multilingual_network_name pointer.
+ * @return Pointer to the name field.
+ */
+static inline uint8_t *
+ dvb_multilingual_network_name_name(struct dvb_multilingual_network_name *e)
+{
+ return (uint8_t *) e + sizeof(struct dvb_multilingual_network_name);
+}
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_multilingual_network_name*
+ dvb_multilingual_network_name_descriptor_names_first(struct dvb_multilingual_network_name_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_multilingual_network_name *)
+ ((uint8_t*) d + sizeof(struct dvb_multilingual_network_name_descriptor));
+}
+
+static inline struct dvb_multilingual_network_name*
+ dvb_multilingual_network_name_descriptor_names_next(struct dvb_multilingual_network_name_descriptor *d,
+ struct dvb_multilingual_network_name *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos +
+ sizeof(struct dvb_multilingual_network_name) +
+ pos->network_name_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_multilingual_network_name *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_service_name_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_service_name_descriptor.h
new file mode 100644
index 0000000..31bb9c3
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/multilingual_service_name_descriptor.h
@@ -0,0 +1,197 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_MULTILINGUAL_SERVICE_NAME_DESCRIPTOR
+#define _UCSI_DVB_MULTILINGUAL_SERVICE_NAME_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_multilingual_service_name_descriptor structure.
+ */
+struct dvb_multilingual_service_name_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_multilingual_service_name names[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the service_names field of a dvb_multilingual_service_name_descriptor.
+ */
+struct dvb_multilingual_service_name {
+ iso639lang_t language_code;
+ uint8_t service_provider_name_length;
+ /* uint8_t service_provider_name[] */
+ /* struct dvb_multilingual_service_name_part2 part2 */
+} __ucsi_packed;
+
+/**
+ * Second part of a dvb_multilingual_service_name following the variable length
+ * service_provider_name.
+ */
+struct dvb_multilingual_service_name_part2 {
+ uint8_t service_name_length;
+ /* uint8_t service_name[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_multilingual_service_name_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_multilingual_service_name_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_multilingual_service_name_descriptor*
+ dvb_multilingual_service_name_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+
+ while(pos < len) {
+ struct dvb_multilingual_service_name *e =
+ (struct dvb_multilingual_service_name*) (buf+pos);
+ struct dvb_multilingual_service_name_part2 *e2;
+
+ pos += sizeof(struct dvb_multilingual_service_name);
+
+ if (pos > len)
+ return NULL;
+
+ pos += e->service_provider_name_length;
+
+ if (pos > len)
+ return NULL;
+
+ e2 = (struct dvb_multilingual_service_name_part2*) (buf+pos);
+
+ pos += sizeof(struct dvb_multilingual_service_name_part2);
+
+ if (pos > len)
+ return NULL;
+
+ pos += e2->service_name_length;
+
+ if (pos > len)
+ return NULL;
+ }
+
+ return (struct dvb_multilingual_service_name_descriptor*) d;
+}
+
+/**
+ * Iterator for entries in the service_name field of a dvb_multilingual_service_name_descriptor.
+ *
+ * @param d dvb_multilingual_service_name_descriptor pointer,
+ * @param pos Variable containing pointer to the current dvb_multilingual_service_name.
+ */
+#define dvb_multilingual_service_name_descriptor_names_for_each(d, pos) \
+ for ((pos) = dvb_multilingual_service_name_descriptor_names_first(d); \
+ (pos); \
+ (pos) = dvb_multilingual_service_name_descriptor_names_next(d, pos))
+
+/**
+ * Accessor for the service_provider_name field of a dvb_multilingual_service_name.
+ *
+ * @param e dvb_multilingual_service_name pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_multilingual_service_name_service_provider_name(struct dvb_multilingual_service_name *e)
+{
+ return (uint8_t *) e + sizeof(struct dvb_multilingual_service_name);
+}
+
+/**
+ * Accessor for the dvb_multilingual_service_name_part2 - second part of a
+ * dvb_multilingual_service_name following the service_name field.
+ *
+ * @param e dvb_multilingual_service_name Pointer.
+ * @return dvb_multilingual_service_name_part2 pointer.
+ */
+static inline struct dvb_multilingual_service_name_part2 *
+ dvb_multilingual_service_name_part2(struct dvb_multilingual_service_name *e)
+{
+ return (struct dvb_multilingual_service_name_part2 *)
+ ((uint8_t *) e + sizeof(struct dvb_multilingual_service_name) +
+ e->service_provider_name_length);
+}
+
+/**
+ * Accessor for the service_name field of a dvb_multilingual_service_name_part2.
+ *
+ * @param e dvb_multilingual_service_name_part2 pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_multilingual_service_name_service_name(struct dvb_multilingual_service_name_part2 *e)
+{
+ return (uint8_t *) e + sizeof(struct dvb_multilingual_service_name_part2);
+}
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_multilingual_service_name*
+ dvb_multilingual_service_name_descriptor_names_first(struct dvb_multilingual_service_name_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_multilingual_service_name *)
+ ((uint8_t*) d + sizeof(struct dvb_multilingual_service_name_descriptor));
+}
+
+static inline struct dvb_multilingual_service_name*
+ dvb_multilingual_service_name_descriptor_names_next(struct dvb_multilingual_service_name_descriptor *d,
+ struct dvb_multilingual_service_name *pos)
+{
+ struct dvb_multilingual_service_name_part2 * part2 =
+ dvb_multilingual_service_name_part2(pos);
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) part2+
+ sizeof(struct dvb_multilingual_service_name_part2) +
+ part2->service_name_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_multilingual_service_name *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/network_name_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/network_name_descriptor.h
new file mode 100644
index 0000000..0754597
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/network_name_descriptor.h
@@ -0,0 +1,82 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_NETWORK_NAME_DESCRIPTOR
+#define _UCSI_DVB_NETWORK_NAME_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_network_name_descriptor structure.
+ */
+struct dvb_network_name_descriptor {
+ struct descriptor d;
+
+ /* char name[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_network_name_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_network_name_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_network_name_descriptor*
+ dvb_network_name_descriptor_codec(struct descriptor* d)
+{
+ return (struct dvb_network_name_descriptor*) d;
+}
+
+/**
+ * Accessor for the name field in a dvb_network_name_descriptor.
+ *
+ * @param d dvb_network_name_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_network_name_descriptor_name(struct dvb_network_name_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_network_name_descriptor);
+}
+
+/**
+ * Calculate the length of the name field in a dvb_network_name_descriptor.
+ *
+ * @param d dvb_network_name_descriptor pointer.
+ * @return Length of the field in bytes.
+ */
+static inline int
+ dvb_network_name_descriptor_name_length(struct dvb_network_name_descriptor *d)
+{
+ return d->d.len;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/nit_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/nit_section.c
new file mode 100644
index 0000000..d931926
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/nit_section.c
@@ -0,0 +1,79 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/nit_section.h>
+
+struct dvb_nit_section *dvb_nit_section_codec(struct section_ext * ext)
+{
+ uint8_t * buf = (uint8_t *) ext;
+ struct dvb_nit_section * ret = (struct dvb_nit_section *) ext;
+ unsigned int pos = sizeof(struct section_ext);
+ unsigned int len = section_ext_length(ext);
+
+ if (len < sizeof(struct dvb_nit_section))
+ return NULL;
+
+ bswap16(buf + pos);
+ pos += 2;
+
+ if ((pos + ret->network_descriptors_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, ret->network_descriptors_length))
+ return NULL;
+
+ pos += ret->network_descriptors_length;
+
+ if ((pos + sizeof(struct dvb_nit_section_part2)) > len)
+ return NULL;
+
+ bswap16(buf + pos);
+ pos += 2;
+
+ while (pos < len) {
+ struct dvb_nit_transport *transport =
+ (struct dvb_nit_transport *)(buf + pos);
+
+ if ((pos + sizeof(struct dvb_nit_transport)) > len)
+ return NULL;
+
+ bswap16(buf + pos);
+ bswap16(buf + pos + 2);
+ bswap16(buf + pos + 4);
+
+ pos += sizeof(struct dvb_nit_transport);
+
+ if ((pos + transport->transport_descriptors_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos,
+ transport->transport_descriptors_length))
+ return NULL;
+
+ pos += transport->transport_descriptors_length;
+ }
+
+ if (pos != len)
+ return NULL;
+
+ return ret;
+}
+
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/nit_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/nit_section.h
new file mode 100644
index 0000000..77ab1a0
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/nit_section.h
@@ -0,0 +1,207 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_NIT_SECTION_H
+#define _UCSI_DVB_NIT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * dvb_nit_section structure.
+ */
+struct dvb_nit_section {
+ struct section_ext head;
+
+ EBIT2(uint16_t reserved_1 : 4; ,
+ uint16_t network_descriptors_length :12; );
+ /* struct descriptor descriptors[] */
+ /* struct dvb_nit_section_part2 part2 */
+};
+
+/**
+ * Second part of a dvb_nit_section, following the variable length descriptors field.
+ */
+struct dvb_nit_section_part2 {
+ EBIT2(uint16_t reserved_2 : 4; ,
+ uint16_t transport_stream_loop_length :12; );
+ /* struct dvb_nit_transport transports[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the transports field of a dvb_nit_section_part2
+ */
+struct dvb_nit_transport {
+ uint16_t transport_stream_id;
+ uint16_t original_network_id;
+ EBIT2(uint16_t reserved : 4; ,
+ uint16_t transport_descriptors_length :12; );
+ /* struct descriptor descriptors[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_nit_section.
+ *
+ * @param section Generic section_ext pointer.
+ * @return dvb_nit_section pointer, or NULL on error.
+ */
+struct dvb_nit_section * dvb_nit_section_codec(struct section_ext *section);
+
+/**
+ * Accessor for the network_id field of a NIT.
+ *
+ * @param nit NIT pointer.
+ * @return The network_id.
+ */
+static inline uint16_t dvb_nit_section_network_id(struct dvb_nit_section *nit)
+{
+ return nit->head.table_id_ext;
+}
+
+/**
+ * Iterator over the descriptors field in a dvb_nit_section.
+ *
+ * @param nit dvb_nit_section pointer.
+ * @param pos Variable containing a pointer to the current descriptor.
+ */
+#define dvb_nit_section_descriptors_for_each(nit, pos) \
+ for ((pos) = dvb_nit_section_descriptors_first(nit); \
+ (pos); \
+ (pos) = dvb_nit_section_descriptors_next(nit, pos))
+
+/**
+ * Accessor for a pointer to the dvb_nit_section_part2 structure.
+ *
+ * @param nit dvb_nit_section pointer.
+ * @return dvb_nit_section_part2 pointer.
+ */
+static inline struct dvb_nit_section_part2 *dvb_nit_section_part2(struct dvb_nit_section * nit)
+{
+ return (struct dvb_nit_section_part2 *)
+ ((uint8_t*) nit + sizeof(struct dvb_nit_section) +
+ nit->network_descriptors_length);
+}
+
+/**
+ * Iterator over the transports field in a dvb_nit_section_part2.
+ *
+ * @param nit dvb_nit_section pointer.
+ * @param part2 dvb_nit_section_part2 pointer.
+ * @param pos Pointer to the current dvb_nit_transport.
+ */
+#define dvb_nit_section_transports_for_each(nit, part2, pos) \
+ for ((pos) = dvb_nit_section_transports_first(part2); \
+ (pos); \
+ (pos) = dvb_nit_section_transports_next(part2, pos))
+
+/**
+ * Iterator over the descriptors field in a dvb_nit_transport.
+ *
+ * @param transport dvb_nit_transport pointer.
+ * @param pos Pointer to the current descriptor.
+ */
+#define dvb_nit_transport_descriptors_for_each(transport, pos) \
+ for ((pos) = dvb_nit_transport_descriptors_first(transport); \
+ (pos); \
+ (pos) = dvb_nit_transport_descriptors_next(transport, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct descriptor *
+ dvb_nit_section_descriptors_first(struct dvb_nit_section * nit)
+{
+ if (nit->network_descriptors_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t *) nit + sizeof(struct dvb_nit_section));
+}
+
+static inline struct descriptor *
+ dvb_nit_section_descriptors_next(struct dvb_nit_section * nit,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) nit + sizeof(struct dvb_nit_section),
+ nit->network_descriptors_length,
+ pos);
+}
+
+static inline struct dvb_nit_transport *
+ dvb_nit_section_transports_first(struct dvb_nit_section_part2 *part2)
+{
+ if (part2->transport_stream_loop_length == 0)
+ return NULL;
+
+ return (struct dvb_nit_transport *)
+ ((uint8_t *)part2 + sizeof(struct dvb_nit_section_part2));
+}
+
+static inline struct dvb_nit_transport *
+ dvb_nit_section_transports_next(struct dvb_nit_section_part2 *part2,
+ struct dvb_nit_transport *pos)
+{
+ uint8_t *end = (uint8_t*) part2 + sizeof(struct dvb_nit_section_part2) +
+ part2->transport_stream_loop_length;
+ uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_nit_transport) +
+ pos->transport_descriptors_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_nit_transport *) next;
+}
+
+static inline struct descriptor *
+ dvb_nit_transport_descriptors_first(struct dvb_nit_transport *t)
+{
+ if (t->transport_descriptors_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t*) t + sizeof(struct dvb_nit_transport));
+}
+
+static inline struct descriptor *
+ dvb_nit_transport_descriptors_next(struct dvb_nit_transport *t,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) t + sizeof(struct dvb_nit_transport),
+ t->transport_descriptors_length,
+ pos);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/nvod_reference_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/nvod_reference_descriptor.h
new file mode 100644
index 0000000..6180514
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/nvod_reference_descriptor.h
@@ -0,0 +1,125 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_NVOD_REFERENCE_DESCRIPTOR
+#define _UCSI_DVB_NVOD_REFERENCE_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_nvod_reference_descriptor structure.
+ */
+struct dvb_nvod_reference_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_nvod_reference references[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the references field of a dvb_nvod_reference_descriptor.
+ */
+struct dvb_nvod_reference {
+ uint16_t transport_stream_id;
+ uint16_t original_network_id;
+ uint16_t service_id;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_nvod_reference_descriptor.
+ *
+ * @param d Pointer to a generic descriptor structure pointer.
+ * @return dvb_nvod_reference_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_nvod_reference_descriptor*
+ dvb_nvod_reference_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t len = d->len;
+
+ if (len % sizeof(struct dvb_nvod_reference))
+ return NULL;
+
+ while(pos < len) {
+ bswap16(buf+pos);
+ bswap16(buf+pos+2);
+ bswap16(buf+pos+4);
+ pos += sizeof(struct dvb_nvod_reference);
+ }
+
+ return (struct dvb_nvod_reference_descriptor*) d;
+}
+
+/**
+ * Iterator over the references field in a dvb_nvod_reference_descriptor.
+ *
+ * @param d dvb_nvod_reference_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_nvod_reference.
+ */
+#define dvb_nvod_reference_descriptor_references_for_each(d, pos) \
+ for ((pos) = dvb_nvod_reference_descriptor_references_first(d); \
+ (pos); \
+ (pos) = dvb_nvod_reference_descriptor_references_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_nvod_reference*
+ dvb_nvod_reference_descriptor_references_first(struct dvb_nvod_reference_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_nvod_reference *)
+ ((uint8_t*) d + sizeof(struct dvb_nvod_reference_descriptor));
+}
+
+static inline struct dvb_nvod_reference*
+ dvb_nvod_reference_descriptor_references_next(struct dvb_nvod_reference_descriptor *d,
+ struct dvb_nvod_reference *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_nvod_reference);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_nvod_reference *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/parental_rating_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/parental_rating_descriptor.h
new file mode 100644
index 0000000..9acbcb0
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/parental_rating_descriptor.h
@@ -0,0 +1,135 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_PARENTAL_RATING_DESCRIPTOR
+#define _UCSI_DVB_PARENTAL_RATING_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * Defined values for the rating field.
+ */
+enum {
+ DVB_PARENTAL_RATING_MIN_3YEARS = 0x01,
+ DVB_PARENTAL_RATING_MIN_4YEARS = 0x02,
+ DVB_PARENTAL_RATING_MIN_5YEARS = 0x03,
+ DVB_PARENTAL_RATING_MIN_6YEARS = 0x04,
+ DVB_PARENTAL_RATING_MIN_7YEARS = 0x05,
+ DVB_PARENTAL_RATING_MIN_8YEARS = 0x06,
+ DVB_PARENTAL_RATING_MIN_9YEARS = 0x07,
+ DVB_PARENTAL_RATING_MIN_10YEARS = 0x08,
+ DVB_PARENTAL_RATING_MIN_11YEARS = 0x09,
+ DVB_PARENTAL_RATING_MIN_12YEARS = 0x0a,
+ DVB_PARENTAL_RATING_MIN_13YEARS = 0x0b,
+ DVB_PARENTAL_RATING_MIN_14YEARS = 0x0c,
+ DVB_PARENTAL_RATING_MIN_15YEARS = 0x0d,
+ DVB_PARENTAL_RATING_MIN_16YEARS = 0x0e,
+ DVB_PARENTAL_RATING_MIN_17YEARS = 0x0f
+};
+
+/**
+ * dvb_parental_rating_descriptor structure.
+ */
+struct dvb_parental_rating_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_parental_rating ratings[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the ratings field of a dvb_parental_rating_descriptor.
+ */
+struct dvb_parental_rating {
+ iso639country_t country_code;
+ uint8_t rating;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_parental_rating_descriptor.
+ *
+ * @param d Generic descriptor structure pointer.
+ * @return dvb_parental_rating_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_parental_rating_descriptor*
+ dvb_parental_rating_descriptor_codec(struct descriptor* d)
+{
+ if (d->len % sizeof(struct dvb_parental_rating))
+ return NULL;
+
+ return (struct dvb_parental_rating_descriptor*) d;
+}
+
+/**
+ * Iterator for entries in the ratings field of a dvb_parental_rating_descriptor.
+ *
+ * @param d dvb_parental_rating_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_parental_rating.
+ */
+#define dvb_parental_rating_descriptor_ratings_for_each(d, pos) \
+ for ((pos) = dvb_parental_rating_descriptor_ratings_first(d); \
+ (pos); \
+ (pos) = dvb_parental_rating_descriptor_ratings_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_parental_rating*
+ dvb_parental_rating_descriptor_ratings_first(struct dvb_parental_rating_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_parental_rating *)
+ ((uint8_t*) d + sizeof(struct dvb_parental_rating_descriptor));
+}
+
+static inline struct dvb_parental_rating*
+ dvb_parental_rating_descriptor_ratings_next(struct dvb_parental_rating_descriptor *d,
+ struct dvb_parental_rating *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_parental_rating);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_parental_rating *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/partial_transport_stream_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/partial_transport_stream_descriptor.h
new file mode 100644
index 0000000..c8ba441
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/partial_transport_stream_descriptor.h
@@ -0,0 +1,68 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_PARTIAL_TRANSPORT_STREAM_DESCRIPTOR
+#define _UCSI_DVB_PARTIAL_TRANSPORT_STREAM_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_partial_transport_stream_descriptor structure.
+ */
+struct dvb_partial_transport_stream_descriptor {
+ struct descriptor d;
+
+ EBIT6(uint64_t reserved : 2; ,
+ uint64_t peak_rate :22; ,
+ uint64_t reserved_2 : 2; ,
+ uint64_t minimum_overall_smoothing_rate :22; ,
+ uint64_t reserved_3 : 2; ,
+ uint64_t maximum_overall_smoothing_rate :14; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_partial_transport_stream_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_partial_transport_stream_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_partial_transport_stream_descriptor*
+ dvb_partial_transport_stream_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_partial_transport_stream_descriptor) - 2))
+ return NULL;
+
+ bswap64((uint8_t*) d + 2);
+
+ return (struct dvb_partial_transport_stream_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/pdc_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/pdc_descriptor.h
new file mode 100644
index 0000000..49cc187
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/pdc_descriptor.h
@@ -0,0 +1,64 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_PDC_DESCRIPTOR
+#define _UCSI_DVB_PDC_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_pdc_descriptor structure.
+ */
+struct dvb_pdc_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint32_t reserved : 4; ,
+ uint32_t programme_id_label :20; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_pdc_descriptor.
+ *
+ * @param d Pointer to a generic descriptor structure.
+ * @return dvb_pdc_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_pdc_descriptor*
+ dvb_pdc_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_pdc_descriptor) - 2))
+ return NULL;
+
+ bswap24((uint8_t*) d + 2);
+
+ return (struct dvb_pdc_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/private_data_specifier_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/private_data_specifier_descriptor.h
new file mode 100644
index 0000000..f4cc03c
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/private_data_specifier_descriptor.h
@@ -0,0 +1,63 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_PRIVATE_DATA_SPECIFIER_DESCRIPTOR
+#define _UCSI_DVB_PRIVATE_DATA_SPECIFIER_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_private_data_specifier_descriptor structure.
+ */
+struct dvb_private_data_specifier_descriptor {
+ struct descriptor d;
+
+ uint32_t private_data_specifier;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_private_data_specifier_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_private_data_specifier_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_private_data_specifier_descriptor*
+ dvb_private_data_specifier_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_private_data_specifier_descriptor) - 2))
+ return NULL;
+
+ bswap32((uint8_t*) d + 2);
+
+ return (struct dvb_private_data_specifier_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/related_content_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/related_content_descriptor.h
new file mode 100644
index 0000000..fd6a358
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/related_content_descriptor.h
@@ -0,0 +1,56 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_RELATED_CONTENT_DESCRIPTOR
+#define _UCSI_DVB_RELATED_CONTENT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_related_content_descriptor structure.
+ */
+struct dvb_related_content_descriptor {
+ struct descriptor d;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_related_content_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_related_content_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_related_content_descriptor*
+ dvb_related_content_descriptor_codec(struct descriptor* d)
+{
+ return (struct dvb_related_content_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h
new file mode 100644
index 0000000..b67b0d9
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rar_over_dvb_stream_descriptor.h
@@ -0,0 +1,110 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_RNT_RAR_OVER_DVB_STREAM_DESCRIPTOR
+#define _UCSI_DVB_RNT_RAR_OVER_DVB_STREAM_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_rnt_rar_over_dvb_stream_descriptor structure.
+ */
+struct dvb_rnt_rar_over_dvb_stream_descriptor {
+ struct descriptor d;
+
+ dvbdate_t first_valid_date;
+ dvbdate_t last_valid_date;
+ EBIT3(uint8_t weighting : 6; ,
+ uint8_t complete_flag : 1; ,
+ uint8_t scheduled_flag : 1; )
+ uint16_t transport_stream_id;
+ uint16_t original_network_id;
+ uint16_t service_id;
+ uint8_t component_tag;
+ /* struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info scheduled_info */
+} __ucsi_packed;
+
+/**
+ * The scheduled_info field of a dvb_rnt_rar_over_dvb_stream_descriptor (only appears
+ * if scheduled_flag = 1).
+ */
+struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info {
+ dvbdate_t download_start_time;
+ uint8_t download_period_duration;
+ uint8_t download_cycle_time;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_rnt_rar_over_dvb_stream_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_rnt_rar_over_dvb_stream_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_rnt_rar_over_dvb_stream_descriptor*
+ dvb_rnt_rar_over_dvb_stream_descriptor_codec(struct descriptor* d)
+{
+ uint8_t *buf = (uint8_t*) d;
+ uint32_t len = d->len + 2;
+ struct dvb_rnt_rar_over_dvb_stream_descriptor *ret =
+ (struct dvb_rnt_rar_over_dvb_stream_descriptor *) buf;
+
+ if (len < sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor))
+ return NULL;
+
+ bswap16(buf + 13);
+ bswap16(buf + 15);
+ bswap16(buf + 17);
+
+ if (ret->scheduled_flag == 1) {
+ if (len < (sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor)+
+ sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info)))
+ return NULL;
+ }
+
+ return ret;
+}
+
+/**
+ * Accessor for the scheduled_info field of a dvb_rnt_rar_over_dvb_stream_descriptor.
+ *
+ * @param d dvb_rnt_rar_over_dvb_stream_descriptor pointer.
+ * @return Pointer, or NULL on error.
+ */
+static inline struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info*
+ dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info(struct dvb_rnt_rar_over_dvb_stream_descriptor *d)
+{
+ if (d->scheduled_flag != 1)
+ return NULL;
+ return (struct dvb_rnt_rar_over_dvb_stream_descriptor_scheduled_info*)
+ ((uint8_t*) d + sizeof(struct dvb_rnt_rar_over_dvb_stream_descriptor));
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h
new file mode 100644
index 0000000..cc0ed58
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rar_over_ip_descriptor.h
@@ -0,0 +1,87 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_RNT_RAR_OVER_IP_DESCRIPTOR
+#define _UCSI_DVB_RNT_RAR_OVER_IP_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_rnt_rar_over_ip_descriptor structure.
+ */
+struct dvb_rnt_rar_over_ip_descriptor {
+ struct descriptor d;
+
+ dvbdate_t first_valid_date;
+ dvbdate_t last_valid_date;
+ EBIT3(uint8_t weighting : 6; ,
+ uint8_t complete_flag : 1; ,
+ uint8_t reserved : 1; )
+ uint8_t url_length;
+ /* uint8_t url[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_rnt_rar_over_ip_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_rnt_rar_over_ip_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_rnt_rar_over_ip_descriptor*
+ dvb_rnt_rar_over_ip_descriptor_codec(struct descriptor* d)
+{
+ uint8_t *buf = (uint8_t*) d;
+ uint32_t len = d->len + 2;
+ struct dvb_rnt_rar_over_ip_descriptor *ret =
+ (struct dvb_rnt_rar_over_ip_descriptor *) buf;
+
+ if (len < sizeof(struct dvb_rnt_rar_over_ip_descriptor))
+ return NULL;
+ if (len < (sizeof(struct dvb_rnt_rar_over_ip_descriptor) + buf[13]))
+ return NULL;
+
+ return ret;
+}
+
+/**
+ * Accessor for the url field of a dvb_rnt_rar_over_ip_descriptor.
+ *
+ * @param d dvb_rnt_rar_over_ip_descriptor pointer.
+ * @return Pointer.
+ */
+static inline uint8_t*
+ dvb_rnt_rar_over_ip_descriptor_url(struct dvb_rnt_rar_over_ip_descriptor *d)
+{
+ return (uint8_t*)
+ ((uint8_t*) d + sizeof(struct dvb_rnt_rar_over_ip_descriptor));
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h
new file mode 100644
index 0000000..cb74f75
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/rnt_rnt_scan_descriptor.h
@@ -0,0 +1,125 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_RNT_RNT_SCAN_DESCRIPTOR
+#define _UCSI_DVB_RNT_RNT_SCAN_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_rnt_rnt_scan_descriptor structure.
+ */
+struct dvb_rnt_rnt_scan_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_rnt_rnt_scan_entry entries[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the entries field of a dvb_rnt_rnt_scan_descriptor.
+ */
+struct dvb_rnt_rnt_scan_entry {
+ uint16_t transport_stream_id;
+ uint16_t original_network_id;
+ uint8_t scan_weighting;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_rnt_rnt_scan_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return dvb_rnt_rnt_scan_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_rnt_rnt_scan_descriptor*
+ dvb_rnt_rnt_scan_descriptor_codec(struct descriptor* d)
+{
+ uint8_t *buf = (uint8_t*) d;
+ uint32_t len = d->len +2;
+ uint32_t pos = 2;
+
+ if ((len-2) % sizeof(struct dvb_rnt_rnt_scan_entry))
+ return NULL;
+
+ while(pos < len) {
+ bswap16(buf+pos);
+ bswap16(buf+pos+2);
+ pos += sizeof(struct dvb_rnt_rnt_scan_entry);
+ }
+
+ return (struct dvb_rnt_rnt_scan_descriptor*) d;
+}
+
+/**
+ * Iterator for entries field of a dvb_rnt_rnt_scan_descriptor.
+ *
+ * @param d dvb_rnt_rnt_scan_descriptor pointer.
+ * @param pos Variable holding a pointer to the current dvb_rnt_rnt_scan_entry.
+ */
+#define dvb_rnt_rnt_scan_descriptor_entries_for_each(d, pos) \
+ for ((pos) = dvb_rnt_rnt_scan_descriptor_entries_first(d); \
+ (pos); \
+ (pos) = dvb_rnt_rnt_scan_descriptor_entries_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_rnt_rnt_scan_entry*
+ dvb_rnt_rnt_scan_descriptor_entries_first(struct dvb_rnt_rnt_scan_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_rnt_rnt_scan_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_rnt_rnt_scan_descriptor));
+}
+
+static inline struct dvb_rnt_rnt_scan_entry*
+ dvb_rnt_rnt_scan_descriptor_entries_next(struct dvb_rnt_rnt_scan_descriptor *d,
+ struct dvb_rnt_rnt_scan_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_rnt_rnt_scan_entry);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_rnt_rnt_scan_entry *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/rst_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/rst_section.c
new file mode 100644
index 0000000..67fa0d3
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/rst_section.c
@@ -0,0 +1,47 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/rst_section.h>
+
+struct dvb_rst_section * dvb_rst_section_codec(struct section *section)
+{
+ uint8_t * buf = (uint8_t *) section;
+ int pos = sizeof(struct section);
+ int len = section_length(section);
+ struct dvb_rst_section * ret = (struct dvb_rst_section *) section;
+
+ while (pos < len) {
+ if ((pos + sizeof(struct dvb_rst_status)) > len)
+ return NULL;
+
+ bswap16(buf + pos);
+ bswap16(buf + pos + 2);
+ bswap16(buf + pos + 4);
+ bswap16(buf + pos + 6);
+
+ pos += sizeof(struct dvb_rst_status);
+ }
+
+ if (pos != len)
+ return NULL;
+
+ return ret;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/rst_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/rst_section.h
new file mode 100644
index 0000000..b4269b8
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/rst_section.h
@@ -0,0 +1,111 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_RST_SECTION_H
+#define _UCSI_DVB_RST_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * dvb_rst_section structure.
+ */
+struct dvb_rst_section {
+ struct section head;
+
+ /* struct dvb_rst_status statuses[] */
+};
+
+/**
+ * An entry in the statuses field of a dvb_rst_section structure.
+ */
+struct dvb_rst_status {
+ uint16_t transport_stream_id;
+ uint16_t original_network_id;
+ uint16_t service_id;
+ uint16_t event_id;
+ EBIT2(uint8_t reserved : 5; ,
+ uint8_t running_status : 3; );
+};
+
+/**
+ * Process a dvb_rst_section.
+ *
+ * @param section Pointer to a generic section strcuture.
+ * @return dvb_rst_section pointer, or NULL on error.
+ */
+struct dvb_rst_section *dvb_rst_section_codec(struct section *section);
+
+/**
+ * Iterator for entries in the statuses field of a dvb_rst_section.
+ *
+ * @param rst dvb_rst_section pointer.
+ * @param pos Variable containing a pointer to the current dvb_rst_status.
+ */
+#define dvb_rst_section_statuses_for_each(rst, pos) \
+ for ((pos) = dvb_rst_section_statuses_first(rst); \
+ (pos); \
+ (pos) = dvb_rst_section_statuses_next(rst, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_rst_status *
+ dvb_rst_section_statuses_first(struct dvb_rst_section *rst)
+{
+ int pos = sizeof(struct dvb_rst_section);
+
+ if (pos >= section_length(&rst->head))
+ return NULL;
+
+ return (struct dvb_rst_status*) ((uint8_t *) rst + pos);
+}
+
+static inline struct dvb_rst_status *
+ dvb_rst_section_statuses_next(struct dvb_rst_section * rst,
+ struct dvb_rst_status * pos)
+{
+ uint8_t *end = (uint8_t*) rst + section_length(&rst->head);
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_rst_status);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_rst_status *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h
new file mode 100644
index 0000000..66c9288
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/s2_satellite_delivery_descriptor.h
@@ -0,0 +1,116 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_S2_SATELLITE_DELIVERY_DESCRIPTOR
+#define _UCSI_DVB_S2_SATELLITE_DELIVERY_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_s2_satellite_delivery_descriptor structure.
+ */
+struct dvb_s2_satellite_delivery_descriptor {
+ struct descriptor d;
+
+ EBIT4(uint8_t scrambling_sequence_selector : 1; ,
+ uint8_t multiple_input_stream : 1; ,
+ uint8_t backwards_compatability : 1; ,
+ uint8_t reserved : 5; )
+ /* uint32_t scrambling_sequence_index if scrambling_sequence_selector = 1 */
+ /* uint8_t input_stream_id if multiple_input_stream = 1 */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_s2_satellite_delivery_descriptor.
+ *
+ * @param d Pointer to a generic descriptor structure.
+ * @return dvb_s2_satellite_delivery_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_s2_satellite_delivery_descriptor*
+ dvb_s2_satellite_delivery_descriptor_codec(struct descriptor* d)
+{
+ struct dvb_s2_satellite_delivery_descriptor *s2 =
+ (struct dvb_s2_satellite_delivery_descriptor*) d;
+
+ if (d->len < (sizeof(struct dvb_s2_satellite_delivery_descriptor) - 2))
+ return NULL;
+
+ int len = sizeof(struct dvb_s2_satellite_delivery_descriptor);
+ if (s2->scrambling_sequence_selector) {
+ len += 3;
+ }
+ if (s2->multiple_input_stream) {
+ len += 1;
+ }
+
+ if (d->len < len)
+ return NULL;
+
+ return s2;
+}
+
+/**
+ * Accessor for the scrambling_sequence_index field of a dvb_s2_satellite_delivery_descriptor.
+ *
+ * @param s2 dvb_s2_satellite_delivery_descriptor pointer.
+ * @return The scrambling_sequence_index.
+ */
+static inline uint32_t dvb_s2_satellite_delivery_descriptor_scrambling_sequence_index(struct dvb_s2_satellite_delivery_descriptor *s2)
+{
+ uint8_t *tmp = (uint8_t*) s2;
+
+ if (s2->scrambling_sequence_selector) {
+ return ((tmp[4] & 0x03) << 16) | (tmp[5] << 8) | tmp[6];
+ }
+ return 0;
+}
+
+/**
+ * Accessor for the input_stream_id field of a dvb_s2_satellite_delivery_descriptor.
+ *
+ * @param s2 dvb_s2_satellite_delivery_descriptor pointer.
+ * @return The input_stream_id.
+ */
+static inline uint8_t dvb_s2_satellite_delivery_descriptor_input_stream_id(struct dvb_s2_satellite_delivery_descriptor *s2)
+{
+ uint8_t *tmp = (uint8_t*) s2;
+
+ if (!s2->multiple_input_stream)
+ return 0;
+
+ int off = 3;
+ if (s2->scrambling_sequence_selector) {
+ off += 3;
+ }
+ return tmp[off];
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/satellite_delivery_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/satellite_delivery_descriptor.h
new file mode 100644
index 0000000..23be76e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/satellite_delivery_descriptor.h
@@ -0,0 +1,73 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SATELLITE_DELIVERY_DESCRIPTOR
+#define _UCSI_DVB_SATELLITE_DELIVERY_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_satellite_delivery_descriptor structure.
+ */
+struct dvb_satellite_delivery_descriptor {
+ struct descriptor d;
+
+ uint32_t frequency; // BCD, units 10kHz
+ uint16_t orbital_position;
+ EBIT5(uint8_t west_east_flag : 1; ,
+ uint8_t polarization : 2; ,
+ uint8_t roll_off : 2; ,
+ uint8_t modulation_system : 1; ,
+ uint8_t modulation_type : 2; )
+ EBIT2(uint32_t symbol_rate : 28; , // BCD, units 100Hz
+ uint32_t fec_inner : 4; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_satellite_delivery_descriptor.
+ *
+ * @param d Pointer to a generic descriptor structure.
+ * @return dvb_satellite_delivery_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_satellite_delivery_descriptor*
+ dvb_satellite_delivery_descriptor_codec(struct descriptor* d)
+{
+ if (d->len < (sizeof(struct dvb_satellite_delivery_descriptor) - 2))
+ return NULL;
+
+ bswap32((uint8_t*) d + 2);
+ bswap16((uint8_t*) d + 6);
+ bswap32((uint8_t*) d + 9);
+
+ return (struct dvb_satellite_delivery_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/scrambling_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/scrambling_descriptor.h
new file mode 100644
index 0000000..4669bc8
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/scrambling_descriptor.h
@@ -0,0 +1,61 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SCRAMBLING_DESCRIPTOR
+#define _UCSI_DVB_SCRAMBLING_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_scrambling_descriptor structure.
+ */
+struct dvb_scrambling_descriptor {
+ struct descriptor d;
+
+ uint8_t scrambling_mode;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_scrambling_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to dvb_scrambling_descriptor, or NULL on error.
+ */
+static inline struct dvb_scrambling_descriptor*
+ dvb_scrambling_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_scrambling_descriptor) - 2))
+ return NULL;
+
+ return (struct dvb_scrambling_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/sdt_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/sdt_section.c
new file mode 100644
index 0000000..bdc8ce1
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/sdt_section.c
@@ -0,0 +1,60 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/sdt_section.h>
+
+struct dvb_sdt_section * dvb_sdt_section_codec(struct section_ext * ext)
+{
+ uint8_t * buf = (uint8_t *) ext;
+ unsigned int pos = sizeof(struct section_ext);
+ unsigned int len = section_ext_length(ext);
+
+ if (len < sizeof(struct dvb_sdt_section))
+ return NULL;
+
+ bswap16(buf + pos);
+ pos += 3;
+
+ while (pos < len) {
+ struct dvb_sdt_service * service =
+ (struct dvb_sdt_service *)(buf + pos);
+
+ if ((pos + sizeof(struct dvb_sdt_service)) > len)
+ return NULL;
+
+ bswap16(buf + pos);
+ bswap16(buf + pos + 3);
+ pos += sizeof(struct dvb_sdt_service);
+
+ if ((pos + service->descriptors_loop_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, service->descriptors_loop_length))
+ return NULL;
+
+ pos += service->descriptors_loop_length;
+ }
+
+ if (pos != len)
+ return NULL;
+
+ return (struct dvb_sdt_section *) ext;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/sdt_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/sdt_section.h
new file mode 100644
index 0000000..0130fe7
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/sdt_section.h
@@ -0,0 +1,157 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SDT_SECTION_H
+#define _UCSI_DVB_SDT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * dvb_sdt_section structure.
+ */
+struct dvb_sdt_section {
+ struct section_ext head;
+
+ uint16_t original_network_id;
+ uint8_t reserved;
+ /* struct dvb_sdt_service services[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the services field of a dvb_sdt_section.
+ */
+struct dvb_sdt_service {
+ uint16_t service_id;
+ EBIT3(uint8_t reserved : 6; ,
+ uint8_t eit_schedule_flag : 1; ,
+ uint8_t eit_present_following_flag : 1; );
+ EBIT3(uint16_t running_status : 3; ,
+ uint16_t free_ca_mode : 1; ,
+ uint16_t descriptors_loop_length :12; );
+ /* struct descriptor descriptors[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_sdt_section.
+ *
+ * @param section Pointer to a generic section_ext structure.
+ * @return dvb_sdt_section pointer, or NULL on error.
+ */
+struct dvb_sdt_section * dvb_sdt_section_codec(struct section_ext *section);
+
+/**
+ * Accessor for the transport_stream_id field of an SDT.
+ *
+ * @param sdt SDT pointer.
+ * @return The transport_stream_id.
+ */
+static inline uint16_t dvb_sdt_section_transport_stream_id(struct dvb_sdt_section *sdt)
+{
+ return sdt->head.table_id_ext;
+}
+
+/**
+ * Iterator for the services field in a dvb_sdt_section.
+ *
+ * @param sdt dvb_sdt_section pointer.
+ * @param pos Variable containing a pointer to the current dvb_sdt_service.
+ */
+#define dvb_sdt_section_services_for_each(sdt, pos) \
+ for ((pos) = dvb_sdt_section_services_first(sdt); \
+ (pos); \
+ (pos) = dvb_sdt_section_services_next(sdt, pos))
+
+/**
+ * Iterator for the descriptors field in a dvb_sdt_service.
+ *
+ * @param service dvb_sdt_service pointer.
+ * @param pos Variable containing a pointer to the current descriptor.
+ */
+#define dvb_sdt_service_descriptors_for_each(service, pos) \
+ for ((pos) = dvb_sdt_service_descriptors_first(service); \
+ (pos); \
+ (pos) = dvb_sdt_service_descriptors_next(service, pos))
+
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_sdt_service *
+ dvb_sdt_section_services_first(struct dvb_sdt_section * sdt)
+{
+ int pos = sizeof(struct dvb_sdt_section);
+
+ if (pos >= section_ext_length(&sdt->head))
+ return NULL;
+
+ return (struct dvb_sdt_service*) ((uint8_t *) sdt + pos);
+}
+
+static inline struct dvb_sdt_service *
+ dvb_sdt_section_services_next(struct dvb_sdt_section * sdt,
+ struct dvb_sdt_service * pos)
+{
+ uint8_t *end = (uint8_t*) sdt + section_ext_length(&sdt->head);
+ uint8_t *next = (uint8_t*) pos + sizeof(struct dvb_sdt_service) +
+ pos->descriptors_loop_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_sdt_service *) next;
+}
+
+static inline struct descriptor *
+ dvb_sdt_service_descriptors_first(struct dvb_sdt_service *svc)
+{
+ if (svc->descriptors_loop_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t*) svc + sizeof(struct dvb_sdt_service));
+}
+
+static inline struct descriptor *
+ dvb_sdt_service_descriptors_next(struct dvb_sdt_service *svc,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) svc + sizeof(struct dvb_sdt_service),
+ svc->descriptors_loop_length,
+ pos);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/section.h
new file mode 100644
index 0000000..8488d71
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/section.h
@@ -0,0 +1,107 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SECTION_H
+#define _UCSI_DVB_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/dvb/bat_section.h>
+#include <libucsi/dvb/dit_section.h>
+#include <libucsi/dvb/eit_section.h>
+#include <libucsi/dvb/nit_section.h>
+#include <libucsi/dvb/rst_section.h>
+#include <libucsi/dvb/sdt_section.h>
+#include <libucsi/dvb/sit_section.h>
+#include <libucsi/dvb/st_section.h>
+#include <libucsi/dvb/tdt_section.h>
+#include <libucsi/dvb/tot_section.h>
+#include <libucsi/dvb/tva_container_section.h>
+#include <libucsi/dvb/int_section.h>
+
+/**
+ * The following are not implemented just now.
+ */
+/*
+#include <libucsi/dvb/tva_related_content_section.h>
+#include <libucsi/dvb/tva_content_identifier_section.h>
+#include <libucsi/dvb/tva_resolution_provider_notification_section.h>
+#include <libucsi/dvb/ait_section.h>
+#include <libucsi/dvb/cit_section.h>
+#include <libucsi/dvb/rct_section.h>
+#include <libucsi/dvb/rnt_section.h>
+*/
+
+#define TRANSPORT_NIT_PID 0x10
+#define TRANSPORT_SDT_PID 0x11
+#define TRANSPORT_BAT_PID 0x11
+#define TRANSPORT_EIT_PID 0x12
+#define TRANSPORT_CIT_PID 0x12
+#define TRANSPORT_RST_PID 0x13
+#define TRANSPORT_TDT_PID 0x14
+#define TRANSPORT_TOT_PID 0x14
+#define TRANSPORT_RNT_PID 0x16
+#define TRANSPORT_DIT_PID 0x1e
+#define TRANSPORT_SIT_PID 0x1f
+
+/**
+ * Enumeration of DVB section tags.
+ */
+enum dvb_section_tag {
+ stag_dvb_network_information_actual = 0x40,
+ stag_dvb_network_information_other = 0x41,
+
+ stag_dvb_service_description_actual = 0x42,
+ stag_dvb_service_description_other = 0x46,
+
+ stag_dvb_bouquet_association = 0x4a,
+ stag_dvb_update_notification = 0x4b, /* same syntax as IP_MAC */
+ stag_dvb_ip_mac_notification = 0x4c,
+
+ stag_dvb_event_information_nownext_actual = 0x4e,
+ stag_dvb_event_information_nownext_other = 0x4f,
+ stag_dvb_event_information_schedule_actual = 0x50, /* 0x50->0x5f */
+ stag_dvb_event_information_schedule_other = 0x60, /* 0x60->0x6f */
+
+ stag_dvb_time_date = 0x70,
+ stag_dvb_running_status = 0x71,
+ stag_dvb_stuffing = 0x72,
+ stag_dvb_time_offset = 0x73,
+ stag_dvb_application_information = 0x74,
+ stag_dvb_tva_container = 0x75,
+ stag_dvb_tva_related_content = 0x76,
+ stag_dvb_tva_content_identifier = 0x77,
+ stag_dvb_mpe_fec = 0x78,
+ stag_dvb_tva_resolution_provider_notification = 0x79,
+
+ stag_dvb_discontinuity_information = 0x7e,
+ stag_dvb_selection_information = 0x7f,
+
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/service_availability_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/service_availability_descriptor.h
new file mode 100644
index 0000000..f16781b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/service_availability_descriptor.h
@@ -0,0 +1,98 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SERVICE_AVAILABILITY_DESCRIPTOR
+#define _UCSI_DVB_SERVICE_AVAILABILITY_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_service_availability_descriptor structure.
+ */
+struct dvb_service_availability_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint8_t availability_flag : 1; ,
+ uint8_t reserved : 7; )
+ /* uint16_t cell_ids[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_service_availability_descriptor.
+ *
+ * @param d Pointer to a generic descriptor structure.
+ * @return dvb_service_availability_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_service_availability_descriptor*
+ dvb_service_availability_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint8_t* buf = (uint8_t*) d + 2;
+ uint32_t len = d->len;
+
+ pos += sizeof(struct dvb_service_availability_descriptor) - 2;
+
+ if ((len - pos) % 2)
+ return NULL;
+
+ while(pos < len) {
+ bswap16(buf+pos);
+ pos += 2;
+ }
+
+ return (struct dvb_service_availability_descriptor*) d;
+}
+
+/**
+ * Accessor for the cell_ids field of a dvb_service_availability_descriptor.
+ *
+ * @param d dvb_service_availability_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint32_t *
+ dvb_service_availability_descriptor_cell_ids(struct dvb_service_availability_descriptor *d)
+{
+ return (uint32_t *) ((uint8_t *) d + sizeof(struct dvb_service_availability_descriptor));
+}
+
+/**
+ * Determine the number of entries in the cell_ids field of a dvb_service_availability_descriptor.
+ *
+ * @param d dvb_service_availability_descriptor pointer.
+ * @return The number of entries.
+ */
+static inline int
+ dvb_service_availability_descriptor_cell_ids_count(struct dvb_service_availability_descriptor *d)
+{
+ return (d->d.len - 1) >> 1;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/service_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/service_descriptor.h
new file mode 100644
index 0000000..e116ffc
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/service_descriptor.h
@@ -0,0 +1,156 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SERVICE_DESCRIPTOR
+#define _UCSI_DVB_SERVICE_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Possible values for service_type.
+ */
+enum {
+ DVB_SERVICE_TYPE_DIGITAL_TV = 0x01,
+ DVB_SERVICE_TYPE_DIGITAL_RADIO = 0x02,
+ DVB_SERVICE_TYPE_TELETEXT = 0x03,
+ DVB_SERVICE_TYPE_NVOD_REF = 0x04,
+ DVB_SERVICE_TYPE_NVOD_TIMESHIFT = 0x05,
+ DVB_SERVICE_TYPE_MOSAIC = 0x06,
+ DVB_SERVICE_TYPE_PAL = 0x07,
+ DVB_SERVICE_TYPE_SECAM = 0x08,
+ DVB_SERVICE_TYPE_D_D2_MAC = 0x09,
+ DVB_SERVICE_TYPE_FM_RADIO = 0x0a,
+ DVB_SERVICE_TYPE_NTSC = 0x0b,
+ DVB_SERVICE_TYPE_DATA_BCAST = 0x0c,
+ DVB_SERVICE_TYPE_EN50221 = 0x0d,
+ DVB_SERVICE_TYPE_RCS_MAP = 0x0e,
+ DVB_SERVICE_TYPE_RCS_FLS = 0x0f,
+ DVB_SERVICE_TYPE_MHP = 0x10
+};
+
+/**
+ * dvb_service_descriptor structure.
+ */
+struct dvb_service_descriptor {
+ struct descriptor d;
+
+ uint8_t service_type;
+ uint8_t service_provider_name_length;
+ /* uint8_t service_provider_name[] */
+ /* struct dvb_service_descriptor_part2 part2 */
+} __ucsi_packed;
+
+/**
+ * Second part of a dvb_service_descriptor following the variable length
+ * service_provider_name field.
+ */
+struct dvb_service_descriptor_part2 {
+ uint8_t service_name_length;
+ /* uint8_t service_name[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_service_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_service_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_service_descriptor*
+ dvb_service_descriptor_codec(struct descriptor* d)
+{
+ struct dvb_service_descriptor *p =
+ (struct dvb_service_descriptor *) d;
+ struct dvb_service_descriptor_part2 *p2;
+ uint32_t pos = sizeof(struct dvb_service_descriptor) - 2;
+ uint32_t len = d->len;
+
+ if (pos > len)
+ return NULL;
+
+ pos += p->service_provider_name_length;
+
+ if (pos > len)
+ return NULL;
+
+ p2 = (struct dvb_service_descriptor_part2*) ((uint8_t*) d + 2 + pos);
+
+ pos += sizeof(struct dvb_service_descriptor_part2);
+
+ if (pos > len)
+ return NULL;
+
+ pos += p2->service_name_length;
+
+ if (pos != len)
+ return NULL;
+
+ return p;
+}
+
+/**
+ * Accessor for the service_provider_name field of a dvb_service_descriptor.
+ *
+ * @param d dvb_service_descriptor pointer.
+ * @return Pointer to the service_provider_name field.
+ */
+static inline uint8_t *
+ dvb_service_descriptor_service_provider_name(struct dvb_service_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_service_descriptor);
+}
+
+/**
+ * Accessor for the second part of a dvb_service_descriptor.
+ *
+ * @param d dvb_service_descriptor pointer.
+ * @return dvb_service_descriptor_part2 pointer.
+ */
+static inline struct dvb_service_descriptor_part2 *
+ dvb_service_descriptor_part2(struct dvb_service_descriptor *d)
+{
+ return (struct dvb_service_descriptor_part2 *)
+ ((uint8_t*) d + sizeof(struct dvb_service_descriptor) +
+ d->service_provider_name_length);
+}
+
+/**
+ * Accessor for the service_name field of a dvb_service_descriptor_part2.
+ *
+ * @param d dvb_service_descriptor_part2 pointer.
+ * @return Pointer to the service_name field.
+ */
+static inline uint8_t *
+ dvb_service_descriptor_service_name(struct dvb_service_descriptor_part2 *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_service_descriptor_part2);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/service_identifier_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/service_identifier_descriptor.h
new file mode 100644
index 0000000..2037a05
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/service_identifier_descriptor.h
@@ -0,0 +1,82 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SERVICE_IDENTIFIER_DESCRIPTOR
+#define _UCSI_DVB_SERVICE_IDENTIFIER_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_service_identifier_descriptor.
+ */
+struct dvb_service_identifier_descriptor {
+ struct descriptor d;
+
+ /* uint8_t identifier[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_service_identifier_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_service_identifier_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_service_identifier_descriptor*
+ dvb_service_identifier_descriptor_codec(struct descriptor* d)
+{
+ return (struct dvb_service_identifier_descriptor*) d;
+}
+
+/**
+ * Retrieve a pointer to the identifier field of a dvb_service_identifier_descriptor.
+ *
+ * @param d dvb_service_identifier_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_service_identifier_descriptor_identifier(struct dvb_service_identifier_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_service_identifier_descriptor);
+}
+
+/**
+ * Calculate length of the identifier field of a dvb_service_identifier_descriptor.
+ *
+ * @param d dvb_service_identifier_descriptor pointer.
+ * @return The length in bytes.
+ */
+static inline int
+ dvb_service_identifier_descriptor_identifier_length(struct dvb_service_identifier_descriptor *d)
+{
+ return d->d.len;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/service_list_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/service_list_descriptor.h
new file mode 100644
index 0000000..0086b25
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/service_list_descriptor.h
@@ -0,0 +1,122 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SERVICE_LIST_DESCRIPTOR
+#define _UCSI_DVB_SERVICE_LIST_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_service_list_descriptor structure.
+ */
+struct dvb_service_list_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_service_list_service services[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the services field of a dvb_service_list_descriptor.
+ */
+struct dvb_service_list_service {
+ uint16_t service_id;
+ uint8_t service_type;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_service_list_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_service_list_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_service_list_descriptor*
+ dvb_service_list_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+ uint8_t *p = (uint8_t*) d + 2;
+
+ if (len % sizeof(struct dvb_service_list_service))
+ return NULL;
+
+ while(pos < len) {
+ bswap16(p+pos);
+ pos += sizeof(struct dvb_service_list_service);
+ }
+
+ return (struct dvb_service_list_descriptor*) d;
+}
+
+/**
+ * Iterator for services field in a dvb_service_list_descriptor.
+ *
+ * @param d dvb_service_list_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_service_list_service.
+ */
+#define dvb_service_list_descriptor_services_for_each(d, pos) \
+ for ((pos) = dvb_service_list_descriptor_services_first(d); \
+ (pos); \
+ (pos) = dvb_service_list_descriptor_services_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_service_list_service*
+ dvb_service_list_descriptor_services_first(struct dvb_service_list_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_service_list_service *)
+ ((uint8_t*) d + sizeof(struct dvb_service_list_descriptor));
+}
+
+static inline struct dvb_service_list_service*
+ dvb_service_list_descriptor_services_next(struct dvb_service_list_descriptor *d,
+ struct dvb_service_list_service *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_service_list_service);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_service_list_service *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/service_move_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/service_move_descriptor.h
new file mode 100644
index 0000000..7685e65
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/service_move_descriptor.h
@@ -0,0 +1,67 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SERVICE_MOVE_DESCRIPTOR
+#define _UCSI_DVB_SERVICE_MOVE_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_service_move_descriptor structure.
+ */
+struct dvb_service_move_descriptor {
+ struct descriptor d;
+
+ uint16_t new_original_network_id;
+ uint16_t new_transport_stream_id;
+ uint16_t new_service_id;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_service_move_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to dvb_service_move_descriptor, or NULL on error.
+ */
+static inline struct dvb_service_move_descriptor*
+ dvb_service_move_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_service_move_descriptor) - 2))
+ return NULL;
+
+ bswap16((uint8_t*) d + 2);
+ bswap16((uint8_t*) d + 4);
+ bswap16((uint8_t*) d + 6);
+
+ return (struct dvb_service_move_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/short_event_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/short_event_descriptor.h
new file mode 100644
index 0000000..449c6f0
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/short_event_descriptor.h
@@ -0,0 +1,135 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SHORT_EVENT_DESCRIPTOR
+#define _UCSI_DVB_SHORT_EVENT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_short_event_descriptor structure.
+ */
+struct dvb_short_event_descriptor {
+ struct descriptor d;
+
+ iso639lang_t language_code;
+ uint8_t event_name_length;
+ /* uint8_t event_name[] */
+ /* struct dvb_short_event_descriptor_part2 part2 */
+} __ucsi_packed;
+
+/**
+ * Second part of a dvb_short_event_descriptor, following the variable length
+ * name field.
+ */
+struct dvb_short_event_descriptor_part2 {
+ uint8_t text_length;
+ /* uint8_t text[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_short_event_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_short_event_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_short_event_descriptor*
+ dvb_short_event_descriptor_codec(struct descriptor* d)
+{
+ struct dvb_short_event_descriptor *p =
+ (struct dvb_short_event_descriptor*) d;
+ struct dvb_short_event_descriptor_part2 *p2;
+ uint32_t pos = sizeof(struct dvb_short_event_descriptor) - 2;
+ uint32_t len = d->len;
+
+ if (pos > len)
+ return NULL;
+
+ pos += p->event_name_length;
+
+ if (pos > len)
+ return NULL;
+
+ p2 = (struct dvb_short_event_descriptor_part2*) ((uint8_t*) d + 2 + pos);
+
+ pos += sizeof(struct dvb_short_event_descriptor_part2);
+
+ if (pos > len)
+ return NULL;
+
+ pos += p2->text_length;
+
+ if (pos != len)
+ return NULL;
+
+ return p;
+}
+
+/**
+ * Accessor for name field in a dvb_short_event_descriptor.
+ *
+ * @param d dvb_short_event_descriptor pointer.
+ * @return Pointer to name field.
+ */
+static inline uint8_t *
+ dvb_short_event_descriptor_event_name(struct dvb_short_event_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_short_event_descriptor);
+}
+
+/**
+ * Accessor for second part of a dvb_short_event_descriptor.
+ *
+ * @param d dvb_short_event_descriptor pointer.
+ * @return dvb_short_event_descriptor_part2 pointer.
+ */
+static inline struct dvb_short_event_descriptor_part2 *
+ dvb_short_event_descriptor_part2(struct dvb_short_event_descriptor *d)
+{
+ return (struct dvb_short_event_descriptor_part2 *)
+ ((uint8_t*) d + sizeof(struct dvb_short_event_descriptor) +
+ d->event_name_length);
+}
+
+/**
+ * Accessor for text field in a dvb_short_event_descriptor_part2.
+ *
+ * @param d dvb_short_event_descriptor_part2 pointer.
+ * @return Pointer to text field.
+ */
+static inline uint8_t *
+ dvb_short_event_descriptor_text(struct dvb_short_event_descriptor_part2 *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_short_event_descriptor_part2);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h
new file mode 100644
index 0000000..7deab9b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/short_smoothing_buffer_descriptor.h
@@ -0,0 +1,87 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SHORT_SMOOTHING_BUFFER_DESCRIPTOR
+#define _UCSI_DVB_SHORT_SMOOTHING_BUFFER_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_short_smoothing_buffer_descriptor structure.
+ */
+struct dvb_short_smoothing_buffer_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint8_t sb_size : 2; ,
+ uint8_t sb_leak_rate : 6; )
+ /* uint8_t reserved [] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_short_smoothing_buffer_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_short_smoothing_buffer_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_short_smoothing_buffer_descriptor*
+ dvb_short_smoothing_buffer_descriptor_codec(struct descriptor* d)
+{
+ if (d->len < (sizeof(struct dvb_short_smoothing_buffer_descriptor) - 2))
+ return NULL;
+
+ return (struct dvb_short_smoothing_buffer_descriptor*) d;
+}
+
+/**
+ * Accessor for reserved field in a dvb_short_smoothing_buffer_descriptor.
+ *
+ * @param d dvb_short_smoothing_buffer_descriptor pointer.
+ * @return Pointer to reserved field.
+ */
+static inline uint8_t *
+ dvb_short_smoothing_buffer_descriptor_reserved(struct dvb_short_smoothing_buffer_descriptor *d)
+{
+ return (uint8_t*) d + sizeof(struct dvb_short_smoothing_buffer_descriptor);
+}
+
+/**
+ * Calculate length of reserved field in a dvb_short_smoothing_buffer_descriptor.
+ *
+ * @param d dvb_short_smoothing_buffer_descriptor pointer.
+ * @return Length of the field in bytes.
+ */
+static inline int
+ dvb_short_smoothing_buffer_descriptor_reserved_length(struct dvb_short_smoothing_buffer_descriptor *d)
+{
+ return d->d.len - 1;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/sit_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/sit_section.c
new file mode 100644
index 0000000..61134d0
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/sit_section.c
@@ -0,0 +1,70 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/sit_section.h>
+
+struct dvb_sit_section * dvb_sit_section_codec(struct section_ext * ext)
+{
+ uint8_t * buf = (uint8_t *) ext;
+ struct dvb_sit_section * ret = (struct dvb_sit_section *) ext;
+ unsigned int pos = sizeof(struct section_ext);
+ unsigned int len = section_ext_length(ext);
+
+ if (len < sizeof(struct dvb_sit_section))
+ return NULL;
+
+ bswap16(buf + pos);
+ pos += 2;
+
+ if ((pos + ret->transmission_info_loop_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, ret->transmission_info_loop_length))
+ return NULL;
+
+ pos += ret->transmission_info_loop_length;
+
+ while (pos < len) {
+ struct dvb_sit_service * service = (void*)(buf + pos);
+
+ if ((pos + sizeof(struct dvb_sit_service)) > len)
+ return NULL;
+
+ bswap16(buf + pos);
+ bswap16(buf + pos + 2);
+ bswap16(buf + pos + 4);
+ pos += sizeof(struct dvb_sit_service);
+
+ if ((pos + service->service_loop_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, service->service_loop_length))
+ return NULL;
+
+ pos += service->service_loop_length;
+ }
+
+ if (pos != len)
+ return NULL;
+
+ return ret;
+}
+
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/sit_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/sit_section.h
new file mode 100644
index 0000000..d05989f
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/sit_section.h
@@ -0,0 +1,173 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SIT_SECTION_H
+#define _UCSI_DVB_SIT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * dvb_sit_section structure.
+ */
+struct dvb_sit_section {
+ struct section_ext head;
+
+ EBIT2(uint16_t reserved : 4; ,
+ uint16_t transmission_info_loop_length :12; );
+ /* struct descriptor descriptors[] */
+ /* struct dvb_sit_service services[] */
+};
+
+/**
+ * An entry in the services field of a dvb_sit_section.
+ */
+struct dvb_sit_service {
+ uint16_t service_id;
+ EBIT3(uint16_t reserved : 1; ,
+ uint16_t running_status : 3; ,
+ uint16_t service_loop_length :12; );
+ /* struct descriptor descriptors[] */
+};
+
+/**
+ * Process a dvb_sit_section.
+ *
+ * @param section Generic section_ext structure.
+ * @return dvb_sit_section pointer, or NULL on error.
+ */
+struct dvb_sit_section * dvb_sit_section_codec(struct section_ext *section);
+
+/**
+ * Iterator for descriptors field in a dvb_sit_section.
+ *
+ * @param sit dvb_sit_section Pointer.
+ * @param pos Variable holding pointer to current descriptor.
+ */
+#define dvb_sit_section_descriptors_for_each(sit, pos) \
+ for ((pos) = dvb_sit_section_descriptors_first(sit); \
+ (pos); \
+ (pos) = dvb_sit_section_descriptors_first(sit))
+
+/**
+ * Iterator for services field in a dvb_sit_section.
+ *
+ * @param sit dvb_sit_section Pointer.
+ * @param pos Variable holding pointer to current dvb_sit_service.
+ */
+#define dvb_sit_section_services_for_each(sit, pos) \
+ for ((pos) = dvb_sit_section_services_first(sit); \
+ (pos); \
+ (pos) = dvb_sit_section_services_next(sit, pos))
+
+/**
+ * Iterator for descriptors field in a dvb_sit_service.
+ *
+ * @param service dvb_sit_service Pointer.
+ * @param pos Variable holding pointer to current descriptor.
+ */
+#define dvb_sit_service_descriptors_for_each(service, pos) \
+ for ((pos) = dvb_sit_service_descriptors_first(service); \
+ (pos); \
+ (pos) = dvb_sit_service_descriptors_next(service, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct descriptor *
+ dvb_sit_section_descriptors_first(struct dvb_sit_section *sit)
+{
+ if (sit->transmission_info_loop_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t *) sit + sizeof(struct dvb_sit_section));
+}
+
+static inline struct descriptor *
+ dvb_sit_section_descriptors_next(struct dvb_sit_section *sit,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) sit + sizeof(struct dvb_sit_section),
+ sit->transmission_info_loop_length,
+ pos);
+}
+
+static inline struct dvb_sit_service *
+ dvb_sit_section_services_first(struct dvb_sit_section *sit)
+{
+ int pos = sizeof(struct dvb_sit_section) + sit->transmission_info_loop_length;
+
+ if (pos >= section_ext_length(&sit->head))
+ return NULL;
+
+ return (struct dvb_sit_service*) ((uint8_t *) sit + pos);
+}
+
+static inline struct dvb_sit_service *
+ dvb_sit_section_services_next(struct dvb_sit_section *sit,
+ struct dvb_sit_service *pos)
+{
+ uint8_t *end = (uint8_t*) sit + section_ext_length(&sit->head);
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_sit_service) +
+ pos->service_loop_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_sit_service *) next;
+}
+
+static inline struct descriptor *
+ dvb_sit_service_descriptors_first(struct dvb_sit_service * t)
+{
+ if (t->service_loop_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t *) t + sizeof(struct dvb_sit_service));
+}
+
+static inline struct descriptor *
+ dvb_sit_service_descriptors_next(struct dvb_sit_service *t,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t*) t + sizeof(struct dvb_sit_service),
+ t->service_loop_length,
+ pos);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/st_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/st_section.c
new file mode 100644
index 0000000..0e60aa1
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/st_section.c
@@ -0,0 +1,29 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/st_section.h>
+
+struct dvb_st_section * dvb_st_section_codec(struct section * section)
+{
+ struct dvb_st_section * ret = (struct dvb_st_section *)section;
+
+ return ret;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/st_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/st_section.h
new file mode 100644
index 0000000..52ba888
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/st_section.h
@@ -0,0 +1,77 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_ST_SECTION_H
+#define _UCSI_DVB_ST_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * dvb_st_section structure.
+ */
+struct dvb_st_section {
+ struct section head;
+
+ /* uint8_t data[] */
+};
+
+/**
+ * Process a dvb_st_section.
+ *
+ * @param section Generic section header.
+ * @return dvb_st_section pointer, or NULL on error.
+ */
+struct dvb_st_section *dvb_st_section_codec(struct section *section);
+
+/**
+ * Accessor for data field of dvb_st_section.
+ *
+ * @param st dvb_st_section Pointer.
+ * @return Pointer to field.
+ */
+static inline uint8_t*
+ dvb_st_section_data(struct dvb_st_section* st)
+{
+ return (uint8_t*) st + sizeof(struct dvb_st_section);
+}
+
+/**
+ * Calculate length of data field of dvb_st_section.
+ *
+ * @param st dvb_st_section Pointer.
+ * @return Length in bytes.
+ */
+static inline int
+ dvb_st_section_data_length(struct dvb_st_section* st)
+{
+ return st->head.length;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/stream_identifier_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/stream_identifier_descriptor.h
new file mode 100644
index 0000000..262c7e2
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/stream_identifier_descriptor.h
@@ -0,0 +1,61 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_STREAM_IDENTIFIER_DESCRIPTOR
+#define _UCSI_DVB_STREAM_IDENTIFIER_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_stream_identifier_descriptor structure.
+ */
+struct dvb_stream_identifier_descriptor {
+ struct descriptor d;
+
+ uint8_t component_tag;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_stream_identifier_descriptor.
+ *
+ * @param d Pointer to generic descriptor structure.
+ * @return dvb_stream_identifier_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_stream_identifier_descriptor*
+ dvb_stream_identifier_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_stream_identifier_descriptor) - 2))
+ return NULL;
+
+ return (struct dvb_stream_identifier_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/stuffing_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/stuffing_descriptor.h
new file mode 100644
index 0000000..48e415d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/stuffing_descriptor.h
@@ -0,0 +1,82 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_STUFFING_DESCRIPTOR
+#define _UCSI_DVB_STUFFING_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_stuffing_descriptor.
+ */
+struct dvb_stuffing_descriptor {
+ struct descriptor d;
+
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_stuffing_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_stuffing_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_stuffing_descriptor*
+ dvb_stuffing_descriptor_codec(struct descriptor* d)
+{
+ return (struct dvb_stuffing_descriptor*) d;
+}
+
+/**
+ * Retrieve a pointer to the data field of a dvb_stuffing_descriptor.
+ *
+ * @param d dvb_stuffing_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ dvb_stuffing_descriptor_data(struct dvb_stuffing_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_stuffing_descriptor);
+}
+
+/**
+ * Calculate length of the data field of a dvb_stuffing_descriptor.
+ *
+ * @param d dvb_stuffing_descriptor pointer.
+ * @return The length in bytes.
+ */
+static inline int
+ dvb_stuffing_descriptor_data_length(struct dvb_stuffing_descriptor *d)
+{
+ return d->d.len;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/subtitling_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/subtitling_descriptor.h
new file mode 100644
index 0000000..74fc25a
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/subtitling_descriptor.h
@@ -0,0 +1,126 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_SUBTITLING_DESCRIPTOR
+#define _UCSI_DVB_SUBTITLING_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_subtitling_descriptor structure.
+ */
+struct dvb_subtitling_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_subtitling_entry subtitles[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the subtitles field of the a dvb_subtitling_descriptor.
+ */
+struct dvb_subtitling_entry {
+ iso639lang_t language_code;
+ uint8_t subtitling_type;
+ uint16_t composition_page_id;
+ uint16_t ancillary_page_id;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_subtitling_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return dvb_subtitling_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_subtitling_descriptor*
+ dvb_subtitling_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint8_t* ptr = (uint8_t*) d + 2;
+ uint32_t len = d->len;
+
+ if (len % sizeof(struct dvb_subtitling_entry))
+ return NULL;
+
+ while(pos < len) {
+ bswap16(ptr+pos+4);
+ bswap16(ptr+pos+6);
+ pos += sizeof(struct dvb_subtitling_entry);
+ }
+
+ return (struct dvb_subtitling_descriptor*) d;
+}
+
+/**
+ * Iterator for subtitles field in dvb_subtitling_descriptor.
+ *
+ * @param d dvb_subtitling_descriptor pointer.
+ * @param pos Variable containing a pointer to current dvb_subtitling_entry.
+ */
+#define dvb_subtitling_descriptor_subtitles_for_each(d, pos) \
+ for ((pos) = dvb_subtitling_descriptor_subtitles_first(d); \
+ (pos); \
+ (pos) = dvb_subtitling_descriptor_subtitles_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_subtitling_entry*
+ dvb_subtitling_descriptor_subtitles_first(struct dvb_subtitling_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_subtitling_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_subtitling_descriptor));
+}
+
+static inline struct dvb_subtitling_entry*
+ dvb_subtitling_descriptor_subtitles_next(struct dvb_subtitling_descriptor *d,
+ struct dvb_subtitling_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_subtitling_entry);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_subtitling_entry *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/tdt_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/tdt_section.c
new file mode 100644
index 0000000..30a23cf
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/tdt_section.c
@@ -0,0 +1,33 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/tdt_section.h>
+
+struct dvb_tdt_section * dvb_tdt_section_codec(struct section * section)
+{
+ int len = section->length + sizeof(struct section);
+ struct dvb_tdt_section * ret = (struct dvb_tdt_section *) section;
+
+ if (len != sizeof(struct dvb_tdt_section))
+ return NULL;
+
+ return ret;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/tdt_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/tdt_section.h
new file mode 100644
index 0000000..fc2bcb8
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/tdt_section.h
@@ -0,0 +1,54 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TDT_SECTION_H
+#define _UCSI_DVB_TDT_SECTION_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+#include <libucsi/dvb/types.h>
+
+/**
+ * dvb_tdt_section structure.
+ */
+struct dvb_tdt_section {
+ struct section head;
+
+ dvbdate_t utc_time;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_tdt_section.
+ *
+ * @param section Generic section header.
+ * @return dvb_tdt_section pointer, or NULL on error.
+ */
+struct dvb_tdt_section *dvb_tdt_section_codec(struct section *section);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/telephone_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/telephone_descriptor.h
new file mode 100644
index 0000000..46b39e4
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/telephone_descriptor.h
@@ -0,0 +1,150 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TELEPHONE_DESCRIPTOR
+#define _UCSI_DVB_TELEPHONE_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_telephone_descriptor stucture.
+ */
+struct dvb_telephone_descriptor {
+ struct descriptor d;
+
+ EBIT3(uint8_t reserved_1 : 2; ,
+ uint8_t foreign_availability : 1; ,
+ uint8_t connection_type : 5; )
+ EBIT4(uint8_t reserved_2 : 1; ,
+ uint8_t country_prefix_length : 2; ,
+ uint8_t international_area_code_length : 3; ,
+ uint8_t operator_code_length : 2; )
+ EBIT3(uint8_t reserved_3 : 1; ,
+ uint8_t national_area_code_length : 3; ,
+ uint8_t core_number_length : 4; )
+ /* uint8_t country_prefix[] */
+ /* uint8_t international_area_code[] */
+ /* uint8_t operator_code[] */
+ /* uint8_t national_area_code[] */
+ /* uint8_t core_number[] */
+} __ucsi_packed;
+
+
+/**
+ * Process a dvb_telephone_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return dvb_telephone_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_telephone_descriptor*
+ dvb_telephone_descriptor_codec(struct descriptor* d)
+{
+ struct dvb_telephone_descriptor* p =
+ (struct dvb_telephone_descriptor*) d;
+ uint32_t pos = sizeof(struct dvb_telephone_descriptor) - 2;
+ uint32_t len = d->len;
+
+ if (pos > len)
+ return NULL;
+
+ pos += p->country_prefix_length +
+ p->international_area_code_length +
+ p->operator_code_length +
+ p->national_area_code_length +
+ p->core_number_length;
+
+ if (pos != len)
+ return NULL;
+
+ return p;
+}
+
+/**
+ * Retrieve pointer to country_prefix field of a dvb_telephone_descriptor.
+ *
+ * @param d dvb_telephone_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ dvb_telephone_descriptor_country_prefix(struct dvb_telephone_descriptor* d)
+{
+ return (uint8_t*) d + sizeof(struct dvb_telephone_descriptor);
+}
+
+/**
+ * Retrieve pointer to international_area_code field of a dvb_telephone_descriptor.
+ *
+ * @param d dvb_telephone_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ dvb_telephone_descriptor_international_area_code(struct dvb_telephone_descriptor* d)
+{
+ return dvb_telephone_descriptor_country_prefix(d) + d->country_prefix_length;
+}
+
+/**
+ * Retrieve pointer to operator_code field of a dvb_telephone_descriptor.
+ *
+ * @param d dvb_telephone_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ dvb_telephone_descriptor_operator_code(struct dvb_telephone_descriptor* d)
+{
+ return dvb_telephone_descriptor_international_area_code(d) + d->international_area_code_length;
+}
+
+/**
+ * Retrieve pointer to national_area_code field of a dvb_telephone_descriptor.
+ *
+ * @param d dvb_telephone_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ dvb_telephone_descriptor_national_area_code(struct dvb_telephone_descriptor* d)
+{
+ return dvb_telephone_descriptor_operator_code(d) + d->operator_code_length;
+}
+
+/**
+ * Retrieve pointer to core_number field of a dvb_telephone_descriptor.
+ *
+ * @param d dvb_telephone_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ dvb_telephone_descriptor_core_number(struct dvb_telephone_descriptor* d)
+{
+ return dvb_telephone_descriptor_national_area_code(d) + d->national_area_code_length;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/teletext_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/teletext_descriptor.h
new file mode 100644
index 0000000..280b6eb
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/teletext_descriptor.h
@@ -0,0 +1,127 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TELETEXT_DESCRIPTOR
+#define _UCSI_DVB_TELETEXT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * Possible values for the type field.
+ */
+enum {
+ DVB_TELETEXT_TYPE_INITIAL = 0x01,
+ DVB_TELETEXT_TYPE_SUBTITLE = 0x02,
+ DVB_TELETEXT_TYPE_ADDITIONAL = 0x03,
+ DVB_TELETEXT_TYPE_SCHEDULE = 0x04,
+ DVB_TELETEXT_TYPE_SUBTITLE_HEARING_IMPAIRED= 0x05
+};
+
+/**
+ * dvb_teletext_descriptor structure.
+ */
+struct dvb_teletext_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_teletext_entry entries[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the entries field of a dvb_teletext_descriptor.
+ */
+struct dvb_teletext_entry {
+ iso639lang_t language_code;
+ EBIT2(uint8_t type : 5; ,
+ uint8_t magazine_number: 3; )
+ uint8_t page_number;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_teletext_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return dvb_teletext_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_teletext_descriptor*
+ dvb_teletext_descriptor_codec(struct descriptor* d)
+{
+ if (d->len % sizeof(struct dvb_teletext_entry))
+ return NULL;
+
+ return (struct dvb_teletext_descriptor*) d;
+}
+
+/**
+ * Iterator for entries field of a dvb_teletext_descriptor.
+ *
+ * @param d dvb_teletext_descriptor pointer.
+ * @param pos Variable holding a pointer to the current dvb_teletext_entry.
+ */
+#define dvb_teletext_descriptor_entries_for_each(d, pos) \
+ for ((pos) = dvb_teletext_descriptor_entries_first(d); \
+ (pos); \
+ (pos) = dvb_teletext_descriptor_entries_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_teletext_entry*
+ dvb_teletext_descriptor_entries_first(struct dvb_teletext_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_teletext_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_teletext_descriptor));
+}
+
+static inline struct dvb_teletext_entry*
+ dvb_teletext_descriptor_entries_next(struct dvb_teletext_descriptor *d,
+ struct dvb_teletext_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_teletext_entry);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_teletext_entry *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/terrestrial_delivery_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/terrestrial_delivery_descriptor.h
new file mode 100644
index 0000000..b890178
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/terrestrial_delivery_descriptor.h
@@ -0,0 +1,77 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TERRESTRIAL_DELIVERY_DESCRIPTOR
+#define _UCSI_DVB_TERRESTRIAL_DELIVERY_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_terrestrial_delivery_descriptor structure.
+ */
+struct dvb_terrestrial_delivery_descriptor {
+ struct descriptor d;
+
+ uint32_t centre_frequency; // Normal integer, units 10Hz
+ EBIT5(uint8_t bandwidth : 3; ,
+ uint8_t priority : 1; ,
+ uint8_t time_slicing_indicator : 1; ,
+ uint8_t mpe_fec_indicator : 1; ,
+ uint8_t reserved_1 : 2; )
+ EBIT3(uint8_t constellation : 2; ,
+ uint8_t hierarchy_information : 3; ,
+ uint8_t code_rate_hp_stream : 3; )
+ EBIT4(uint8_t code_rate_lp_stream : 3; ,
+ uint8_t guard_interval : 2; ,
+ uint8_t transmission_mode : 2; ,
+ uint8_t other_frequency_flag : 1; )
+ uint32_t reserved_2;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_terrestrial_delivery_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_terrestrial_delivery_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_terrestrial_delivery_descriptor*
+ dvb_terrestrial_delivery_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_terrestrial_delivery_descriptor) - 2))
+ return NULL;
+
+ bswap32((uint8_t*) d + 2);
+ bswap32((uint8_t*) d + 9);
+
+ return (struct dvb_terrestrial_delivery_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/time_shifted_event_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/time_shifted_event_descriptor.h
new file mode 100644
index 0000000..6b4a9f6
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/time_shifted_event_descriptor.h
@@ -0,0 +1,65 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TIME_SHIFTED_EVENT_DESCRIPTOR
+#define _UCSI_DVB_TIME_SHIFTED_EVENT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_time_shifted_event_descriptor structure.
+ */
+struct dvb_time_shifted_event_descriptor {
+ struct descriptor d;
+
+ uint16_t reference_service_id;
+ uint16_t reference_event_id;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_time_shifted_event_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return dvb_time_shifted_event_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_time_shifted_event_descriptor*
+ dvb_time_shifted_event_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_time_shifted_event_descriptor) - 2))
+ return NULL;
+
+ bswap16((uint8_t*) d + 2);
+ bswap16((uint8_t*) d + 4);
+
+ return (struct dvb_time_shifted_event_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/time_shifted_service_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/time_shifted_service_descriptor.h
new file mode 100644
index 0000000..c8dcc0e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/time_shifted_service_descriptor.h
@@ -0,0 +1,63 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TIME_SHIFTED_SERVICE_DESCRIPTOR
+#define _UCSI_DVB_TIME_SHIFTED_SERVICE_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_time_shifted_service_descriptor structure.
+ */
+struct dvb_time_shifted_service_descriptor {
+ struct descriptor d;
+
+ uint16_t reference_service_id;
+} __ucsi_packed;
+
+/**
+ * Process a dvb_time_shifted_service_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return Pointer to dvb_time_shifted_service_descriptor, or NULL on error.
+ */
+static inline struct dvb_time_shifted_service_descriptor*
+ dvb_time_shifted_service_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct dvb_time_shifted_service_descriptor) - 2))
+ return NULL;
+
+ bswap16((uint8_t*) d + 2);
+
+ return (struct dvb_time_shifted_service_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/tot_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/tot_section.c
new file mode 100644
index 0000000..3ce2c6d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/tot_section.c
@@ -0,0 +1,50 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/tot_section.h>
+
+struct dvb_tot_section *dvb_tot_section_codec(struct section *section)
+{
+ uint8_t * buf = (uint8_t *)section;
+ int pos = sizeof(struct section);
+ int len = section->length + sizeof(struct section) - CRC_SIZE;
+ struct dvb_tot_section * ret = (struct dvb_tot_section *)section;
+
+ if (len < sizeof(struct dvb_tot_section))
+ return NULL;
+
+ pos += 5;
+ bswap16(buf + pos);
+ pos += 2;
+
+ if ((pos + ret->descriptors_loop_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, ret->descriptors_loop_length))
+ return NULL;
+
+ pos += ret->descriptors_loop_length;
+
+ if (pos != len)
+ return NULL;
+
+ return ret;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/tot_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/tot_section.h
new file mode 100644
index 0000000..3474da1
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/tot_section.h
@@ -0,0 +1,97 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TOT_SECTION_H
+#define _UCSI_DVB_TOT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+#include <libucsi/dvb/types.h>
+
+/**
+ * dvb_tot_section structure.
+ */
+struct dvb_tot_section {
+ struct section head;
+
+ dvbdate_t utc_time;
+ EBIT2(uint16_t reserved : 4; ,
+ uint16_t descriptors_loop_length:12; );
+ /* struct descriptor descriptors[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_tot_section.
+ *
+ * @param section Pointer to generic section structure.
+ * @return dvb_tot_section pointer, or NULL on error.
+ */
+struct dvb_tot_section * dvb_tot_section_codec(struct section *section);
+
+/**
+ * Iterator for descriptors field of dvb_tot_section.
+ *
+ * @param tot dvb_tot_section pointer.
+ * @param pos Variable holding a pointer to the current descriptor.
+ */
+#define dvb_tot_section_descriptors_for_each(tot, pos) \
+ for ((pos) = dvb_tot_section_descriptors_first(tot); \
+ (pos); \
+ (pos) = dvb_tot_section_descriptors_next(tot, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct descriptor *
+ dvb_tot_section_descriptors_first(struct dvb_tot_section * tot)
+{
+ if (tot->descriptors_loop_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t *) tot + sizeof(struct dvb_tot_section));
+}
+
+static inline struct descriptor *
+ dvb_tot_section_descriptors_next(struct dvb_tot_section *tot,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t *) tot + sizeof(struct dvb_tot_section),
+ tot->descriptors_loop_length,
+ pos);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/transport_stream_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/transport_stream_descriptor.h
new file mode 100644
index 0000000..1797ec5
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/transport_stream_descriptor.h
@@ -0,0 +1,82 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TRANSPORT_STREAM_DESCRIPTOR
+#define _UCSI_DVB_TRANSPORT_STREAM_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_transport_stream_descriptor structure.
+ */
+struct dvb_transport_stream_descriptor {
+ struct descriptor d;
+
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * Process dvb_transport_stream_descriptor structure.
+ *
+ * @param d Pointer to generic descriptor.
+ * @return dvb_transport_stream_descriptor structure or NULL on error.
+ */
+static inline struct dvb_transport_stream_descriptor*
+ dvb_transport_stream_descriptor_codec(struct descriptor* d)
+{
+ return (struct dvb_transport_stream_descriptor*) d;
+}
+
+/**
+ * Retrieve a pointer to the data field of a dvb_transport_stream_descriptor.
+ *
+ * @param d dvb_transport_stream_descriptor structure.
+ * @return Pointer to data field.
+ */
+static inline uint8_t *
+ dvb_transport_stream_descriptor_data(struct dvb_transport_stream_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_transport_stream_descriptor);
+}
+
+/**
+ * Calculate the length of the data field of a dvb_transport_stream_descriptor.
+ *
+ * @param d dvb_transport_stream_descriptor structure.
+ * @return length of data field in bytes.
+ */
+static inline int
+ dvb_transport_stream_descriptor_data_length(struct dvb_transport_stream_descriptor *d)
+{
+ return d->d.len;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/tva_container_section.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/tva_container_section.c
new file mode 100644
index 0000000..32a5795
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/tva_container_section.c
@@ -0,0 +1,33 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/dvb/tva_container_section.h>
+
+struct dvb_tva_container_section *dvb_tva_container_section_codec(struct section_ext *ext)
+{
+ int len = section_ext_length(ext);
+ struct dvb_tva_container_section* ret = (struct dvb_tva_container_section*) ext;
+
+ if (len < sizeof(struct dvb_tva_container_section))
+ return NULL;
+
+ return ret;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/tva_container_section.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/tva_container_section.h
new file mode 100644
index 0000000..6519ded
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/tva_container_section.h
@@ -0,0 +1,90 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TVA_CONTAINER_SECTION_H
+#define _UCSI_DVB_TVA_CONTAINER_SECTION_H
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+#include <libucsi/dvb/types.h>
+
+/**
+ * dvb_tva_container_section structure.
+ */
+struct dvb_tva_container_section {
+ struct section_ext head;
+
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * Process a dvb_tva_container_section.
+ *
+ * @param section Generic section header.
+ * @return dvb_tdt_section pointer, or NULL on error.
+ */
+struct dvb_tva_container_section *dvb_tva_container_section_codec(struct section_ext *ext);
+
+/**
+ * Accessor for the container_id field of a tva container section.
+ *
+ * @param container dvb_tva_container_section pointer.
+ * @return The container_id.
+ */
+static inline uint16_t dvb_tva_container_section_container_id(struct dvb_tva_container_section *container)
+{
+ return container->head.table_id_ext;
+}
+
+/**
+ * Accessor for the selector_byte field of a dvb_data_broadcast_id_descriptor.
+ *
+ * @param d dvb_data_broadcast_id_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+dvb_tva_container_section_data(struct dvb_tva_container_section *s)
+{
+ return (uint8_t *) s + sizeof(struct dvb_tva_container_section);
+}
+
+/**
+ * Determine the number of bytes in the data field of a dvb_tva_container_section.
+ *
+ * @param d dvb_tva_container_section pointer.
+ * @return Length of the field in bytes.
+ */
+static inline int
+dvb_tva_container_section_data_length(struct dvb_tva_container_section *s)
+{
+ return section_ext_length(&s->head) - sizeof(struct dvb_tva_container_section);
+}
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/tva_id_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/tva_id_descriptor.h
new file mode 100644
index 0000000..c830259
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/tva_id_descriptor.h
@@ -0,0 +1,124 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TVA_ID_DESCRIPTOR
+#define _UCSI_DVB_TVA_ID_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * dvb_tva_id_descriptor structure.
+ */
+struct dvb_tva_id_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_tva_id_entry entries[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the entries field of a dvb_tva_id_descriptor.
+ */
+struct dvb_tva_id_entry {
+ uint16_t tva_id;
+ EBIT2(uint8_t reserved : 5; ,
+ uint8_t running_status : 3; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_tva_id_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return dvb_tva_id_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_tva_id_descriptor*
+ dvb_tva_id_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+ uint8_t* buf = (uint8_t*) d + 2;
+
+ pos += sizeof(struct dvb_tva_id_descriptor) - 2;
+ if (len % sizeof(struct dvb_tva_id_entry))
+ return NULL;
+
+ while(pos < len) {
+ bswap16(buf+pos);
+ pos+=3;
+ }
+
+ return (struct dvb_tva_id_descriptor*) d;
+}
+
+/**
+ * Iterator for the entries field of a dvb_tva_id_descriptor.
+ *
+ * @param d dvb_tva_id_descriptor pointer.
+ * @param pos Variable containing a pointer to the current dvb_tva_id_entry.
+ */
+#define dvb_tva_id_descriptor_entries_for_each(d, pos) \
+ for ((pos) = dvb_tva_id_descriptor_entries_first(d); \
+ (pos); \
+ (pos) = dvb_tva_id_descriptor_entries_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_tva_id_entry*
+ dvb_tva_id_descriptor_entries_first(struct dvb_tva_id_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_tva_id_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_tva_id_descriptor));
+}
+
+static inline struct dvb_tva_id_entry*
+ dvb_tva_id_descriptor_countries_next(struct dvb_tva_id_descriptor *d,
+ struct dvb_tva_id_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_tva_id_entry);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_tva_id_entry *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/types.c b/kaffeine/src/input/dvb/lib/libucsi/dvb/types.c
new file mode 100644
index 0000000..c1cf583
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/types.c
@@ -0,0 +1,270 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <string.h>
+#include "types.h"
+
+time_t dvbdate_to_unixtime(dvbdate_t dvbdate)
+{
+ int k = 0;
+ struct tm tm;
+ double mjd;
+
+ /* check for the undefined value */
+ if ((dvbdate[0] == 0xff) &&
+ (dvbdate[1] == 0xff) &&
+ (dvbdate[2] == 0xff) &&
+ (dvbdate[3] == 0xff) &&
+ (dvbdate[4] == 0xff)) {
+ return -1;
+ }
+
+ memset(&tm, 0, sizeof(tm));
+ mjd = (dvbdate[0] << 8) | dvbdate[1];
+
+ tm.tm_year = (int) ((mjd - 15078.2) / 365.25);
+ tm.tm_mon = (int) (((mjd - 14956.1) - (int) (tm.tm_year * 365.25)) / 30.6001);
+ tm.tm_mday = (int) mjd - 14956 - (int) (tm.tm_year * 365.25) - (int) (tm.tm_mon * 30.6001);
+ if ((tm.tm_mon == 14) || (tm.tm_mon == 15)) k = 1;
+ tm.tm_year += k;
+ tm.tm_mon = tm.tm_mon - 2 - k * 12;
+ tm.tm_sec = bcd_to_integer(dvbdate[4]);
+ tm.tm_min = bcd_to_integer(dvbdate[3]);
+ tm.tm_hour = bcd_to_integer(dvbdate[2]);
+
+ return mktime(&tm);
+}
+
+void unixtime_to_dvbdate(time_t unixtime, dvbdate_t dvbdate)
+{
+ struct tm tm;
+ double l = 0;
+ int mjd;
+
+ /* the undefined value */
+ if (unixtime == -1) {
+ memset(dvbdate, 0xff, 5);
+ return;
+ }
+
+ gmtime_r(&unixtime, &tm);
+ tm.tm_mon++;
+ if ((tm.tm_mon == 1) || (tm.tm_mon == 2)) l = 1;
+ mjd = 14956 + tm.tm_mday + (int) ((tm.tm_year - l) * 365.25) + (int) ((tm.tm_mon + 1 + l * 12) * 30.6001);
+
+ dvbdate[0] = (mjd & 0xff00) >> 8;
+ dvbdate[1] = mjd & 0xff;
+ dvbdate[2] = integer_to_bcd(tm.tm_hour);
+ dvbdate[3] = integer_to_bcd(tm.tm_min);
+ dvbdate[4] = integer_to_bcd(tm.tm_sec);
+}
+
+int dvbduration_to_seconds(dvbduration_t dvbduration)
+{
+ int seconds = 0;
+
+ seconds += (bcd_to_integer(dvbduration[0]) * 60 * 60);
+ seconds += (bcd_to_integer(dvbduration[1]) * 60);
+ seconds += bcd_to_integer(dvbduration[2]);
+
+ return seconds;
+}
+
+void seconds_to_dvbduration(int seconds, dvbduration_t dvbduration)
+{
+ int hours, mins;
+
+ hours = seconds / (60*60);
+ seconds -= (hours * 60 * 60);
+ mins = seconds / 60;
+ seconds -= (mins * 60);
+
+ dvbduration[0] = integer_to_bcd(hours);
+ dvbduration[1] = integer_to_bcd(mins);
+ dvbduration[2] = integer_to_bcd(seconds);
+}
+
+int dvbhhmm_to_seconds(dvbhhmm_t dvbhhmm)
+{
+ int seconds = 0;
+
+ seconds += (bcd_to_integer(dvbhhmm[0]) * 60 * 60);
+ seconds += (bcd_to_integer(dvbhhmm[1]) * 60);
+
+ return seconds;
+}
+
+void seconds_to_dvbhhmm(int seconds, dvbhhmm_t dvbhhmm)
+{
+ int hours, mins;
+
+ hours = seconds / (60*60);
+ seconds -= (hours * 60 * 60);
+ mins = seconds / 60;
+
+ dvbhhmm[0] = integer_to_bcd(hours);
+ dvbhhmm[1] = integer_to_bcd(mins);
+}
+
+uint32_t integer_to_bcd(uint32_t intval)
+{
+ uint32_t val = 0;
+
+ int i;
+ for(i=0; i<=28;i+=4) {
+ val |= ((intval % 10) << i);
+ intval /= 10;
+ }
+
+ return val;
+}
+
+uint32_t bcd_to_integer(uint32_t bcdval)
+{
+ uint32_t val = 0;
+
+ int i;
+ for(i=28; i>=0;i-=4) {
+ val += ((bcdval >> i) & 0x0f);
+ if (i != 0) val *= 10;
+ }
+
+ return val;
+}
+
+const char *dvb_charset(char *dvb_text, int dvb_text_length, int *consumed)
+{
+ char *charset = "ISO6937";
+ int used = 0;
+
+ if (dvb_text_length == 0)
+ goto exit;
+ if (dvb_text[0] >= 32)
+ goto exit;
+ if (dvb_text[0] == 0x10) {
+ if (dvb_text_length < 3)
+ goto exit;
+
+ used = 3;
+ uint16_t ext = (dvb_text[1] << 8) | dvb_text[2];
+ switch(ext) {
+ case 0x01:
+ charset = "ISO8859-1";
+ break;
+ case 0x02:
+ charset = "ISO8859-2";
+ break;
+ case 0x03:
+ charset = "ISO8859-3";
+ break;
+ case 0x04:
+ charset = "ISO8859-4";
+ break;
+ case 0x05:
+ charset = "ISO8859-5";
+ break;
+ case 0x06:
+ charset = "ISO8859-6";
+ break;
+ case 0x07:
+ charset = "ISO8859-7";
+ break;
+ case 0x08:
+ charset = "ISO8859-8";
+ break;
+ case 0x09:
+ charset = "ISO8859-9";
+ break;
+ case 0x0a:
+ charset = "ISO8859-10";
+ break;
+ case 0x0b:
+ charset = "ISO8859-11";
+ break;
+ case 0x0d:
+ charset = "ISO8859-13";
+ break;
+ case 0x0e:
+ charset = "ISO8859-14";
+ break;
+ case 0x0f:
+ charset = "ISO8859-15";
+ break;
+ default:
+ used = 0;
+ break;
+ }
+ } else {
+ used = 1;
+ switch(dvb_text[0]) {
+ case 0x01:
+ charset = "ISO8859-5";
+ break;
+ case 0x02:
+ charset = "ISO8859-6";
+ break;
+ case 0x03:
+ charset = "ISO8859-7";
+ break;
+ case 0x04:
+ charset = "ISO8859-8";
+ break;
+ case 0x05:
+ charset = "ISO8859-9";
+ break;
+ case 0x06:
+ charset = "ISO8859-10";
+ break;
+ case 0x07:
+ charset = "ISO8859-11";
+ break;
+ case 0x09:
+ charset = "ISO8859-13";
+ break;
+ case 0x0a:
+ charset = "ISO8859-14";
+ break;
+ case 0x0b:
+ charset = "ISO8859-15";
+ break;
+ case 0x11:
+ charset = "UTF16";
+ break;
+ case 0x12:
+ charset = "EUC-KR";
+ break;
+ case 0x13:
+ charset = "GB2312";
+ break;
+ case 0x14:
+ charset = "GBK";
+ break;
+ case 0x15:
+ charset = "UTF8";
+ break;
+ default:
+ used = 0;
+ break;
+ }
+ }
+exit:
+ *consumed = used;
+ return charset;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/types.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/types.h
new file mode 100644
index 0000000..f26ea6b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/types.h
@@ -0,0 +1,127 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_TYPES_H
+#define _UCSI_DVB_TYPES_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+#include <time.h>
+
+typedef uint8_t dvbdate_t[5];
+typedef uint8_t dvbduration_t[3];
+typedef uint8_t dvbhhmm_t[2];
+
+/**
+ * Running status values.
+ */
+enum {
+ DVB_RUNNING_STATUS_NOT_RUNNING = 0x01,
+ DVB_RUNNING_STATUS_FEW_SECONDS = 0x02,
+ DVB_RUNNING_STATUS_PAUSING = 0x03,
+ DVB_RUNNING_STATUS_RUNNING = 0x04
+};
+
+/**
+ * Convert from a 5 byte DVB UTC date to unix time.
+ * Note: this functions expects the DVB date in network byte order.
+ *
+ * @param d Pointer to DVB date.
+ * @return The unix timestamp, or -1 if the dvbdate was set to the 'undefined' value
+ */
+extern time_t dvbdate_to_unixtime(dvbdate_t dvbdate);
+
+/**
+ * Convert from a unix timestemp to a 5 byte DVB UTC date.
+ * Note: this function will always output the DVB date in
+ * network byte order.
+ *
+ * @param unixtime The unix timestamp, or -1 for the 'undefined' value.
+ * @param utc Pointer to 5 byte DVB date.
+ */
+extern void unixtime_to_dvbdate(time_t unixtime, dvbdate_t dvbdate);
+
+/**
+ * Convert from a DVB BCD duration to a number of seconds.
+ *
+ * @param dvbduration Pointer to 3 byte DVB duration.
+ * @return Number of seconds.
+ */
+extern int dvbduration_to_seconds(dvbduration_t dvbduration);
+
+/**
+ * Convert from a number of seconds to a DVB 3 byte BCD duration.
+ *
+ * @param seconds The number of seconds.
+ * @param dvbduration Pointer to 3 byte DVB duration.
+ */
+extern void seconds_to_dvbduration(int seconds, dvbduration_t dvbduration);
+
+/**
+ * Convert from a DVB BCD HHMM to a number of seconds.
+ *
+ * @param dvbduration Pointer to 2 byte DVB HHMM.
+ * @return Number of seconds.
+ */
+extern int dvbhhmm_to_seconds(dvbhhmm_t dvbhhmm);
+
+/**
+ * Convert from a number of seconds to a DVB 2 byte BCD HHMM.
+ *
+ * @param seconds The number of seconds.
+ * @param dvbduration Pointer to 2 byte DVB HHMM.
+ */
+extern void seconds_to_dvbhhmm(int seconds, dvbhhmm_t dvbhhmm);
+
+/**
+ * Convert a __ucsi_packed BCD value into a normal integer.
+ *
+ * @param bcd The value to convert.
+ * @return The value.
+ */
+extern uint32_t bcd_to_integer(uint32_t bcd);
+
+/**
+ * Convert a normal integer into a __ucsi_packed BCD value.
+ *
+ * @param integer The value to convert.
+ * @return The value.
+ */
+extern uint32_t integer_to_bcd(uint32_t integer);
+
+/**
+ * Determine the (iconv compatable) character set of a dvb string.
+ *
+ * @param dvb_text DVB text concerned.
+ * @param dvb_text_length Length of text.
+ * @param consumed Out parameter of number of bytes used to encode the character set.
+ * @return Name of the character set.
+ */
+extern const char *dvb_charset(char *dvb_text, int dvb_text_length, int *consumed);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/vbi_data_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/vbi_data_descriptor.h
new file mode 100644
index 0000000..9d41e0c
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/vbi_data_descriptor.h
@@ -0,0 +1,186 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_VBI_DATA_DESCRIPTOR
+#define _UCSI_DVB_VBI_DATA_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Possible values for the data_service_id field.
+ */
+enum {
+ DVB_VBI_DATA_SERVICE_ID_EBU = 0x01,
+ DVB_VBI_DATA_SERVICE_ID_INVERTED = 0x02,
+ DVB_VBI_DATA_SERVICE_ID_VPS = 0x04,
+ DVB_VBI_DATA_SERVICE_ID_WSS = 0x05,
+ DVB_VBI_DATA_SERVICE_ID_CC = 0x06,
+ DVB_VBI_DATA_SERVICE_ID_MONO_422 = 0x07
+};
+
+/**
+ * dvb_vbi_data_descriptor structure
+ */
+struct dvb_vbi_data_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_vbi_data_entry entries[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the dvb_vbi_data_descriptor entries field.
+ */
+struct dvb_vbi_data_entry {
+ uint8_t data_service_id;
+ uint8_t data_length;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * Format of the dvb_vbi_data_entry data field, if data_service_id == 1,2,4,5,6,7.
+ */
+struct dvb_vbi_data_x {
+ EBIT3(uint8_t reserved : 2; ,
+ uint8_t field_parity : 1; ,
+ uint8_t line_offset : 5; )
+} __ucsi_packed;
+
+/**
+ * Process a dvb_vbi_data_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return dvb_vbi_data_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_vbi_data_descriptor*
+ dvb_vbi_data_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* p = (uint8_t*) d + 2;
+ uint32_t pos = 0;
+ uint32_t len = d->len;
+
+ while(pos < len) {
+ struct dvb_vbi_data_entry *e =
+ (struct dvb_vbi_data_entry*) (p+pos);
+
+ pos += sizeof(struct dvb_vbi_data_entry);
+
+ if (pos > len)
+ return NULL;
+
+ pos += e->data_length;
+
+ if (pos > len)
+ return NULL;
+ }
+
+ return (struct dvb_vbi_data_descriptor*) d;
+}
+
+/**
+ * Iterator for entries field in a dvb_vbi_data_descriptor structure.
+ *
+ * @param d Pointer to dvb_vbi_data_descriptor structure.
+ * @param pos Variable holding pointer to the current dvb_vbi_data_entry structure.
+ */
+#define dvb_vbi_data_descriptor_entries_for_each(d, pos) \
+ for ((pos) = dvb_vbi_data_descriptor_entries_first(d); \
+ (pos); \
+ (pos) = dvb_vbi_data_descriptor_entries_next(d, pos))
+
+/**
+ * Get a pointer to the data field of a dvb_vbi_data_entry.
+ *
+ * @param d dvb_vbi_data_entry structure.
+ * @return Pointer to the data field.
+ */
+static inline uint8_t *
+ dvb_vbi_data_entry_data(struct dvb_vbi_data_entry *d)
+{
+ return (uint8_t *) d + sizeof(struct dvb_vbi_data_entry);
+}
+
+/**
+ * Get a pointer to the data field of a dvb_vbi_data_x for id 1,2,4,5,6,7.
+ *
+ * @param d dvb_vbi_data_entry structure.
+ * @return Pointer to the data field, or NULL if invalid
+ */
+static inline struct dvb_vbi_data_x*
+ dvb_vbi_data_entry_data_x(struct dvb_vbi_data_entry *d)
+{
+ switch(d->data_service_id) {
+ case 1:
+ case 2:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ return (struct dvb_vbi_data_x*) ((uint8_t *) d + sizeof(struct dvb_vbi_data_entry));
+ }
+
+ return NULL;
+}
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_vbi_data_entry*
+ dvb_vbi_data_descriptor_entries_first(struct dvb_vbi_data_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_vbi_data_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_vbi_data_descriptor));
+}
+
+static inline struct dvb_vbi_data_entry*
+ dvb_vbi_data_descriptor_entries_next(struct dvb_vbi_data_descriptor *d,
+ struct dvb_vbi_data_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_vbi_data_entry) +
+ pos->data_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_vbi_data_entry *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/dvb/vbi_teletext_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/dvb/vbi_teletext_descriptor.h
new file mode 100644
index 0000000..6ae9791
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/dvb/vbi_teletext_descriptor.h
@@ -0,0 +1,116 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_DVB_VBI_TELETEXT_DESCRIPTOR
+#define _UCSI_DVB_VBI_TELETEXT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * dvb_vbi_teletext_descriptor structure
+ */
+struct dvb_vbi_teletext_descriptor {
+ struct descriptor d;
+
+ /* struct dvb_vbi_teletext_entry entries[] */
+} __ucsi_packed;
+
+/**
+ * An entry in a dvb_vbi_teletext_descriptor structure.
+ */
+struct dvb_vbi_teletext_entry {
+ iso639lang_t language_code;
+ EBIT2(uint8_t type : 5; ,
+ uint8_t magazine_number: 3; )
+ uint8_t page_number;
+} __ucsi_packed;
+
+/**
+ * Process an dvb_vbi_teletext_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return dvb_vbi_teletext_descriptor pointer, or NULL on error.
+ */
+static inline struct dvb_vbi_teletext_descriptor*
+ dvb_vbi_teletext_descriptor_codec(struct descriptor* d)
+{
+ if (d->len % sizeof(struct dvb_vbi_teletext_entry))
+ return NULL;
+
+ return (struct dvb_vbi_teletext_descriptor*) d;
+}
+
+/**
+ * Iterator for entries field of a dvb_vbi_teletext_descriptor.
+ *
+ * @param d Pointer to dvb_vbi_teletext_descriptor.
+ * @param pos Variable holding a pointer to the current dvb_vbi_teletext_entry.
+ */
+#define dvb_vbi_teletext_descriptor_entries_for_each(d, pos) \
+ for ((pos) = dvb_vbi_teletext_descriptor_entries_first(d); \
+ (pos); \
+ (pos) = dvb_vbi_teletext_descriptor_entries_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct dvb_vbi_teletext_entry*
+ dvb_vbi_teletext_descriptor_entries_first(struct dvb_vbi_teletext_descriptor *d)
+{
+ if (d->d.len == 0)
+ return NULL;
+
+ return (struct dvb_vbi_teletext_entry *)
+ ((uint8_t*) d + sizeof(struct dvb_vbi_teletext_descriptor));
+}
+
+static inline struct dvb_vbi_teletext_entry*
+ dvb_vbi_teletext_descriptor_entries_next(struct dvb_vbi_teletext_descriptor *d,
+ struct dvb_vbi_teletext_entry *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct dvb_vbi_teletext_entry);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct dvb_vbi_teletext_entry *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/endianops.h b/kaffeine/src/input/dvb/lib/libucsi/endianops.h
new file mode 100644
index 0000000..23b418b
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/endianops.h
@@ -0,0 +1,128 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_COMMON_H
+#define _UCSI_COMMON_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+#include <byteswap.h>
+#include <endian.h>
+
+#define __ucsi_packed __attribute__((packed))
+
+
+
+
+#if __BYTE_ORDER == __BIG_ENDIAN
+#define EBIT2(x1,x2) x1 x2
+#define EBIT3(x1,x2,x3) x1 x2 x3
+#define EBIT4(x1,x2,x3,x4) x1 x2 x3 x4
+#define EBIT5(x1,x2,x3,x4,x5) x1 x2 x3 x4 x5
+#define EBIT6(x1,x2,x3,x4,x5,x6) x1 x2 x3 x4 x5 x6
+#define EBIT7(x1,x2,x3,x4,x5,x6,x7) x1 x2 x3 x4 x5 x6 x7
+#define EBIT8(x1,x2,x3,x4,x5,x6,x7,x8) x1 x2 x3 x4 x5 x6 x7 x8
+
+static inline void bswap16(uint8_t *buf) {
+ (void) buf;
+}
+
+static inline void bswap32(uint8_t *buf) {
+ (void) buf;
+}
+
+static inline void bswap64(uint8_t *buf) {
+ (void) buf;
+}
+
+static inline void bswap24(uint8_t *buf) {
+ (void) buf;
+}
+
+static inline void bswap40(uint8_t *buf) {
+ (void) buf;
+}
+
+static inline void bswap48(uint8_t *buf) {
+ (void) buf;
+}
+
+#else
+#define EBIT2(x1,x2) x2 x1
+#define EBIT3(x1,x2,x3) x3 x2 x1
+#define EBIT4(x1,x2,x3,x4) x4 x3 x2 x1
+#define EBIT5(x1,x2,x3,x4,x5) x5 x4 x3 x2 x1
+#define EBIT6(x1,x2,x3,x4,x5,x6) x6 x5 x4 x3 x2 x1
+#define EBIT7(x1,x2,x3,x4,x5,x6,x7) x7 x6 x5 x4 x3 x2 x1
+#define EBIT8(x1,x2,x3,x4,x5,x6,x7,x8) x8 x7 x6 x5 x4 x3 x2 x1
+
+static inline void bswap16(uint8_t * buf) {
+ *((uint16_t*)buf) = bswap_16((*(uint16_t*)buf));
+}
+
+static inline void bswap32(uint8_t * buf) {
+ *((uint32_t*)buf) = bswap_32((*(uint32_t*)buf));
+}
+
+static inline void bswap64(uint8_t * buf) {
+ *((uint64_t*)buf) = bswap_64((*(uint64_t*)buf));
+}
+
+static inline void bswap24(uint8_t * buf) {
+ uint8_t tmp0 = buf[0];
+
+ buf[0] = buf[2];
+ buf[2] = tmp0;
+}
+
+static inline void bswap40(uint8_t * buf) {
+ uint8_t tmp0 = buf[0];
+ uint8_t tmp1 = buf[1];
+
+ buf[0] = buf[4];
+ buf[1] = buf[3];
+ buf[3] = tmp1;
+ buf[4] = tmp0;
+}
+
+static inline void bswap48(uint8_t * buf) {
+ uint8_t tmp0 = buf[0];
+ uint8_t tmp1 = buf[1];
+ uint8_t tmp2 = buf[2];
+
+ buf[0] = buf[5];
+ buf[1] = buf[4];
+ buf[2] = buf[3];
+ buf[3] = tmp2;
+ buf[4] = tmp1;
+ buf[5] = tmp0;
+}
+
+#endif // __BYTE_ORDER
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/Makefile.am b/kaffeine/src/input/dvb/lib/libucsi/mpeg/Makefile.am
new file mode 100644
index 0000000..a8d0c32
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/Makefile.am
@@ -0,0 +1,12 @@
+noinst_LTLIBRARIES = libdvbmpeg.la
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/dvb/lib
+
+libdvbmpeg_la_SOURCES = cat_section.c \
+ metadata_section.c \
+ odsmt_section.c \
+ pat_section.c \
+ pmt_section.c \
+ tsdt_section.c
+
+CFLAGS = -g -O2 -Wall -Wshadow -Wpointer-arith -Wstrict-prototypes -fPIC
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/audio_stream_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/audio_stream_descriptor.h
new file mode 100644
index 0000000..7e6ea07
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/audio_stream_descriptor.h
@@ -0,0 +1,65 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_AUDIO_STREAM_DESCRIPTOR
+#define _UCSI_MPEG_AUDIO_STREAM_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_audio_stream_descriptor structure
+ */
+struct mpeg_audio_stream_descriptor {
+ struct descriptor d;
+
+ EBIT5(uint8_t free_format_flag : 1; ,
+ uint8_t id : 1; ,
+ uint8_t layer : 2; ,
+ uint8_t variable_rate_audio_indicator : 1; ,
+ uint8_t reserved : 3; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_audio_stream_descriptor.
+ *
+ * @param d Pointer to the generic descriptor structure.
+ * @return Pointer to the mpeg_audio_stream_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_audio_stream_descriptor*
+ mpeg_audio_stream_descriptor_codec(struct descriptor *d)
+{
+ if (d->len != (sizeof(struct mpeg_audio_stream_descriptor) - 2))
+ return NULL;
+
+ return (struct mpeg_audio_stream_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/ca_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/ca_descriptor.h
new file mode 100644
index 0000000..88a65dd
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/ca_descriptor.h
@@ -0,0 +1,91 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_CA_DESCRIPTOR
+#define _UCSI_MPEG_CA_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_ca_descriptor structure
+ */
+struct mpeg_ca_descriptor {
+ struct descriptor d;
+
+ uint16_t ca_system_id;
+ EBIT2(uint16_t reserved : 3; ,
+ uint16_t ca_pid : 13; );
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_ca_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return Pointer to an mpeg_ca_descriptor, or NULL on error.
+ */
+static inline struct mpeg_ca_descriptor*
+ mpeg_ca_descriptor_codec(struct descriptor* d)
+{
+ if (d->len < (sizeof(struct mpeg_ca_descriptor) - 2))
+ return NULL;
+
+ bswap16((uint8_t*) d + 2);
+ bswap16((uint8_t*) d + 4);
+
+ return (struct mpeg_ca_descriptor*) d;
+}
+
+/**
+ * Accessor for pointer to data field of an mpeg_ca_descriptor.
+ *
+ * @param d The mpeg_ca_descriptor structure.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ mpeg_ca_descriptor_data(struct mpeg_ca_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct mpeg_ca_descriptor);
+}
+
+/**
+ * Determine length of data field of an mpeg_ca_descriptor.
+ *
+ * @param d The mpeg_ca_descriptor structure.
+ * @return Length of the field in bytes.
+ */
+static inline int
+ mpeg_ca_descriptor_data_length(struct mpeg_ca_descriptor *d)
+{
+ return d->d.len - 4;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/cat_section.c b/kaffeine/src/input/dvb/lib/libucsi/mpeg/cat_section.c
new file mode 100644
index 0000000..c72973e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/cat_section.c
@@ -0,0 +1,34 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/mpeg/cat_section.h>
+
+struct mpeg_cat_section * mpeg_cat_section_codec(struct section_ext * ext)
+{
+ uint8_t * buf = (uint8_t *)ext;
+ int pos = sizeof(struct section_ext);
+
+ if (verify_descriptors(buf + pos,
+ section_ext_length(ext) - sizeof(struct mpeg_cat_section)))
+ return NULL;
+
+ return (struct mpeg_cat_section *)ext;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/cat_section.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/cat_section.h
new file mode 100644
index 0000000..864b19e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/cat_section.h
@@ -0,0 +1,94 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_CAT_SECTION_H
+#define _UCSI_MPEG_CAT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * mpeg_cat_section structure.
+ */
+struct mpeg_cat_section {
+ struct section_ext head;
+
+ /* struct descriptor descriptors[] */
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_cat_section.
+ *
+ * @param section The generic section_ext structure.
+ * @return Pointer to an mpeg_cat_section structure, or NULL on error.
+ */
+extern struct mpeg_cat_section *mpeg_cat_section_codec(struct section_ext *section);
+
+/**
+ * Convenience iterator for descriptors field of an mpeg_cat_section.
+ *
+ * @param cat The mpeg_cat_section pointer.
+ * @param pos Variable holding a pointer to the current descriptor.
+ */
+#define mpeg_cat_section_descriptors_for_each(cat, pos) \
+ for ((pos) = mpeg_cat_section_descriptors_first(cat); \
+ (pos); \
+ (pos) = mpeg_cat_section_descriptors_next(cat, pos))
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct descriptor *
+ mpeg_cat_section_descriptors_first(struct mpeg_cat_section *cat)
+{
+ int pos = sizeof(struct mpeg_cat_section);
+
+ if (pos >= section_ext_length(&cat->head))
+ return NULL;
+
+ return (struct descriptor*)((uint8_t *) cat + pos);
+}
+
+
+static inline struct descriptor *
+ mpeg_cat_section_descriptors_next(struct mpeg_cat_section *cat,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t *) cat + sizeof(struct mpeg_cat_section),
+ section_ext_length(&cat->head) - sizeof(struct mpeg_cat_section),
+ pos);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/content_labelling_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/content_labelling_descriptor.h
new file mode 100644
index 0000000..06738ab
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/content_labelling_descriptor.h
@@ -0,0 +1,356 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_CONTENT_LABELLING_DESCRIPTOR
+#define _UCSI_MPEG_CONTENT_LABELLING_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Possible values for content_time_base_indicator.
+ */
+enum {
+ MPEG_CONTENT_TIME_BASE_STC = 0x01,
+ MPEG_CONTENT_TIME_BASE_NPT = 0x02,
+};
+
+/**
+ * mpeg_content_labelling_descriptor structure.
+ */
+struct mpeg_content_labelling_descriptor {
+ struct descriptor d;
+
+ uint16_t metadata_application_format;
+ /* struct mpeg_content_labelling_descriptor_application_format_identifier id */
+ /* struct mpeg_content_labelling_descriptor_flags flags */
+ /* struct mpeg_content_labelling_descriptor_reference_id reference_id */
+ /* struct mpeg_content_labelling_descriptor_time_base time_base */
+ /* struct mpeg_content_labelling_descriptor_content_id content_id */
+ /* struct mpeg_content_labelling_descriptor_time_base_association time_base_assoc */
+ /* uint8_t private_data[] */
+} __ucsi_packed;
+
+/**
+ * id field of a content_labelling_descriptor.
+ */
+struct mpeg_content_labelling_descriptor_application_format_identifier {
+ uint32_t id;
+} __ucsi_packed;
+
+/**
+ * Flags field of a content_labelling_descriptor
+ */
+struct mpeg_content_labelling_descriptor_flags {
+ EBIT3(uint8_t content_reference_id_record_flag : 1; ,
+ uint8_t content_time_base_indicator : 4; ,
+ uint8_t reserved : 3; );
+} __ucsi_packed;
+
+/**
+ * Reference_id field of a content_labelling_descriptor.
+ */
+struct mpeg_content_labelling_descriptor_reference_id {
+ uint8_t content_reference_id_record_length;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * time_base field of a content_labelling_descriptor.
+ */
+struct mpeg_content_labelling_descriptor_time_base {
+ EBIT2(uint64_t reserved_1 : 7; ,
+ uint64_t content_time_base_value :33; );
+ EBIT2(uint64_t reserved_2 : 7; ,
+ uint64_t metadata_time_base_value :33; );
+} __ucsi_packed;
+
+/**
+ * content_id field of a content_labelling_descriptor.
+ */
+struct mpeg_content_labelling_descriptor_content_id {
+ EBIT2(uint8_t reserved : 1; ,
+ uint8_t contentId : 7; );
+} __ucsi_packed;
+
+/**
+ * time_base_assoc field of a content_labelling_descriptor.
+ */
+struct mpeg_content_labelling_descriptor_time_base_association {
+ uint8_t time_base_association_data_length;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+
+
+/**
+ * Process an mpeg_content_labelling_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return Pointer to an mpeg_content_labelling_descriptor, or NULL on error.
+ */
+static inline struct mpeg_content_labelling_descriptor*
+ mpeg_content_labelling_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 2;
+ uint8_t *buf = (uint8_t*) d;
+ uint32_t len = d->len + 2;
+ struct mpeg_content_labelling_descriptor_flags *flags;
+ int id;
+
+ if (len < sizeof(struct mpeg_content_labelling_descriptor))
+ return NULL;
+
+ bswap16(buf + pos);
+ id = *((uint16_t*) (buf+pos));
+ pos += 2;
+
+ if (id == 0xffff) {
+ if (len < (pos+4))
+ return NULL;
+ bswap32(buf+pos);
+ pos += 4;
+ }
+
+ if (len < (pos + sizeof(struct mpeg_content_labelling_descriptor_flags)))
+ return NULL;
+ flags = (struct mpeg_content_labelling_descriptor_flags*) (buf+pos);
+ pos += sizeof(struct mpeg_content_labelling_descriptor_flags);
+
+ if (flags->content_reference_id_record_flag == 1) {
+ if (len < (pos+1))
+ return NULL;
+ if (len < (pos+1+buf[pos]))
+ return NULL;
+ pos += 1 + buf[pos];
+ }
+
+ if ((flags->content_time_base_indicator == 1) ||
+ (flags->content_time_base_indicator == 2)) {
+ if (len < (pos + sizeof(struct mpeg_content_labelling_descriptor_time_base)))
+ return NULL;
+ bswap40(buf+pos);
+ bswap40(buf+pos+5);
+ pos += sizeof(struct mpeg_content_labelling_descriptor_time_base);
+ }
+
+ if (flags->content_time_base_indicator == 2) {
+ if (len < (pos + sizeof(struct mpeg_content_labelling_descriptor_content_id)))
+ return NULL;
+ pos += sizeof(struct mpeg_content_labelling_descriptor_content_id);
+ }
+
+ if (flags->content_time_base_indicator > 2) {
+ if (len < (pos+1))
+ return NULL;
+ if (len < (pos+1+buf[pos]))
+ return NULL;
+ pos += 1 + buf[pos];
+ }
+
+ if (len < pos)
+ return NULL;
+
+ return (struct mpeg_content_labelling_descriptor*) d;
+}
+
+/**
+ * Accessor for pointer to id field of an mpeg_content_labelling_descriptor.
+ *
+ * @param d The mpeg_content_labelling_descriptor structure.
+ * @return The pointer, or NULL on error.
+ */
+static inline struct mpeg_content_labelling_descriptor_application_format_identifier*
+ mpeg_content_labelling_descriptor_id(struct mpeg_content_labelling_descriptor *d)
+{
+ uint8_t *buf = (uint8_t*) d;
+
+ if (d->metadata_application_format != 0xffff)
+ return NULL;
+ return (struct mpeg_content_labelling_descriptor_application_format_identifier*)
+ (buf + sizeof(struct mpeg_content_labelling_descriptor));
+}
+
+/**
+ * Accessor for pointer to flags field of an mpeg_content_labelling_descriptor.
+ *
+ * @param d The mpeg_content_labelling_descriptor structure.
+ * @return The pointer, or NULL on error.
+ */
+static inline struct mpeg_content_labelling_descriptor_flags*
+ mpeg_content_labelling_descriptor_flags(struct mpeg_content_labelling_descriptor *d)
+{
+ uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_content_labelling_descriptor);
+
+ if (d->metadata_application_format != 0xffff)
+ buf += 4;
+
+ return (struct mpeg_content_labelling_descriptor_flags *) buf;
+}
+
+/**
+ * Accessor for reference_id field of an mpeg_content_labelling_descriptor.
+ *
+ * @param flags Pointer to the mpeg_content_labelling_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_content_labelling_descriptor_reference_id*
+ mpeg_content_labelling_descriptor_reference_id(struct mpeg_content_labelling_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags);
+
+ if (flags->content_reference_id_record_flag != 1)
+ return NULL;
+
+ return (struct mpeg_content_labelling_descriptor_reference_id *) buf;
+}
+
+/**
+ * Accessor for data field of an mpeg_content_reference_id.
+ *
+ * @param d The mpeg_content_reference_id structure.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ mpeg_content_reference_id_data(struct mpeg_content_labelling_descriptor_reference_id *d)
+{
+ return (uint8_t*) d + sizeof(struct mpeg_content_labelling_descriptor_reference_id);
+}
+
+/**
+ * Accessor for time_base field of an mpeg_content_labelling_descriptor.
+ *
+ * @param flags Pointer to the mpeg_content_labelling_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_content_labelling_descriptor_time_base*
+ mpeg_content_labelling_descriptor_time_base(struct mpeg_content_labelling_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags);
+
+ if ((flags->content_time_base_indicator!=1) && (flags->content_time_base_indicator!=2))
+ return NULL;
+
+ if (flags->content_reference_id_record_flag == 1)
+ buf += 1 + buf[1];
+
+ return (struct mpeg_content_labelling_descriptor_time_base *) buf;
+}
+
+/**
+ * Accessor for content_id field of an mpeg_content_labelling_descriptor.
+ *
+ * @param flags Pointer to the mpeg_content_labelling_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_content_labelling_descriptor_content_id*
+ mpeg_content_labelling_descriptor_content_id(struct mpeg_content_labelling_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags);
+
+ if (flags->content_time_base_indicator!=2)
+ return NULL;
+
+ if (flags->content_reference_id_record_flag == 1)
+ buf += 1 + buf[1];
+ if ((flags->content_time_base_indicator==1) || (flags->content_time_base_indicator==2))
+ buf += sizeof(struct mpeg_content_labelling_descriptor_time_base);
+
+ return (struct mpeg_content_labelling_descriptor_content_id *) buf;
+}
+
+/**
+ * Accessor for time_base_association field of an mpeg_content_labelling_descriptor.
+ *
+ * @param flags Pointer to the mpeg_content_labelling_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_content_labelling_descriptor_time_base_association*
+ mpeg_content_labelling_descriptor_time_base_assoc(struct mpeg_content_labelling_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags);
+
+ if (flags->content_time_base_indicator<3)
+ return NULL;
+
+ if (flags->content_reference_id_record_flag == 1)
+ buf += 1 + buf[1];
+ if ((flags->content_time_base_indicator==1) || (flags->content_time_base_indicator==2))
+ buf += sizeof(struct mpeg_content_labelling_descriptor_time_base);
+ if (flags->content_time_base_indicator==2)
+ buf += sizeof(struct mpeg_content_labelling_descriptor_content_id);
+
+ return (struct mpeg_content_labelling_descriptor_time_base_association *) buf;
+}
+
+/**
+ * Accessor for data field of an mpeg_time_base_association.
+ *
+ * @param d The mpeg_time_base_association structure.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ mpeg_time_base_association_data(struct mpeg_content_labelling_descriptor_time_base_association *d)
+{
+ return (uint8_t*) d + sizeof(struct mpeg_content_labelling_descriptor_time_base_association);
+}
+
+
+/**
+ * Accessor for private_data field of an mpeg_content_labelling_descriptor.
+ *
+ * @param d The mpeg_content_labelling_descriptor structure.
+ * @param flags Pointer to the mpeg_content_labelling_descriptor_flags.
+ * @param length Where the number of bytes in the field should be stored.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ mpeg_content_labelling_descriptor_data(struct mpeg_content_labelling_descriptor *d,
+ struct mpeg_content_labelling_descriptor_flags *flags,
+ int *length)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_content_labelling_descriptor_flags);
+ uint8_t *end = (uint8_t*) d + d->d.len + 2;
+
+ if (flags->content_reference_id_record_flag == 1)
+ buf += 1 + buf[1];
+ if ((flags->content_time_base_indicator==1) || (flags->content_time_base_indicator==2))
+ buf += sizeof(struct mpeg_content_labelling_descriptor_time_base);
+ if (flags->content_time_base_indicator==2)
+ buf += sizeof(struct mpeg_content_labelling_descriptor_content_id);
+ if (flags->content_time_base_indicator<3)
+ buf += 1 + buf[1];
+
+ *length = end - buf;
+
+ return buf;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/copyright_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/copyright_descriptor.h
new file mode 100644
index 0000000..5991fe9
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/copyright_descriptor.h
@@ -0,0 +1,89 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_COPYRIGHT_DESCRIPTOR
+#define _UCSI_MPEG_COPYRIGHT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_copyright_descriptor structure.
+ */
+struct mpeg_copyright_descriptor {
+ struct descriptor d;
+
+ uint32_t copyright_identifier;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_copyright_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return mpeg_copyright_descriptor pointer, or NULL on error.
+ */
+static inline struct mpeg_copyright_descriptor*
+ mpeg_copyright_descriptor_codec(struct descriptor* d)
+{
+ if (d->len < (sizeof(struct mpeg_copyright_descriptor) - 2))
+ return NULL;
+
+ bswap32((uint8_t*) d + 2);
+
+ return (struct mpeg_copyright_descriptor*) d;
+}
+
+/**
+ * Retrieve pointer to data field of an mpeg_copyright_descriptor.
+ *
+ * @param d mpeg_copyright_descriptor pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ mpeg_copyright_descriptor_data(struct mpeg_copyright_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct mpeg_copyright_descriptor);
+}
+
+
+/**
+ * Determine length of the data field of an mpeg_copyright_descriptor.
+ *
+ * @param d mpeg_copyright_descriptor pointer.
+ * @return Length of field in bytes.
+ */
+static inline int
+ mpeg_copyright_descriptor_data_length(struct mpeg_copyright_descriptor *d)
+{
+ return d->d.len - 4;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/data_stream_alignment_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/data_stream_alignment_descriptor.h
new file mode 100644
index 0000000..887495f
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/data_stream_alignment_descriptor.h
@@ -0,0 +1,73 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_DATA_STREAM_ALIGNMENT_DESCRIPTOR
+#define _UCSI_MPEG_DATA_STREAM_ALIGNMENT_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Possible values for alignment_type.
+ */
+enum {
+ MPEG_DATA_STREAM_ALIGNMENT_VIDEO_SLICE_OR_AU = 0x01,
+ MPEG_DATA_STREAM_ALIGNMENT_VIDEO_AU = 0x02,
+ MPEG_DATA_STREAM_ALIGNMENT_VIDEO_GOP_OR_SEQ = 0x03,
+ MPEG_DATA_STREAM_ALIGNMENT_VIDEO_SEQ = 0x04,
+
+ MPEG_DATA_STREAM_ALIGNMENT_AUDIO_SYNC_WORD = 0x01,
+};
+
+/**
+ * mpeg_data_stream_alignment_descriptor structure.
+ */
+struct mpeg_data_stream_alignment_descriptor {
+ struct descriptor d;
+
+ uint8_t alignment_type;
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_data_stream_alignment_descriptor.
+ *
+ * @param d Pointer to generic descriptor structure.
+ * @return Pointer to mpeg_data_stream_alignment_descriptor, or NULL on error.
+ */
+static inline struct mpeg_data_stream_alignment_descriptor*
+ mpeg_data_stream_alignment_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_data_stream_alignment_descriptor) - 2))
+ return NULL;
+
+ return (struct mpeg_data_stream_alignment_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/descriptor.h
new file mode 100644
index 0000000..c32775f
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/descriptor.h
@@ -0,0 +1,102 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_DESCRIPTOR_H
+#define _UCSI_MPEG_DESCRIPTOR_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/mpeg/mpeg4_audio_descriptor.h>
+#include <libucsi/mpeg/mpeg4_video_descriptor.h>
+#include <libucsi/mpeg/audio_stream_descriptor.h>
+#include <libucsi/mpeg/ca_descriptor.h>
+#include <libucsi/mpeg/content_labelling_descriptor.h>
+#include <libucsi/mpeg/copyright_descriptor.h>
+#include <libucsi/mpeg/data_stream_alignment_descriptor.h>
+#include <libucsi/mpeg/external_es_id_descriptor.h>
+#include <libucsi/mpeg/fmc_descriptor.h>
+#include <libucsi/mpeg/fmxbuffer_size_descriptor.h>
+#include <libucsi/mpeg/hierarchy_descriptor.h>
+#include <libucsi/mpeg/ibp_descriptor.h>
+#include <libucsi/mpeg/iod_descriptor.h>
+#include <libucsi/mpeg/iso_639_language_descriptor.h>
+#include <libucsi/mpeg/maximum_bitrate_descriptor.h>
+#include <libucsi/mpeg/metadata_descriptor.h>
+#include <libucsi/mpeg/metadata_pointer_descriptor.h>
+#include <libucsi/mpeg/metadata_std_descriptor.h>
+#include <libucsi/mpeg/multiplex_buffer_descriptor.h>
+#include <libucsi/mpeg/multiplex_buffer_utilization_descriptor.h>
+#include <libucsi/mpeg/muxcode_descriptor.h>
+#include <libucsi/mpeg/private_data_indicator_descriptor.h>
+#include <libucsi/mpeg/registration_descriptor.h>
+#include <libucsi/mpeg/sl_descriptor.h>
+#include <libucsi/mpeg/smoothing_buffer_descriptor.h>
+#include <libucsi/mpeg/std_descriptor.h>
+#include <libucsi/mpeg/system_clock_descriptor.h>
+#include <libucsi/mpeg/target_background_grid_descriptor.h>
+#include <libucsi/mpeg/video_stream_descriptor.h>
+#include <libucsi/mpeg/video_window_descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Enumeration of MPEG descriptor tags.
+ */
+enum mpeg_descriptor_tag {
+ dtag_mpeg_video_stream = 0x02,
+ dtag_mpeg_audio_stream = 0x03,
+ dtag_mpeg_hierarchy = 0x04,
+ dtag_mpeg_registration = 0x05,
+ dtag_mpeg_data_stream_alignment = 0x06,
+ dtag_mpeg_target_background_grid = 0x07,
+ dtag_mpeg_video_window = 0x08,
+ dtag_mpeg_ca = 0x09,
+ dtag_mpeg_iso_639_language = 0x0a,
+ dtag_mpeg_system_clock = 0x0b,
+ dtag_mpeg_multiplex_buffer_utilization = 0x0c,
+ dtag_mpeg_copyright = 0x0d,
+ dtag_mpeg_maximum_bitrate = 0x0e,
+ dtag_mpeg_private_data_indicator = 0x0f,
+ dtag_mpeg_smoothing_buffer = 0x10,
+ dtag_mpeg_std = 0x11,
+ dtag_mpeg_ibp = 0x12,
+ dtag_mpeg_4_video = 0x1b,
+ dtag_mpeg_4_audio = 0x1c,
+ dtag_mpeg_iod = 0x1d,
+ dtag_mpeg_sl = 0x1e,
+ dtag_mpeg_fmc = 0x1f,
+ dtag_mpeg_external_es_id = 0x20,
+ dtag_mpeg_muxcode = 0x21,
+ dtag_mpeg_fmxbuffer_size = 0x22,
+ dtag_mpeg_multiplex_buffer = 0x23,
+ dtag_mpeg_content_labelling = 0x24,
+ dtag_mpeg_metadata_pointer = 0x25,
+ dtag_mpeg_metadata = 0x26,
+ dtag_mpeg_metadata_std = 0x27,
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/external_es_id_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/external_es_id_descriptor.h
new file mode 100644
index 0000000..3aa3237
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/external_es_id_descriptor.h
@@ -0,0 +1,63 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_EXTERNAL_ES_ID_DESCRIPTOR
+#define _UCSI_MPEG_EXTERNAL_ES_ID_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_external_es_id_descriptor structure.
+ */
+struct mpeg_external_es_id_descriptor {
+ struct descriptor d;
+
+ uint16_t external_es_id;
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_external_es_id_descriptor structure.
+ *
+ * @param d Generic descriptor structure.
+ * @return mpeg_external_es_id_descriptor pointer, or NULL on error.
+ */
+static inline struct mpeg_external_es_id_descriptor*
+ mpeg_external_es_id_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_external_es_id_descriptor) - 2))
+ return NULL;
+
+ bswap16((uint8_t*) d + 2);
+
+ return (struct mpeg_external_es_id_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/fmc_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/fmc_descriptor.h
new file mode 100644
index 0000000..5a5bed2
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/fmc_descriptor.h
@@ -0,0 +1,122 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_FMC_DESCRIPTOR
+#define _UCSI_MPEG_FMC_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_fmc_descriptor structure.
+ */
+struct mpeg_fmc_descriptor {
+ struct descriptor d;
+
+ /* struct mpeg_flex_mux muxes[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the muxes field of an mpeg_fmc_descriptor structure.
+ */
+struct mpeg_flex_mux {
+ uint16_t es_id;
+ uint8_t flex_mux_channel;
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_fmc_descriptor structure.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to an mpeg_fmc_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_fmc_descriptor*
+ mpeg_fmc_descriptor_codec(struct descriptor* d)
+{
+ uint8_t* buf = (uint8_t*) d + 2;
+ int pos = 0;
+ int len = d->len;
+
+ if (len % sizeof(struct mpeg_flex_mux))
+ return NULL;
+
+ while(pos < len) {
+ bswap16(buf+pos);
+ pos += sizeof(struct mpeg_flex_mux);
+ }
+
+ return (struct mpeg_fmc_descriptor*) d;
+}
+
+/**
+ * Convenience iterator for the muxes field of an mpeg_fmc_descriptor structure.
+ *
+ * @param d Generic descriptor structure.
+ * @param pos Variable holding a pointer to the the current entry within the muxes field.
+ */
+#define mpeg_fmc_descriptor_muxes_for_each(d, pos) \
+ for ((pos) = mpeg_fmc_descriptor_muxes_first(d); \
+ (pos); \
+ (pos) = mpeg_fmc_descriptor_muxes_next(d, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct mpeg_flex_mux*
+ mpeg_fmc_descriptor_muxes_first(struct mpeg_fmc_descriptor *d)
+{
+ if (d->d.len < sizeof(struct mpeg_flex_mux))
+ return NULL;
+
+ return (struct mpeg_flex_mux *)
+ ((uint8_t*) d + sizeof(struct mpeg_fmc_descriptor));
+}
+
+static inline struct mpeg_flex_mux*
+ mpeg_fmc_descriptor_muxes_next(struct mpeg_fmc_descriptor *d,
+ struct mpeg_flex_mux *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct mpeg_flex_mux);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct mpeg_flex_mux *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h
new file mode 100644
index 0000000..74f643c
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/fmxbuffer_size_descriptor.h
@@ -0,0 +1,83 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_FMXBUFFER_SIZE_DESCRIPTOR
+#define _UCSI_MPEG_FMXBUFFER_SIZE_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+
+/**
+ * mpeg_fmxbuffer_size_descriptor structure.
+ */
+struct mpeg_fmxbuffer_size_descriptor {
+ struct descriptor d;
+
+ /* uint8_t descriptors[] */
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_fmxbuffer_size_descriptor structure.
+ *
+ * @param d Pointer to a generic descriptor structure.
+ * @return Pointer to an mpeg_fmxbuffer_size_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_fmxbuffer_size_descriptor*
+ mpeg_fmxbuffer_size_descriptor_codec(struct descriptor* d)
+{
+ return (struct mpeg_fmxbuffer_size_descriptor*) d;
+}
+
+/**
+ * Retrieve pointer to descriptors field of mpeg_fmxbuffer_size_descriptor structure.
+ *
+ * @param d mpeg_fmxbuffer_size_descriptor structure pointer.
+ * @return Pointer to the descriptors.
+ */
+static inline uint8_t *
+ mpeg_fmxbuffer_size_descriptor_descriptors(struct mpeg_fmxbuffer_size_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct mpeg_fmxbuffer_size_descriptor);
+}
+
+/**
+ * Calculate the length of the descriptors field of an mpeg_fmxbuffer_size_descriptor structure.
+ *
+ * @param d mpeg_fmxbuffer_size_descriptor structure pointer.
+ * @return Length of descriptors in bytes.
+ */
+static inline int
+ mpeg_fmxbuffer_size_descriptor_descriptors_length(struct mpeg_fmxbuffer_size_descriptor *d)
+{
+ return d->d.len;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/hierarchy_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/hierarchy_descriptor.h
new file mode 100644
index 0000000..a38539d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/hierarchy_descriptor.h
@@ -0,0 +1,83 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_HIERARCHY_DESCRIPTOR
+#define _UCSI_MPEG_HIERARCHY_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Hierarchy type values.
+ */
+enum {
+ MPEG_HIERARCHY_TYPE_ISO13818_2_SPATIAL_SCALABILITY = 0x01,
+ MPEG_HIERARCHY_TYPE_ISO13818_2_SNR_SCALABILITY = 0x02,
+ MPEG_HIERARCHY_TYPE_ISO13818_2_TEMPORAL_SCALABILITY = 0x03,
+ MPEG_HIERARCHY_TYPE_ISO13818_2_DATA_PARTITIONING = 0x04,
+ MPEG_HIERARCHY_TYPE_ISO13818_3_EXTENSION_BITSTREAM = 0x05,
+ MPEG_HIERARCHY_TYPE_ISO13818_1_PRIVATE_BITSTREAM = 0x06,
+ MPEG_HIERARCHY_TYPE_ISO13818_2_MULTI_VIEW_PROFILE = 0x07,
+ MPEG_HIERARCHY_TYPE_BASE_LAYER = 0x0f,
+};
+
+
+/**
+ * mpeg_hierarchy_descriptor structure.
+ */
+struct mpeg_hierarchy_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint8_t reserved_1 : 4; ,
+ uint8_t hierarchy_type : 4; );
+ EBIT2(uint8_t reserved_2 : 2; ,
+ uint8_t hierarchy_layer_index : 6; );
+ EBIT2(uint8_t reserved_3 : 2; ,
+ uint8_t hierarchy_embedded_layer_index : 6; );
+ EBIT2(uint8_t reserved_4 : 2; ,
+ uint8_t hierarchy_channel : 6; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_hierarchy_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to mpeg_hierarchy_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_hierarchy_descriptor*
+ mpeg_hierarchy_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_hierarchy_descriptor) - 2))
+ return NULL;
+
+ return (struct mpeg_hierarchy_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/ibp_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/ibp_descriptor.h
new file mode 100644
index 0000000..e82780a
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/ibp_descriptor.h
@@ -0,0 +1,65 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_IBP_DESCRIPTOR
+#define _UCSI_MPEG_IBP_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_ibp_descriptor structure.
+ */
+struct mpeg_ibp_descriptor {
+ struct descriptor d;
+
+ EBIT3(uint16_t closed_gop_flag : 1; ,
+ uint16_t identical_gop_flag : 1; ,
+ uint16_t max_gop_length : 14; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_ibp_descriptor structure.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to the mpeg_ibp_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_ibp_descriptor*
+ mpeg_ibp_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_ibp_descriptor) - 2))
+ return NULL;
+
+ bswap16((uint8_t*) d + 2);
+
+ return (struct mpeg_ibp_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/iod_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/iod_descriptor.h
new file mode 100644
index 0000000..61de153
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/iod_descriptor.h
@@ -0,0 +1,87 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_IOD_DESCRIPTOR
+#define _UCSI_MPEG_IOD_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_iod_descriptor structure.
+ */
+struct mpeg_iod_descriptor {
+ struct descriptor d;
+
+ uint8_t scope_of_iod_label;
+ uint8_t iod_label;
+ /* uint8_t iod[] */
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_iod_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to an mpeg_iod_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_iod_descriptor*
+ mpeg_iod_descriptor_codec(struct descriptor* d)
+{
+ if (d->len < (sizeof(struct mpeg_iod_descriptor) - 2))
+ return NULL;
+
+ return (struct mpeg_iod_descriptor*) d;
+}
+
+/**
+ * Retrieve pointer to iod field of an mpeg_iod_descriptor structure.
+ *
+ * @param d Pointer to mpeg_iod_descriptor structure.
+ * @return Pointer to the iod field.
+ */
+static inline uint8_t *
+ mpeg_iod_descriptor_iod(struct mpeg_iod_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct mpeg_iod_descriptor);
+}
+
+/**
+ * Calculate the length of the iod field of an mpeg_iod_descriptor structure.
+ *
+ * @param d Pointer to mpeg_iod_descriptor structure.
+ * @return The number of bytes.
+ */
+static inline int
+ mpeg_iod_descriptor_iod_length(struct mpeg_iod_descriptor *d)
+{
+ return d->d.len - 2;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/iso_639_language_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/iso_639_language_descriptor.h
new file mode 100644
index 0000000..5b5aac0
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/iso_639_language_descriptor.h
@@ -0,0 +1,124 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_ISO_639_LANGUAGE_DESCRIPTOR
+#define _UCSI_MPEG_ISO_639_LANGUAGE_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+#include <libucsi/types.h>
+
+/**
+ * Possible values for audio_type.
+ */
+enum {
+ MPEG_AUDIO_TYPE_CLEAN_EFFECTS = 0x01,
+ MPEG_AUDIO_TYPE_HEARING_IMPAIRED = 0x02,
+ MPEG_AUDIO_TYPE_VISUAL_IMPAIRED_COMMENTARY = 0x03,
+};
+
+/**
+ * mpeg_iso_639_language_descriptor structure.
+ */
+struct mpeg_iso_639_language_descriptor {
+ struct descriptor d;
+
+ /* struct mpeg_iso_639_language_code languages[] */
+} __ucsi_packed;
+
+/**
+ * An entry in the mpeg_iso_639_language_descriptor languages field.
+ */
+struct mpeg_iso_639_language_code {
+ iso639lang_t language_code;
+ uint8_t audio_type;
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_iso_639_language_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to an mpeg_iso_639_language_descriptor structure, or NULL
+ * on error.
+ */
+static inline struct mpeg_iso_639_language_descriptor*
+ mpeg_iso_639_language_descriptor_codec(struct descriptor* d)
+{
+ if (d->len % sizeof(struct mpeg_iso_639_language_code))
+ return NULL;
+
+ return (struct mpeg_iso_639_language_descriptor*) d;
+}
+
+/**
+ * Convenience iterator for the languages field of an mpeg_iso_639_language_descriptor
+ *
+ * @param d Pointer to the mpeg_iso_639_language_descriptor structure.
+ * @param pos Variable holding a pointer to the current entry.
+ */
+#define mpeg_iso_639_language_descriptor_languages_for_each(_d, _pos) \
+ for ((_pos) = mpeg_iso_639_language_descriptor_languages_first(_d); \
+ (_pos); \
+ (_pos) = mpeg_iso_639_language_descriptor_languages_next(_d, _pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct mpeg_iso_639_language_code*
+ mpeg_iso_639_language_descriptor_languages_first(struct mpeg_iso_639_language_descriptor *d)
+{
+ if (d->d.len < sizeof(struct mpeg_iso_639_language_code))
+ return NULL;
+
+ return (struct mpeg_iso_639_language_code *)
+ ((uint8_t*) d + sizeof(struct mpeg_iso_639_language_descriptor));
+}
+
+static inline struct mpeg_iso_639_language_code*
+ mpeg_iso_639_language_descriptor_languages_next(struct mpeg_iso_639_language_descriptor *d,
+ struct mpeg_iso_639_language_code *pos)
+{
+ uint8_t *end = (uint8_t*) d + 2 + d->d.len;
+ uint8_t *next = (uint8_t *) pos + sizeof(struct mpeg_iso_639_language_code);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct mpeg_iso_639_language_code *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/maximum_bitrate_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/maximum_bitrate_descriptor.h
new file mode 100644
index 0000000..e0bcddb
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/maximum_bitrate_descriptor.h
@@ -0,0 +1,64 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_MAXIMUM_BITRATE_DESCRIPTOR
+#define _UCSI_MPEG_MAXIMUM_BITRATE_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_maximum_bitrate_descriptor structure.
+ */
+struct mpeg_maximum_bitrate_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint32_t reserved : 2; ,
+ uint32_t maximum_bitrate : 22; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_maximum_bitrate_descriptor.
+ *
+ * @param d Pointer to generic descriptor structure.
+ * @return Pointer to mpeg_maximum_bitrate_descriptor, or NULL on error.
+ */
+static inline struct mpeg_maximum_bitrate_descriptor*
+ mpeg_maximum_bitrate_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_maximum_bitrate_descriptor) - 2))
+ return NULL;
+
+ bswap24((uint8_t*) d + 2);
+
+ return (struct mpeg_maximum_bitrate_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_descriptor.h
new file mode 100644
index 0000000..5b91e05
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_descriptor.h
@@ -0,0 +1,472 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_METADATA_DESCRIPTOR
+#define _UCSI_MPEG_METADATA_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Values for the decoder_config_flags field.
+ */
+enum {
+ MPEG_DECODER_CONFIG_NONE = 0x00,
+ MPEG_DECODER_CONFIG_IN_DECODER_CONFIG = 0x01,
+ MPEG_DECODER_CONFIG_SAME_METADATA_SERVICE = 0x02,
+ MPEG_DECODER_CONFIG_DSMCC = 0x03,
+ MPEG_DECODER_CONFIG_SAME_PROGRAM = 0x04,
+};
+
+/**
+ * mpeg_metadata_descriptor structure.
+ */
+struct mpeg_metadata_descriptor {
+ struct descriptor d;
+
+ uint16_t metadata_application_format;
+ /* struct mpeg_metadata_descriptor_application_format_identifier appid */
+ /* uint8_t metadata_format */
+ /* struct mpeg_metadata_descriptor_format_identifier formid */
+ /* struct mpeg_metadata_descriptor_flags flags */
+ /* struct mpeg_metadata_descriptor_service_identifier service_identifier */
+ /* struct mpeg_metadata_descriptor_decoder_config decoder_config */
+ /* struct mpeg_metadata_descriptor_decoder_config_id_record decoder_config_id_record */
+ /* struct mpeg_metadata_descriptor_decoder_config_service_id decoder_config_service_id */
+ /* struct mpeg_metadata_descriptor_decoder_config_reserved decoder_config_reserved */
+ /* uint8_t private_data[] */
+} __ucsi_packed;
+
+/**
+ * appid field of a metadata_descriptor.
+ */
+struct mpeg_metadata_descriptor_application_format_identifier {
+ uint32_t id;
+} __ucsi_packed;
+
+/**
+ * formid field of a metadata_descriptor.
+ */
+struct mpeg_metadata_descriptor_format_identifier {
+ uint32_t id;
+} __ucsi_packed;
+
+/**
+ * Flags field of a metadata_descriptor
+ */
+struct mpeg_metadata_descriptor_flags {
+ uint8_t metadata_service_id;
+ EBIT3(uint8_t decoder_config_flags : 3; ,
+ uint8_t dsm_cc_flag : 1; ,
+ uint8_t reserved : 4; );
+} __ucsi_packed;
+
+/**
+ * service_identifier field of a metadata_descriptor.
+ */
+struct mpeg_metadata_descriptor_service_identifier {
+ uint8_t service_identification_length;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * decoder_config field of a metadata_descriptor.
+ */
+struct mpeg_metadata_descriptor_decoder_config {
+ uint8_t decoder_config_length;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * decoder_config_id_record field of a metadata_descriptor.
+ */
+struct mpeg_metadata_descriptor_decoder_config_id_record {
+ uint8_t decoder_config_id_record_length;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * decoder_config_service_id field of a metadata_descriptor.
+ */
+struct mpeg_metadata_descriptor_decoder_config_service_id {
+ uint8_t decoder_config_metadata_service_id;
+} __ucsi_packed;
+
+/**
+ * decoder_config_reserved field of a metadata_descriptor.
+ */
+struct mpeg_metadata_descriptor_decoder_config_reserved {
+ uint8_t reserved_data_length;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+
+
+
+/**
+ * Process an mpeg_metadata_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return Pointer to an mpeg_metadata_descriptor, or NULL on error.
+ */
+static inline struct mpeg_metadata_descriptor*
+ mpeg_metadata_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 2;
+ uint8_t *buf = (uint8_t*) d;
+ uint32_t len = d->len + 2;
+ struct mpeg_metadata_descriptor_flags *flags;
+ int id;
+
+ if (len < sizeof(struct mpeg_metadata_descriptor))
+ return NULL;
+
+ bswap16(buf + pos);
+ id = *((uint16_t*) (buf+pos));
+ pos += 2;
+
+ if (id == 0xffff) {
+ if (len < (pos+4))
+ return NULL;
+ bswap32(buf+pos);
+ pos += 4;
+ }
+
+ if (len < (pos+1))
+ return NULL;
+
+ id = buf[pos];
+ pos++;
+ if (id == 0xff) {
+ if (len < (pos+4))
+ return NULL;
+ bswap32(buf+pos);
+ pos += 4;
+ }
+
+ if (len < (pos + sizeof(struct mpeg_metadata_descriptor_flags)))
+ return NULL;
+ flags = (struct mpeg_metadata_descriptor_flags*) (buf+pos);
+ pos += sizeof(struct mpeg_metadata_descriptor_flags);
+
+ if (flags->dsm_cc_flag == 1) {
+ if (len < (pos+1))
+ return NULL;
+ if (len < (pos+1+buf[pos]))
+ return NULL;
+ pos += 1 + buf[pos];
+ }
+
+ if (flags->decoder_config_flags == 1) {
+ if (len < (pos+1))
+ return NULL;
+ if (len < (pos+1+buf[pos]))
+ return NULL;
+ pos += 1 + buf[pos];
+ }
+
+ if (flags->decoder_config_flags == 3) {
+ if (len < (pos+1))
+ return NULL;
+ if (len < (pos+1+buf[pos]))
+ return NULL;
+ pos += 1 + buf[pos];
+ }
+
+ if (flags->decoder_config_flags == 4) {
+ if (len < (pos+1))
+ return NULL;
+ pos++;
+ }
+
+ if ((flags->decoder_config_flags == 5) ||
+ (flags->decoder_config_flags == 6)) {
+ if (len < (pos+1))
+ return NULL;
+ if (len < (pos+1+buf[pos]))
+ return NULL;
+ pos += 1 + buf[pos];
+ }
+
+ if (len < pos)
+ return NULL;
+
+ return (struct mpeg_metadata_descriptor*) d;
+}
+
+/**
+ * Accessor for pointer to appid field of an mpeg_metadata_descriptor.
+ *
+ * @param d The mpeg_metadata_descriptor structure.
+ * @return The pointer, or NULL on error.
+ */
+static inline struct mpeg_metadata_descriptor_application_format_identifier*
+ mpeg_metadata_descriptor_appid(struct mpeg_metadata_descriptor *d)
+{
+ uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor);
+
+ if (d->metadata_application_format != 0xffff)
+ return NULL;
+ return (struct mpeg_metadata_descriptor_application_format_identifier*) buf;
+}
+
+/**
+ * Accessor for metadata_format field of an mpeg_metadata_descriptor.
+ *
+ * @param d The mpeg_metadata_descriptor structure.
+ * @return The pointer, or NULL on error.
+ */
+static inline uint8_t
+ mpeg_metadata_descriptor_metadata_format(struct mpeg_metadata_descriptor *d)
+{
+ uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor);
+
+ if (d->metadata_application_format == 0xffff)
+ buf+=4;
+ return *buf;
+}
+
+/**
+ * Accessor for pointer to formid field of an mpeg_metadata_descriptor.
+ *
+ * @param d The mpeg_metadata_descriptor structure.
+ * @return The pointer, or NULL on error.
+ */
+static inline struct mpeg_metadata_descriptor_format_identifier*
+ mpeg_metadata_descriptor_formid(struct mpeg_metadata_descriptor *d)
+{
+ uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor);
+
+ if (d->metadata_application_format == 0xffff)
+ buf+=4;
+ if (*buf != 0xff)
+ return NULL;
+
+ return (struct mpeg_metadata_descriptor_format_identifier*) (buf+1);
+}
+
+/**
+ * Accessor for flags field of an mpeg_metadata_descriptor.
+ *
+ * @param d The mpeg_metadata_descriptor structure.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_metadata_descriptor_flags*
+ mpeg_metadata_descriptor_flags(struct mpeg_metadata_descriptor *d)
+{
+ uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor);
+
+ if (d->metadata_application_format == 0xffff)
+ buf+=4;
+ if (*buf == 0xff)
+ buf+=4;
+
+ return (struct mpeg_metadata_descriptor_flags*) buf;
+}
+
+
+/**
+ * Accessor for service_identifier field of an mpeg_metadata_descriptor.
+ *
+ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_metadata_descriptor_service_identifier*
+ mpeg_metadata_descriptor_sevice_identifier(struct mpeg_metadata_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
+
+ if (flags->dsm_cc_flag!=1)
+ return NULL;
+
+ return (struct mpeg_metadata_descriptor_service_identifier *) buf;
+}
+
+/**
+ * Accessor for data field of an mpeg_metadata_descriptor_service_identifier.
+ *
+ * @param d The mpeg_metadata_descriptor_service_identifier structure.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ mpeg_metadata_descriptor_service_identifier_data(struct mpeg_metadata_descriptor_service_identifier *d)
+{
+ return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_service_identifier);
+}
+
+/**
+ * Accessor for decoder_config field of an mpeg_metadata_descriptor.
+ *
+ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_metadata_descriptor_decoder_config*
+ mpeg_metadata_descriptor_decoder_config(struct mpeg_metadata_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
+
+ if (flags->decoder_config_flags != 1)
+ return NULL;
+
+ if (flags->dsm_cc_flag==1)
+ buf += 1 + buf[1];
+
+ return (struct mpeg_metadata_descriptor_decoder_config*) buf;
+}
+
+/**
+ * Accessor for data field of an mpeg_metadata_descriptor_service_identifier.
+ *
+ * @param d The mpeg_metadata_descriptor_service_identifier structure.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ mpeg_metadata_descriptor_decoder_config_data(struct mpeg_metadata_descriptor_decoder_config *d)
+{
+ return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_decoder_config);
+}
+
+/**
+ * Accessor for decoder_config_id_record field of an mpeg_metadata_descriptor.
+ *
+ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_metadata_descriptor_decoder_config_id_record*
+ mpeg_metadata_descriptor_decoder_config_id_record(struct mpeg_metadata_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
+
+ if (flags->decoder_config_flags != 3)
+ return NULL;
+
+ if (flags->dsm_cc_flag==1)
+ buf += 1 + buf[1];
+
+ return (struct mpeg_metadata_descriptor_decoder_config_id_record *) buf;
+}
+
+/**
+ * Accessor for data field of an mpeg_metadata_descriptor_decoder_config_id_record.
+ *
+ * @param d The mpeg_metadata_descriptor_decoder_config_id_record structure.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ mpeg_metadata_descriptor_decoder_config_id_record_data(struct mpeg_metadata_descriptor_decoder_config_id_record *d)
+{
+ return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_decoder_config_id_record);
+}
+
+/**
+ * Accessor for decoder_config_service_id field of an mpeg_metadata_descriptor.
+ *
+ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_metadata_descriptor_decoder_config_service_id*
+ mpeg_metadata_descriptor_decoder_config_service_id(struct mpeg_metadata_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
+
+ if (flags->decoder_config_flags != 4)
+ return NULL;
+
+ if (flags->dsm_cc_flag==1)
+ buf += 1 + buf[1];
+
+ return (struct mpeg_metadata_descriptor_decoder_config_service_id *) buf;
+}
+
+/**
+ * Accessor for decoder_config_reserved field of an mpeg_metadata_descriptor.
+ *
+ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_metadata_descriptor_decoder_config_reserved*
+ mpeg_metadata_descriptor_decoder_config_reserved(struct mpeg_metadata_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
+
+ if ((flags->decoder_config_flags != 5) && (flags->decoder_config_flags != 6))
+ return NULL;
+
+ if (flags->dsm_cc_flag==1)
+ buf += 1 + buf[1];
+
+ return (struct mpeg_metadata_descriptor_decoder_config_reserved *) buf;
+}
+
+/**
+ * Accessor for data field of an mpeg_metadata_descriptor_decoder_config_reserved.
+ *
+ * @param d The mpeg_metadata_descriptor_decoder_config_reserved structure.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ mpeg_metadata_descriptor_decoder_config_reserved_data(struct mpeg_metadata_descriptor_decoder_config_reserved *d)
+{
+ return (uint8_t*) d + sizeof(struct mpeg_metadata_descriptor_decoder_config_reserved);
+}
+
+/**
+ * Accessor for private_data field of an mpeg_metadata_descriptor.
+ *
+ * @param d The mpeg_metadata_descriptor structure.
+ * @param flags Pointer to the mpeg_metadata_descriptor_flags.
+ * @param length Where the number of bytes in the field should be stored.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ mpeg_metadata_descriptor_private_data(struct mpeg_metadata_descriptor *d,
+ struct mpeg_metadata_descriptor_flags *flags,
+ int *length)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_descriptor_flags);
+ uint8_t *end = (uint8_t*) d + d->d.len + 2;
+
+
+ if (flags->dsm_cc_flag==1)
+ buf += 1 + buf[1];
+ if (flags->decoder_config_flags==1)
+ buf += 1 + buf[1];
+ if (flags->decoder_config_flags==3)
+ buf += 1 + buf[1];
+ if (flags->decoder_config_flags==4)
+ buf++;
+ if ((flags->decoder_config_flags==5)||(flags->decoder_config_flags==6))
+ buf += 1 + buf[1];
+
+ *length = end - buf;
+ return buf;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_pointer_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_pointer_descriptor.h
new file mode 100644
index 0000000..e4d7503
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_pointer_descriptor.h
@@ -0,0 +1,360 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_METADATA_POINTER_DESCRIPTOR
+#define _UCSI_MPEG_METADATA_POINTER_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * Possible values for the mpeg_carriage_flags field.
+ */
+enum {
+ MPEG_CARRIAGE_SAME_TS = 0x00,
+ MPEG_CARRIAGE_DIFFERENT_TS = 0x01,
+ MPEG_CARRIAGE_PS = 0x02,
+ MPEG_CARRIAGE_OTHER = 0x03,
+};
+
+/**
+ * mpeg_metadata_pointer_descriptor structure.
+ */
+struct mpeg_metadata_pointer_descriptor {
+ struct descriptor d;
+
+ uint16_t metadata_application_format;
+ /* struct mpeg_metadata_pointer_descriptor_application_format_identifier appid */
+ /* uint8_t metadata_format */
+ /* struct mpeg_metadata_pointer_descriptor_format_identifier formid */
+ /* struct mpeg_metadata_pointer_descriptor_flags flags */
+ /* struct mpeg_metadata_pointer_descriptor_locator locator */
+ /* struct mpeg_metadata_pointer_descriptor_program_number program_number */
+ /* struct mpeg_metadata_pointer_descriptor_carriage carriage */
+ /* uint8_t private_data[] */
+} __ucsi_packed;
+
+/**
+ * appid field of a metadata_pointer_descriptor.
+ */
+struct mpeg_metadata_pointer_descriptor_application_format_identifier {
+ uint32_t id;
+} __ucsi_packed;
+
+/**
+ * formid field of a metadata_pointer_descriptor.
+ */
+struct mpeg_metadata_pointer_descriptor_format_identifier {
+ uint32_t id;
+} __ucsi_packed;
+
+/**
+ * Flags field of a metadata_pointer_descriptor
+ */
+struct mpeg_metadata_pointer_descriptor_flags {
+ uint8_t metadata_service_id;
+ EBIT3(uint8_t metadata_locator_record_flag : 1; ,
+ uint8_t mpeg_carriage_flags : 2; ,
+ uint8_t reserved : 5; );
+} __ucsi_packed;
+
+/**
+ * Reference_id field of a metadata_pointer_descriptor.
+ */
+struct mpeg_metadata_pointer_descriptor_locator {
+ uint8_t metadata_locator_record_length;
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * program_number field of a metadata_pointer_descriptor.
+ */
+struct mpeg_metadata_pointer_descriptor_program_number {
+ uint16_t number;
+} __ucsi_packed;
+
+/**
+ * carriage field of a metadata_pointer_descriptor.
+ */
+struct mpeg_metadata_pointer_descriptor_carriage {
+ uint16_t transport_stream_location;
+ uint16_t transport_stream_id;
+} __ucsi_packed;
+
+
+
+
+/**
+ * Process an mpeg_metadata_pointer_descriptor.
+ *
+ * @param d Generic descriptor.
+ * @return Pointer to an mpeg_metadata_pointer_descriptor, or NULL on error.
+ */
+static inline struct mpeg_metadata_pointer_descriptor*
+ mpeg_metadata_pointer_descriptor_codec(struct descriptor* d)
+{
+ uint32_t pos = 2;
+ uint8_t *buf = (uint8_t*) d;
+ uint32_t len = d->len + 2;
+ struct mpeg_metadata_pointer_descriptor_flags *flags;
+ int id;
+
+ if (len < sizeof(struct mpeg_metadata_pointer_descriptor))
+ return NULL;
+
+ bswap16(buf + pos);
+ id = *((uint16_t*) (buf+pos));
+ pos += 2;
+
+ if (id == 0xffff) {
+ if (len < (pos+4))
+ return NULL;
+ bswap32(buf+pos);
+ pos += 4;
+ }
+
+ if (len < (pos+1))
+ return NULL;
+
+ id = buf[pos];
+ pos++;
+ if (id == 0xff) {
+ if (len < (pos+4))
+ return NULL;
+ bswap32(buf+pos);
+ pos += 4;
+ }
+
+ if (len < (pos + sizeof(struct mpeg_metadata_pointer_descriptor_flags)))
+ return NULL;
+ flags = (struct mpeg_metadata_pointer_descriptor_flags*) (buf+pos);
+ pos += sizeof(struct mpeg_metadata_pointer_descriptor_flags);
+
+ if (flags->metadata_locator_record_flag == 1) {
+ if (len < (pos+1))
+ return NULL;
+ if (len < (pos+1+buf[pos]))
+ return NULL;
+ pos += 1 + buf[pos];
+ }
+
+ if (flags->mpeg_carriage_flags < 3) {
+ if (len < (pos + 2))
+ return NULL;
+ bswap16(buf+pos);
+ pos += 2;
+ }
+
+ if (flags->mpeg_carriage_flags == 1) {
+ if (len < (pos + 4))
+ return NULL;
+ bswap16(buf+pos);
+ bswap16(buf+pos+2);
+ pos += 4;
+ }
+
+ if (len < pos)
+ return NULL;
+
+ return (struct mpeg_metadata_pointer_descriptor*) d;
+}
+
+/**
+ * Accessor for pointer to appid field of an mpeg_metadata_pointer_descriptor.
+ *
+ * @param d The mpeg_metadata_pointer_descriptor structure.
+ * @return The pointer, or NULL on error.
+ */
+static inline struct mpeg_metadata_pointer_descriptor_application_format_identifier*
+ mpeg_metadata_pointer_descriptor_appid(struct mpeg_metadata_pointer_descriptor *d)
+{
+ uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
+
+ if (d->metadata_application_format != 0xffff)
+ return NULL;
+ return (struct mpeg_metadata_pointer_descriptor_application_format_identifier*) buf;
+}
+
+/**
+ * Accessor for metadata_format field of an mpeg_metadata_pointer_descriptor.
+ *
+ * @param d The mpeg_metadata_pointer_descriptor structure.
+ * @return The pointer, or NULL on error.
+ */
+static inline uint8_t
+ mpeg_metadata_pointer_descriptor_metadata_format(struct mpeg_metadata_pointer_descriptor *d)
+{
+ uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
+
+ if (d->metadata_application_format == 0xffff)
+ buf+=4;
+ return *buf;
+}
+
+/**
+ * Accessor for pointer to formid field of an mpeg_metadata_pointer_descriptor.
+ *
+ * @param d The mpeg_metadata_pointer_descriptor structure.
+ * @return The pointer, or NULL on error.
+ */
+static inline struct mpeg_metadata_pointer_descriptor_format_identifier*
+ mpeg_metadata_pointer_descriptor_formid(struct mpeg_metadata_pointer_descriptor *d)
+{
+ uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
+
+ if (d->metadata_application_format == 0xffff)
+ buf+=4;
+ if (*buf != 0xff)
+ return NULL;
+
+ return (struct mpeg_metadata_pointer_descriptor_format_identifier*) (buf+1);
+}
+
+/**
+ * Accessor for flags field of an mpeg_metadata_pointer_descriptor.
+ *
+ * @param d The mpeg_metadata_pointer_descriptor structure.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_metadata_pointer_descriptor_flags*
+ mpeg_metadata_pointer_descriptor_flags(struct mpeg_metadata_pointer_descriptor *d)
+{
+ uint8_t *buf = (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor);
+
+ if (d->metadata_application_format == 0xffff)
+ buf+=4;
+ if (*buf == 0xff)
+ buf+=4;
+
+ return (struct mpeg_metadata_pointer_descriptor_flags*) buf;
+}
+
+
+/**
+ * Accessor for locator field of an mpeg_metadata_pointer_descriptor.
+ *
+ * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_metadata_pointer_descriptor_locator*
+ mpeg_metadata_pointer_descriptor_locator(struct mpeg_metadata_pointer_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
+
+ if (flags->metadata_locator_record_flag!=1)
+ return NULL;
+
+ return (struct mpeg_metadata_pointer_descriptor_locator *) buf;
+}
+
+/**
+ * Accessor for data field of an mpeg_metadata_pointer_descriptor_locator.
+ *
+ * @param d The mpeg_metadata_pointer_descriptor_locator structure.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ mpeg_metadata_pointer_descriptor_locator_data(struct mpeg_metadata_pointer_descriptor_locator *d)
+{
+ return (uint8_t*) d + sizeof(struct mpeg_metadata_pointer_descriptor_locator);
+}
+
+
+/**
+ * Accessor for program_number field of an mpeg_metadata_pointer_descriptor.
+ *
+ * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_metadata_pointer_descriptor_program_number*
+ mpeg_metadata_pointer_descriptor_program_number(struct mpeg_metadata_pointer_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
+
+ if (flags->mpeg_carriage_flags < 3)
+ return NULL;
+
+ if (flags->metadata_locator_record_flag==1)
+ buf += 1 + buf[1];
+
+ return (struct mpeg_metadata_pointer_descriptor_program_number*) buf;
+}
+
+/**
+ * Accessor for carriage field of an mpeg_metadata_pointer_descriptor.
+ *
+ * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
+ * @return Pointer to the field, or NULL on error.
+ */
+static inline struct mpeg_metadata_pointer_descriptor_carriage*
+ mpeg_metadata_pointer_descriptor_carriage(struct mpeg_metadata_pointer_descriptor_flags *flags)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
+
+ if (flags->mpeg_carriage_flags != 1)
+ return NULL;
+
+ if (flags->metadata_locator_record_flag==1)
+ buf += 1 + buf[1];
+ if (flags->mpeg_carriage_flags < 3)
+ buf += sizeof(struct mpeg_metadata_pointer_descriptor_program_number);
+
+ return (struct mpeg_metadata_pointer_descriptor_carriage *) buf;
+}
+
+/**
+ * Accessor for private_data field of an mpeg_metadata_pointer_descriptor.
+ *
+ * @param d The mpeg_metadata_pointer_descriptor structure.
+ * @param flags Pointer to the mpeg_metadata_pointer_descriptor_flags.
+ * @param length Where the number of bytes in the field should be stored.
+ * @return Pointer to the field.
+ */
+static inline uint8_t*
+ mpeg_metadata_pointer_descriptor_private_data(struct mpeg_metadata_pointer_descriptor *d,
+ struct mpeg_metadata_pointer_descriptor_flags *flags,
+ int *length)
+{
+ uint8_t *buf = (uint8_t*) flags + sizeof(struct mpeg_metadata_pointer_descriptor_flags);
+ uint8_t *end = (uint8_t*) d + d->d.len + 2;
+
+
+ if (flags->metadata_locator_record_flag==1)
+ buf += 1 + buf[1];
+ if (flags->mpeg_carriage_flags < 3)
+ buf += sizeof(struct mpeg_metadata_pointer_descriptor_program_number);
+ if (flags->mpeg_carriage_flags != 1)
+ buf += sizeof(struct mpeg_metadata_pointer_descriptor_carriage);
+
+ *length = end - buf;
+ return buf;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_section.c b/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_section.c
new file mode 100644
index 0000000..9af1d96
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_section.c
@@ -0,0 +1,28 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/mpeg/metadata_section.h>
+
+struct mpeg_metadata_section * mpeg_metadata_section_codec(struct section_ext * ext)
+{
+ return (struct mpeg_metadata_section *)ext;
+}
+
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_section.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_section.h
new file mode 100644
index 0000000..62c4e03
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_section.h
@@ -0,0 +1,122 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_METADATA_SECTION_H
+#define _UCSI_MPEG_METADATA_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * mpeg_metadata_section structure.
+ */
+struct mpeg_metadata_section {
+ struct section_ext head;
+
+ /* uint8_t data[] */
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_metadata_section structure.
+ *
+ * @param section Pointer to the section_ext structure.
+ * @return Pointer to the mpeg_metadata_section structure, or NULL on error.
+ */
+extern struct mpeg_metadata_section *mpeg_metadata_section_codec(struct section_ext *section);
+
+/**
+ * Accessor for the random_access_indicator field of a metadata section.
+ *
+ * @param metadata metadata section pointer.
+ * @return The random_access_indicator.
+ */
+static inline uint8_t mpeg_metadata_section_random_access_indicator(struct mpeg_metadata_section *metadata)
+{
+ return metadata->head.reserved >> 1;
+}
+
+/**
+ * Accessor for the decoder_config_flag field of a metadata section.
+ *
+ * @param metadata metadata section pointer.
+ * @return The decoder_config_flag.
+ */
+static inline uint8_t mpeg_metadata_section_decoder_config_flag(struct mpeg_metadata_section *metadata)
+{
+ return metadata->head.reserved & 1;
+}
+
+/**
+ * Accessor for the fragment_indicator field of a metadata section.
+ *
+ * @param metadata metadata section pointer.
+ * @return The fragment_indicator.
+ */
+static inline uint8_t mpeg_metadata_section_fragment_indicator(struct mpeg_metadata_section *metadata)
+{
+ return metadata->head.reserved1;
+}
+
+/**
+ * Accessor for the service_id field of a metadata section.
+ *
+ * @param metadata metadata section pointer.
+ * @return The service_id.
+ */
+static inline uint16_t mpeg_metadata_section_service_id(struct mpeg_metadata_section *metadata)
+{
+ return metadata->head.table_id_ext >> 8;
+}
+
+/**
+ * Retrieve pointer to data field of an mpeg_metadata_section.
+ *
+ * @param s mpeg_metadata_section pointer.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ mpeg_metadata_section_data(struct mpeg_metadata_section *s)
+{
+ return (uint8_t *) s + sizeof(struct mpeg_metadata_section);
+}
+
+
+/**
+ * Determine length of the data field of an mpeg_copyright_descriptor.
+ *
+ * @param s mpeg_metadata_section_data pointer.
+ * @return Length of field in bytes.
+ */
+static inline int
+ mpeg_metadata_section_data_length(struct mpeg_metadata_section *s)
+{
+ return section_ext_length(&s->head) - sizeof(struct mpeg_metadata_section);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_std_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_std_descriptor.h
new file mode 100644
index 0000000..fc83e6e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/metadata_std_descriptor.h
@@ -0,0 +1,72 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_METADATA_STD_DESCRIPTOR
+#define _UCSI_MPEG_METADATA_STD_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_metadata_std_descriptor structure.
+ */
+struct mpeg_metadata_std_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint32_t reserved_1 : 2; ,
+ uint32_t metadata_input_leak_rate :22; );
+ EBIT2(uint32_t reserved_2 : 2; ,
+ uint32_t metadata_buffer_size :22; );
+ EBIT2(uint32_t reserved_3 : 2; ,
+ uint32_t metadata_output_leak_rate :22; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_metadata_std_descriptor.
+ *
+ * @param d Pointer to the generic descriptor structure.
+ * @return Pointer to the mpeg_metadata_std_descriptor, or NULL on error.
+ */
+static inline struct mpeg_metadata_std_descriptor*
+ mpeg_metadata_std_descriptor_codec(struct descriptor* d)
+{
+ uint8_t *buf = (uint8_t*) d;
+
+ if (d->len != (sizeof(struct mpeg_metadata_std_descriptor) - 2))
+ return NULL;
+
+ bswap24(buf + 2);
+ bswap24(buf + 5);
+ bswap24(buf + 8);
+
+ return (struct mpeg_metadata_std_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/mpeg4_audio_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/mpeg4_audio_descriptor.h
new file mode 100644
index 0000000..f876759
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/mpeg4_audio_descriptor.h
@@ -0,0 +1,61 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG4_AUDIO_DESCRIPTOR
+#define _UCSI_MPEG4_AUDIO_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg4_audio_descriptor structure.
+ */
+struct mpeg4_audio_descriptor {
+ struct descriptor d;
+
+ uint8_t mpeg4_audio_profile_and_level;
+} __ucsi_packed;
+
+/**
+ * Process an mpeg4_audio_descriptor.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to an mpeg4_audio_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg4_audio_descriptor*
+ mpeg4_audio_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg4_audio_descriptor) - 2))
+ return NULL;
+
+ return (struct mpeg4_audio_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/mpeg4_video_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/mpeg4_video_descriptor.h
new file mode 100644
index 0000000..b956b91
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/mpeg4_video_descriptor.h
@@ -0,0 +1,61 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG4_VIDEO_DESCRIPTOR
+#define _UCSI_MPEG4_VIDEO_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg4_video_descriptor structure.
+ */
+struct mpeg4_video_descriptor {
+ struct descriptor d;
+
+ uint8_t mpeg4_visual_profile_and_level;
+} __ucsi_packed;
+
+/**
+ * Process an mpeg4_video_descriptor structure.
+ *
+ * @param d Pointer to generic descriptor structure.
+ * @return Pointer to mpeg4_video_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg4_video_descriptor*
+ mpeg4_video_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg4_video_descriptor) - 2))
+ return NULL;
+
+ return (struct mpeg4_video_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/multiplex_buffer_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/multiplex_buffer_descriptor.h
new file mode 100644
index 0000000..d55ce3d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/multiplex_buffer_descriptor.h
@@ -0,0 +1,65 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_MULTIPLEX_BUFFER_DESCRIPTOR
+#define _UCSI_MPEG_MULTIPLEX_BUFFER_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_multiplex_buffer_descriptor descriptor.
+ */
+struct mpeg_multiplex_buffer_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint64_t mb_buffer_size : 24; ,
+ uint64_t tb_leak_rate : 24; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_multiplex_buffer_descriptor.
+ *
+ * @param d Pointer to generic descriptor structure.
+ * @return Pointer to an mpeg_multiplex_buffer_descriptor structure, or NULL on
+ * error.
+ */
+static inline struct mpeg_multiplex_buffer_descriptor*
+ mpeg_multiplex_buffer_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_multiplex_buffer_descriptor) - 2))
+ return NULL;
+
+ bswap48((uint8_t*) d + 2);
+
+ return (struct mpeg_multiplex_buffer_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h
new file mode 100644
index 0000000..16550ed
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/multiplex_buffer_utilization_descriptor.h
@@ -0,0 +1,67 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_MULTIPLEX_BUFFER_UTILIZATION_DESCRIPTOR
+#define _UCSI_MPEG_MULTIPLEX_BUFFER_UTILIZATION_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_multiplex_buffer_utilization_descriptor structure.
+ */
+struct mpeg_multiplex_buffer_utilization_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint16_t bound_valid_flag : 1; ,
+ uint16_t ltw_offset_lower_bound : 15; );
+ EBIT2(uint16_t reserved : 1; ,
+ uint16_t ltw_offset_upper_bound : 15; );
+} __ucsi_packed;
+
+/**
+ * Process a mpeg_multiplex_buffer_utilization_descriptor.
+ *
+ * @param d Generic descriptor pointer.
+ * @return mpeg_multiplex_buffer_utilization_descriptor pointer, or NULL on error.
+ */
+static inline struct mpeg_multiplex_buffer_utilization_descriptor*
+ mpeg_multiplex_buffer_utilization_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_multiplex_buffer_utilization_descriptor) - 2))
+ return NULL;
+
+ bswap16((uint8_t*) d + 2);
+ bswap16((uint8_t*) d + 4);
+
+ return (struct mpeg_multiplex_buffer_utilization_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/muxcode_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/muxcode_descriptor.h
new file mode 100644
index 0000000..6bed334
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/muxcode_descriptor.h
@@ -0,0 +1,82 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_MUXCODE_DESCRIPTOR
+#define _UCSI_MPEG_MUXCODE_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_muxcode_descriptor structure
+ */
+struct mpeg_muxcode_descriptor {
+ struct descriptor d;
+
+ /* uint8_t entries[] */
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_muxcode_descriptor.
+ *
+ * @param d Pointer to a generic descriptor structure.
+ * @return Pointer to an mpeg_muxcode_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_muxcode_descriptor*
+ mpeg_muxcode_descriptor_codec(struct descriptor* d)
+{
+ return (struct mpeg_muxcode_descriptor*) d;
+}
+
+/**
+ * Retrieve pointer to entries field of an mpeg_muxcode_descriptor structure.
+ *
+ * @param d Generic descriptor structure.
+ * @return Pointer to the entries field.
+ */
+static inline uint8_t *
+ mpeg_muxcode_descriptor_entries(struct mpeg_muxcode_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct mpeg_muxcode_descriptor);
+}
+
+/**
+ * Determine length of entries field of an mpeg_muxcode_descriptor structure.
+ *
+ * @param d Generic descriptor structure.
+ * @return Number of bytes in the entries field.
+ */
+static inline int
+ mpeg_muxcode_descriptor_entries_length(struct mpeg_muxcode_descriptor *d)
+{
+ return d->d.len;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/odsmt_section.c b/kaffeine/src/input/dvb/lib/libucsi/mpeg/odsmt_section.c
new file mode 100644
index 0000000..c56ccb1
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/odsmt_section.c
@@ -0,0 +1,80 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/mpeg/odsmt_section.h>
+
+struct mpeg_odsmt_section *mpeg_odsmt_section_codec(struct section_ext * ext)
+{
+ struct mpeg_odsmt_section * odsmt = (struct mpeg_odsmt_section *)ext;
+ uint8_t * buf = (uint8_t *)ext;
+ int pos = sizeof(struct section_ext);
+ int len = section_ext_length(ext);
+ int i;
+
+ if (len < sizeof(struct mpeg_odsmt_section))
+ return NULL;
+
+ pos++;
+
+ if (odsmt->stream_count == 0) {
+ struct mpeg_odsmt_stream * stream =
+ (struct mpeg_odsmt_stream *) (buf + pos);
+
+ if ((pos + sizeof(struct mpeg_odsmt_stream_single)) > len)
+ return NULL;
+
+ bswap16(buf+pos);
+ pos+=3;
+
+ if ((pos + stream->u.single.es_info_length) >= len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, stream->u.single.es_info_length))
+ return NULL;
+
+ pos += stream->u.single.es_info_length;
+ } else {
+ for (i=0; i< odsmt->stream_count; i++) {
+ struct mpeg_odsmt_stream * stream =
+ (struct mpeg_odsmt_stream *)(buf + pos);
+
+ if ((pos + sizeof(struct mpeg_odsmt_stream_multi)) > len)
+ return NULL;
+
+ bswap16(buf+pos);
+ pos += sizeof(struct mpeg_odsmt_stream_multi);
+
+ if ((pos + stream->u.multi.es_info_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos,
+ stream->u.multi.es_info_length))
+ return NULL;
+
+ pos += stream->u.multi.es_info_length;
+ }
+ }
+
+ if (pos != len)
+ return NULL;
+
+ return (struct mpeg_odsmt_section *) ext;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/odsmt_section.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/odsmt_section.h
new file mode 100644
index 0000000..2e5302d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/odsmt_section.h
@@ -0,0 +1,224 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_ODSMT_SECTION_H
+#define _UCSI_MPEG_ODSMT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * mpeg_odsmt_section structure.
+ */
+struct mpeg_odsmt_section {
+ struct section_ext head;
+
+ uint8_t stream_count;
+ /* stream_count==0 => struct mpeg_odsmt_stream_single streams
+ stream_count>0 => struct mpeg_odsmt_stream_multi streams[] */
+ /* uint8_t object_descriptors[] */
+} __ucsi_packed;
+
+struct mpeg_odsmt_stream_single
+{
+ uint16_t esid;
+ uint8_t es_info_length;
+ /* struct descriptor descriptors[] */
+} __ucsi_packed;
+
+struct mpeg_odsmt_stream_multi
+{
+ uint16_t esid;
+ uint8_t fmc;
+ uint8_t es_info_length;
+ /* struct descriptor descriptors[] */
+} __ucsi_packed;
+
+/**
+ * Structure describing the stream information held in an mpeg_odsmt_section.
+ */
+struct mpeg_odsmt_stream {
+ union {
+ struct mpeg_odsmt_stream_single single __ucsi_packed;
+ struct mpeg_odsmt_stream_multi multi __ucsi_packed;
+ } u __ucsi_packed;
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_odsmt_section.
+ *
+ * @param section Pointer to the generic section_ext structure.
+ * @return Pointer to a mpeg_odsmt_section structure, or NULL on error.
+ */
+extern struct mpeg_odsmt_section *mpeg_odsmt_section_codec(struct section_ext *section);
+
+/**
+ * Accessor for the PID field of an ODSMT.
+ *
+ * @param odsmt odsmt pointer.
+ * @return The pid.
+ */
+static inline uint16_t mpeg_odsmt_section_pid(struct mpeg_odsmt_section *odsmt)
+{
+ return odsmt->head.table_id_ext & 0x1fff;
+}
+
+/**
+ * Convenience iterator for the streams field of an mpeg_odsmt_section.
+ *
+ * @param osdmt Pointer to the mpeg_odsmt_section structure.
+ * @param pos Variable holding pointer to the current mpeg_odsmt_stream structure.
+ * @param index Variable holding the stream index.
+ */
+#define mpeg_odsmt_section_streams_for_each(osdmt, pos, index) \
+ for (index=0, (pos) = mpeg_odsmt_section_streams_first(odsmt); \
+ (pos); \
+ (pos) = mpeg_odsmt_section_streams_next(odsmt, pos, ++index))
+
+/**
+ * Convenience iterator for the descriptors field of an mpeg_odsmt_stream.
+ *
+ * @param osdmt Pointer to the mpeg_odsmt_section structure.
+ * @param stream Pointer to the mpeg_odsmt_stream structure.
+ * @param pos Variable holding pointer to the current descriptor structure.
+ */
+#define mpeg_odsmt_stream_descriptors_for_each(osdmt, stream, pos) \
+ for ((pos) = mpeg_odsmt_stream_descriptors_first(odsmt, stream); \
+ (pos); \
+ (pos) = mpeg_odsmt_stream_descriptors_next(odsmt, stream, pos))
+
+/**
+ * Retrieve a pointer to the object_descriptors field of an mpeg_odsmt_section.
+ *
+ * @param osdmt Pointer to the mpeg_odsmt_section structure.
+ * @param len On return, will contain the number of bytes in the object descriptors field.
+ * @return Pointer to the object_descriptors field, or NULL on error.
+ */
+static inline uint8_t*
+ mpeg_odsmt_section_object_descriptors(struct mpeg_odsmt_section * odsmt,
+ uint32_t* len);
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct mpeg_odsmt_stream *
+ mpeg_odsmt_section_streams_first(struct mpeg_odsmt_section *odsmt)
+{
+ int pos = sizeof(struct mpeg_odsmt_section);
+
+ if (pos >= section_ext_length(&odsmt->head))
+ return NULL;
+
+ return (struct mpeg_odsmt_stream *) ((uint8_t *) odsmt + pos);
+}
+
+static inline struct mpeg_odsmt_stream *
+ mpeg_odsmt_section_streams_next(struct mpeg_odsmt_section *odsmt,
+ struct mpeg_odsmt_stream *pos,
+ int index)
+{
+ uint8_t *end = (uint8_t*) odsmt + section_ext_length(&odsmt->head);
+ uint8_t *next;
+
+ if (index > odsmt->stream_count)
+ return NULL;
+
+ next = (uint8_t *) pos + sizeof(struct mpeg_odsmt_stream_multi) +
+ pos->u.multi.es_info_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct mpeg_odsmt_stream *) next;
+}
+
+static inline struct descriptor *
+ mpeg_odsmt_stream_descriptors_first(struct mpeg_odsmt_section *odsmt,
+ struct mpeg_odsmt_stream *stream)
+{
+ if (odsmt->stream_count == 0) {
+ if (stream->u.single.es_info_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t*) stream + sizeof(struct mpeg_odsmt_stream_single));
+ } else {
+ if (stream->u.multi.es_info_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t*) stream + sizeof(struct mpeg_odsmt_stream_multi));
+ }
+}
+
+static inline struct descriptor *
+ mpeg_odsmt_stream_descriptors_next(struct mpeg_odsmt_section *odsmt,
+ struct mpeg_odsmt_stream *stream,
+ struct descriptor* pos)
+{
+ if (odsmt->stream_count == 0) {
+ return next_descriptor((uint8_t *) stream + sizeof(struct mpeg_odsmt_stream_single),
+ stream->u.single.es_info_length,
+ pos);
+ } else {
+ return next_descriptor((uint8_t *) stream + sizeof(struct mpeg_odsmt_stream_multi),
+ stream->u.multi.es_info_length,
+ pos);
+ }
+}
+
+static inline uint8_t*
+ mpeg_odsmt_section_object_descriptors(struct mpeg_odsmt_section * odsmt,
+ uint32_t* len)
+{
+ struct mpeg_odsmt_stream* pos;
+ int size = sizeof(struct mpeg_odsmt_section);
+ int index;
+
+ mpeg_odsmt_section_streams_for_each(odsmt, pos, index) {
+ if (odsmt->stream_count == 0)
+ size += sizeof(struct mpeg_odsmt_stream_single) +
+ pos->u.single.es_info_length;
+ else
+ size += sizeof(struct mpeg_odsmt_stream_multi) +
+ pos->u.multi.es_info_length;
+ }
+
+ *len = section_ext_length(&odsmt->head) - size;
+ return (uint8_t*) odsmt + size;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/pat_section.c b/kaffeine/src/input/dvb/lib/libucsi/mpeg/pat_section.c
new file mode 100644
index 0000000..80b28d5
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/pat_section.c
@@ -0,0 +1,46 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/mpeg/pat_section.h>
+
+struct mpeg_pat_section *mpeg_pat_section_codec(struct section_ext * ext)
+{
+ uint8_t *buf = (uint8_t *)ext;
+ int pos = sizeof(struct section_ext);
+ int len = section_ext_length(ext);
+
+ if (len < sizeof(struct mpeg_pat_section))
+ return NULL;
+
+ while (pos < len) {
+ if ((pos + 4) > len)
+ return NULL;
+
+ bswap16(buf + pos);
+ bswap16(buf + pos + 2);
+ pos += 4;
+ }
+
+ if (pos != len)
+ return NULL;
+
+ return (struct mpeg_pat_section *)ext;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/pat_section.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/pat_section.h
new file mode 100644
index 0000000..20b3f7a
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/pat_section.h
@@ -0,0 +1,118 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_PAT_SECTION_H
+#define _UCSI_MPEG_PAT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * mpeg_pat_section structure.
+ */
+struct mpeg_pat_section {
+ struct section_ext head; /* table_id_ext == transport_stream_id */
+
+ /* struct mpeg_pat_program programs[] */
+} __ucsi_packed;
+
+/**
+ * A program within an mpeg_pat_section.
+ */
+struct mpeg_pat_program {
+ uint16_t program_number;
+ EBIT2(uint16_t reserved : 3; ,
+ uint16_t pid :13; )
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_pat_section.
+ *
+ * @param section Pointer to the generic section_ext structure.
+ * @return Pointer to the mpeg_pat_section structure, or NULL on error.
+ */
+extern struct mpeg_pat_section *mpeg_pat_section_codec(struct section_ext *section);
+
+/**
+ * Accessor for the transport_stream_id field of a PAT.
+ *
+ * @param pat PAT pointer.
+ * @return The transport_stream_id.
+ */
+static inline uint16_t mpeg_pat_section_transport_stream_id(struct mpeg_pat_section *pat)
+{
+ return pat->head.table_id_ext;
+}
+
+/**
+ * Conveience iterator for the programs field of an mpeg_pat_section.
+ *
+ * @param pat Pointer to the mpeg_pat_section structure.
+ * @param pos Variable holding a pointer to the current mpeg_pat_program structure.
+ */
+#define mpeg_pat_section_programs_for_each(pat, pos) \
+ for ((pos) = mpeg_pat_section_programs_first(pat); \
+ (pos); \
+ (pos) = mpeg_pat_section_programs_next(pat, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct mpeg_pat_program *
+ mpeg_pat_section_programs_first(struct mpeg_pat_section * pat)
+{
+ int pos = sizeof(struct mpeg_pat_section);
+
+ if (pos >= section_ext_length(&pat->head))
+ return NULL;
+
+ return (struct mpeg_pat_program*)((uint8_t *) pat + pos);
+}
+
+static inline
+ struct mpeg_pat_program *mpeg_pat_section_programs_next(struct mpeg_pat_section * pat,
+ struct mpeg_pat_program * pos)
+{
+ uint8_t *end = (uint8_t*) pat + section_ext_length(&pat->head);
+ uint8_t *next= (uint8_t *) pos + sizeof(struct mpeg_pat_program);
+
+ if (next >= end)
+ return NULL;
+
+ return (struct mpeg_pat_program *) next;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/pmt_section.c b/kaffeine/src/input/dvb/lib/libucsi/mpeg/pmt_section.c
new file mode 100644
index 0000000..6ff4fac
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/pmt_section.c
@@ -0,0 +1,71 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/mpeg/pmt_section.h>
+
+struct mpeg_pmt_section * mpeg_pmt_section_codec(struct section_ext * ext)
+{
+ uint8_t * buf = (uint8_t *) ext;
+ struct mpeg_pmt_section * pmt = (struct mpeg_pmt_section *) ext;
+ unsigned int pos = sizeof(struct section_ext);
+ unsigned int len = section_ext_length(ext);
+
+ if (len < sizeof(struct mpeg_pmt_section))
+ return NULL;
+
+ bswap16(buf + pos);
+ pos += 2;
+ bswap16(buf + pos);
+ pos += 2;
+
+ if ((pos + pmt->program_info_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, pmt->program_info_length))
+ return NULL;
+
+ pos += pmt->program_info_length;
+
+ while (pos < len) {
+ struct mpeg_pmt_stream * stream =
+ (struct mpeg_pmt_stream *) (buf + pos);
+
+ if ((pos + sizeof(struct mpeg_pmt_stream)) > len)
+ return NULL;
+
+ bswap16(buf + pos + 1);
+ bswap16(buf + pos + 3);
+ pos += sizeof(struct mpeg_pmt_stream);
+
+ if ((pos + stream->es_info_length) > len)
+ return NULL;
+
+ if (verify_descriptors(buf + pos, stream->es_info_length))
+ return NULL;
+
+ pos += stream->es_info_length;
+ }
+
+ if (pos != len)
+ return NULL;
+
+ return (struct mpeg_pmt_section *) ext;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/pmt_section.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/pmt_section.h
new file mode 100644
index 0000000..73bba1d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/pmt_section.h
@@ -0,0 +1,188 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_PMT_SECTION_H
+#define _UCSI_MPEG_PMT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * mpeg_pmt_section structure.
+ */
+struct mpeg_pmt_section {
+ struct section_ext head;
+
+ EBIT2(uint16_t reserved_1 : 3; ,
+ uint16_t pcr_pid :13; )
+ EBIT2(uint16_t reserved_2 : 4; ,
+ uint16_t program_info_length :12; )
+ /* struct descriptor descriptors[] */
+ /* struct mpeg_pmt_stream streams[] */
+} __ucsi_packed;
+
+/**
+ * A stream within an mpeg_pmt_section.
+ */
+struct mpeg_pmt_stream {
+ uint8_t stream_type;
+ EBIT2(uint16_t reserved_1 : 3; ,
+ uint16_t pid :13; )
+ EBIT2(uint16_t reserved_2 : 4; ,
+ uint16_t es_info_length :12; )
+
+ /* struct descriptor descriptors[] */
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_pmt_section section.
+ *
+ * @param section Pointer to the generic section header.
+ * @return Pointer to the mpeg_pmt_section structure, or NULL on error.
+ */
+extern struct mpeg_pmt_section *mpeg_pmt_section_codec(struct section_ext *section);
+
+/**
+ * Accessor for program_number field of a PMT.
+ *
+ * @param pmt PMT pointer.
+ * @return The program_number.
+ */
+static inline uint16_t mpeg_pmt_section_program_number(struct mpeg_pmt_section *pmt)
+{
+ return pmt->head.table_id_ext;
+}
+
+/**
+ * Convenience iterator for the descriptors field of the mpeg_pmt_section structure.
+ *
+ * @param pmt Pointer to the mpeg_pmt_section structure.
+ * @param pos Variable holding a pointer to the current descriptor.
+ */
+#define mpeg_pmt_section_descriptors_for_each(pmt, pos) \
+ for ((pos) = mpeg_pmt_section_descriptors_first(pmt); \
+ (pos); \
+ (pos) = mpeg_pmt_section_descriptors_next(pmt, pos))
+
+/**
+ * Convenience iterator for the streams field of the mpeg_pmt_section structure.
+ *
+ * @param pmt Pointer to the mpeg_pmt_section structure.
+ * @param pos Variable holding a pointer to the current mpeg_pmt_stream.
+ */
+#define mpeg_pmt_section_streams_for_each(pmt, pos) \
+ for ((pos) = mpeg_pmt_section_streams_first(pmt); \
+ (pos); \
+ (pos) = mpeg_pmt_section_streams_next(pmt, pos))
+
+/**
+ * Convenience iterator for the descriptors field of an mpeg_pmt_stream structure.
+ *
+ * @param stream Pointer to the mpeg_pmt_stream structure.
+ * @param pos Variable holding a pointer to the current descriptor.
+ */
+#define mpeg_pmt_stream_descriptors_for_each(stream, pos) \
+ for ((pos) = mpeg_pmt_stream_descriptors_first(stream); \
+ (pos); \
+ (pos) = mpeg_pmt_stream_descriptors_next(stream, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct descriptor *
+ mpeg_pmt_section_descriptors_first(struct mpeg_pmt_section * pmt)
+{
+ if (pmt->program_info_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t *) pmt + sizeof(struct mpeg_pmt_section));
+}
+
+static inline struct descriptor *
+ mpeg_pmt_section_descriptors_next(struct mpeg_pmt_section *pmt,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t *) pmt + sizeof(struct mpeg_pmt_section),
+ pmt->program_info_length,
+ pos);
+}
+
+static inline struct mpeg_pmt_stream *
+ mpeg_pmt_section_streams_first(struct mpeg_pmt_section * pmt)
+{
+ int pos = sizeof(struct mpeg_pmt_section) + pmt->program_info_length;
+
+ if (pos >= section_ext_length(&pmt->head))
+ return NULL;
+
+ return (struct mpeg_pmt_stream *)((uint8_t *)pmt + pos);
+}
+
+static inline struct mpeg_pmt_stream *
+ mpeg_pmt_section_streams_next(struct mpeg_pmt_section * pmt,
+ struct mpeg_pmt_stream * pos)
+{
+ uint8_t *end = (uint8_t*) pmt + section_ext_length(&pmt->head);
+ uint8_t *next = (uint8_t *) pos + sizeof(struct mpeg_pmt_stream) +
+ pos->es_info_length;
+
+ if (next >= end)
+ return NULL;
+
+ return (struct mpeg_pmt_stream *) next;
+}
+
+static inline struct descriptor *
+ mpeg_pmt_stream_descriptors_first(struct mpeg_pmt_stream *stream)
+{
+ if (stream->es_info_length == 0)
+ return NULL;
+
+ return (struct descriptor *)
+ ((uint8_t*) stream + sizeof(struct mpeg_pmt_stream));
+}
+
+static inline struct descriptor *
+ mpeg_pmt_stream_descriptors_next(struct mpeg_pmt_stream *stream,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t *) stream + sizeof(struct mpeg_pmt_stream),
+ stream->es_info_length,
+ pos);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/private_data_indicator_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/private_data_indicator_descriptor.h
new file mode 100644
index 0000000..80e8ef3
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/private_data_indicator_descriptor.h
@@ -0,0 +1,63 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_PRIVATE_DATA_INDICATOR_DESCRIPTOR
+#define _UCSI_MPEG_PRIVATE_DATA_INDICATOR_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_private_data_indicator_descriptor structure
+ */
+struct mpeg_private_data_indicator_descriptor {
+ struct descriptor d;
+
+ uint32_t private_data_indicator;
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_private_data_indicator_descriptor structure.
+ *
+ * @param d Pointer to the generic descriptor structure.
+ * @return Pointer to the mpeg_private_data_indicator_descriptor, or NULL on error.
+ */
+static inline struct mpeg_private_data_indicator_descriptor*
+ mpeg_private_data_indicator_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_private_data_indicator_descriptor) - 2))
+ return NULL;
+
+ bswap32((uint8_t*) d + 2);
+
+ return (struct mpeg_private_data_indicator_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/registration_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/registration_descriptor.h
new file mode 100644
index 0000000..df5c186
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/registration_descriptor.h
@@ -0,0 +1,91 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_REGISTRATION_DESCRIPTOR
+#define _UCSI_MPEG_REGISTRATION_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_registration_descriptor structure.
+ */
+struct mpeg_registration_descriptor {
+ struct descriptor d;
+
+ uint32_t format_identifier;
+ /* uint8_t additional_id_info[] */
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_registration_descriptor.
+ *
+ * @param d Pointer to the generic descriptor structure.
+ * @return Pointer to the mpeg_registration_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_registration_descriptor*
+ mpeg_registration_descriptor_codec(struct descriptor* d)
+{
+ if (d->len < (sizeof(struct mpeg_registration_descriptor) - 2))
+ return NULL;
+
+ bswap32((uint8_t*) d + 2);
+
+ return (struct mpeg_registration_descriptor*) d;
+}
+
+/**
+ * Retrieve a pointer to the additional_id_info field of the
+ * mpeg_registration_descriptor structure.
+ *
+ * @param d Pointer to the mpeg_registration_descriptor structure.
+ * @return Pointer to the field.
+ */
+static inline uint8_t *
+ mpeg_registration_descriptor_additional_id_info(struct mpeg_registration_descriptor *d)
+{
+ return (uint8_t *) d + sizeof(struct mpeg_registration_descriptor);
+}
+
+/**
+ * Determine number of bytes in the additional_id_info field of the
+ * mpeg_registration_descriptor structure.
+ *
+ * @param d Pointer to the mpeg_registration_descriptor structure.
+ * @return Number of bytes.
+ */
+
+static inline int
+ mpeg_registration_descriptor_additional_id_info_length(struct mpeg_registration_descriptor *d)
+{
+ return d->d.len - 4;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/section.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/section.h
new file mode 100644
index 0000000..6215e95
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/section.h
@@ -0,0 +1,58 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_SECTION_H
+#define _UCSI_MPEG_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/mpeg/cat_section.h>
+#include <libucsi/mpeg/odsmt_section.h>
+#include <libucsi/mpeg/pat_section.h>
+#include <libucsi/mpeg/pmt_section.h>
+#include <libucsi/mpeg/tsdt_section.h>
+#include <libucsi/mpeg/metadata_section.h>
+
+#define TRANSPORT_PAT_PID 0x00
+#define TRANSPORT_CAT_PID 0x01
+#define TRANSPORT_TSDT_PID 0x02
+
+/**
+ * Enumeration of MPEG section tags.
+ */
+enum mpeg_section_tag {
+ stag_mpeg_program_association = 0x00,
+ stag_mpeg_conditional_access = 0x01,
+ stag_mpeg_program_map = 0x02,
+ stag_mpeg_transport_stream_description = 0x03,
+ stag_mpeg_iso14496_scene_description = 0x04,
+ stag_mpeg_iso14496_object_description = 0x05,
+ stag_mpeg_metadata = 0x06
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/sl_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/sl_descriptor.h
new file mode 100644
index 0000000..ab086e3
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/sl_descriptor.h
@@ -0,0 +1,63 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_SL_DESCRIPTOR
+#define _UCSI_MPEG_SL_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_sl_descriptor structure.
+ */
+struct mpeg_sl_descriptor {
+ struct descriptor d;
+
+ uint16_t es_id;
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_sl_descriptor.
+ *
+ * @param d The generic descriptor structure.
+ * @return Pointer to an mpeg_sl_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_sl_descriptor*
+ mpeg_sl_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_sl_descriptor) - 2))
+ return NULL;
+
+ bswap16((uint8_t*) d + 2);
+
+ return (struct mpeg_sl_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/smoothing_buffer_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/smoothing_buffer_descriptor.h
new file mode 100644
index 0000000..5e6ad33
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/smoothing_buffer_descriptor.h
@@ -0,0 +1,66 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_SMOOTHING_BUFFER_DESCRIPTOR
+#define _UCSI_MPEG_SMOOTHING_BUFFER_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_smoothing_buffer_descriptor structure.
+ */
+struct mpeg_smoothing_buffer_descriptor {
+ struct descriptor d;
+
+ EBIT4(uint64_t reserved_1 : 2; ,
+ uint64_t sb_leak_rate :22; ,
+ uint64_t reserved_2 : 2; ,
+ uint64_t sb_size :22; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_smoothing_buffer_descriptor.
+ *
+ * @param d The generic descriptor structure.
+ * @return Pointer to mpeg_smoothing_buffer_descriptor, or NULL on error.
+ */
+static inline struct mpeg_smoothing_buffer_descriptor*
+ mpeg_smoothing_buffer_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_smoothing_buffer_descriptor) - 2))
+ return NULL;
+
+ bswap48((uint8_t*) d + 2);
+
+ return (struct mpeg_smoothing_buffer_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/std_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/std_descriptor.h
new file mode 100644
index 0000000..2625a41
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/std_descriptor.h
@@ -0,0 +1,62 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_STD_DESCRIPTOR
+#define _UCSI_MPEG_STD_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_std_descriptor structure.
+ */
+struct mpeg_std_descriptor {
+ struct descriptor d;
+
+ EBIT2(uint8_t reserved : 7; ,
+ uint8_t leak_valid_flag : 1; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_std_descriptor.
+ *
+ * @param d Pointer to the generic descriptor structure.
+ * @return Pointer to the mpeg_std_descriptor, or NULL on error.
+ */
+static inline struct mpeg_std_descriptor*
+ mpeg_std_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_std_descriptor) - 2))
+ return NULL;
+
+ return (struct mpeg_std_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/system_clock_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/system_clock_descriptor.h
new file mode 100644
index 0000000..681641f
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/system_clock_descriptor.h
@@ -0,0 +1,65 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_SYSTEM_CLOCK_DESCRIPTOR
+#define _UCSI_MPEG_SYSTEM_CLOCK_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_system_clock_descriptor structure.
+ */
+struct mpeg_system_clock_descriptor {
+ struct descriptor d;
+
+ EBIT3(uint8_t external_clock_reference_indicator : 1; ,
+ uint8_t reserved_1 : 1; ,
+ uint8_t clock_accuracy_integer : 6; );
+ EBIT2(uint8_t clock_accuracy_exponent : 3; ,
+ uint8_t reserved_2 : 5; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_system_clock_descriptor.
+ *
+ * @param d The generic descriptor structure.
+ * @return Pointer to a mpeg_system_clock_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_system_clock_descriptor*
+ mpeg_system_clock_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_system_clock_descriptor) - 2))
+ return NULL;
+
+ return (struct mpeg_system_clock_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/target_background_grid_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/target_background_grid_descriptor.h
new file mode 100644
index 0000000..7394e82
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/target_background_grid_descriptor.h
@@ -0,0 +1,66 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_TARGET_BACKGROUND_GRID_DESCRIPTOR
+#define _UCSI_MPEG_TARGET_BACKGROUND_GRID_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * mpeg_target_background_grid_descriptor structure.
+ */
+struct mpeg_target_background_grid_descriptor {
+ struct descriptor d;
+
+ EBIT3(uint32_t horizontal_size : 14; ,
+ uint32_t vertical_size : 14; ,
+ uint32_t aspect_ratio_information : 4; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_target_background_grid_descriptor structure.
+ *
+ * @param d Pointer to the generic descriptor structure.
+ * @return Pointer to the mpeg_target_background_grid_descriptor structure, or
+ * NULL on error.
+ */
+static inline struct mpeg_target_background_grid_descriptor*
+ mpeg_target_background_grid_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_target_background_grid_descriptor) - 2))
+ return NULL;
+
+ bswap32((uint8_t*) d + 2);
+
+ return (struct mpeg_target_background_grid_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/tsdt_section.c b/kaffeine/src/input/dvb/lib/libucsi/mpeg/tsdt_section.c
new file mode 100644
index 0000000..fbbbe3c
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/tsdt_section.c
@@ -0,0 +1,35 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <libucsi/mpeg/tsdt_section.h>
+
+struct mpeg_tsdt_section * mpeg_tsdt_section_codec(struct section_ext * ext)
+{
+ uint8_t * buf = (uint8_t *)ext;
+ int pos = sizeof(struct section_ext);
+
+ if (verify_descriptors(buf + pos,
+ section_ext_length(ext) - sizeof(struct mpeg_tsdt_section)))
+ return NULL;
+
+ return (struct mpeg_tsdt_section *)ext;
+}
+
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/tsdt_section.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/tsdt_section.h
new file mode 100644
index 0000000..9039278
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/tsdt_section.h
@@ -0,0 +1,94 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_TSDT_SECTION_H
+#define _UCSI_MPEG_TSDT_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/section.h>
+
+/**
+ * mpeg_tsdt_section structure.
+ */
+struct mpeg_tsdt_section {
+ struct section_ext head;
+
+ /* struct descriptor descriptors[] */
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_tsdt_section structure.
+ *
+ * @param section Pointer to the section_ext structure.
+ * @return Pointer to the mpeg_tsdt_section structure, or NULL on error.
+ */
+extern struct mpeg_tsdt_section *mpeg_tsdt_section_codec(struct section_ext *section);
+
+/**
+ * Convenience iterator for descriptors field.
+ *
+ * @param tsdt Pointer to the mpeg_tsdt_section structure.
+ * @param pos Variable holding a pointer to the current descriptor.
+ */
+#define mpeg_tsdt_section_descriptors_for_each(tsdt, pos) \
+ for ((pos) = mpeg_tsdt_section_descriptors_first(tsdt); \
+ (pos); \
+ (pos) = mpeg_tsdt_section_descriptors_next(tsdt, pos))
+
+
+
+
+
+
+
+
+
+
+/******************************** PRIVATE CODE ********************************/
+static inline struct descriptor *
+ mpeg_tsdt_section_descriptors_first(struct mpeg_tsdt_section * tsdt)
+{
+ int pos = sizeof(struct mpeg_tsdt_section);
+
+ if (pos >= section_ext_length(&tsdt->head))
+ return NULL;
+
+ return (struct descriptor*)((uint8_t *) tsdt + pos);
+}
+
+static inline struct descriptor *
+ mpeg_tsdt_section_descriptors_next(struct mpeg_tsdt_section *tsdt,
+ struct descriptor* pos)
+{
+ return next_descriptor((uint8_t *) tsdt + sizeof(struct mpeg_tsdt_section),
+ section_ext_length(&tsdt->head) - sizeof(struct mpeg_tsdt_section),
+ pos);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/types.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/types.h
new file mode 100644
index 0000000..300cb23
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/types.h
@@ -0,0 +1,127 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_TYPES_H
+#define _UCSI_MPEG_TYPES_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/**
+ * Known stream types.
+ */
+enum {
+ MPEG_STREAM_TYPE_ISO11172_VIDEO = 0x01,
+ MPEG_STREAM_TYPE_ISO13818_2_VIDEO = 0x02,
+ MPEG_STREAM_TYPE_ISO11172_AUDIO = 0x03,
+ MPEG_STREAM_TYPE_ISO13818_3_AUDIO = 0x04,
+ MPEG_STREAM_TYPE_ISO13818_1_PRIVATE_SECTIONS = 0x05,
+ MPEG_STREAM_TYPE_ISO13818_1_PRIVATE_PES = 0x06,
+ MPEG_STREAM_TYPE_ISO13522_MHEG = 0x07,
+ MPEG_STREAM_TYPE_ISO13818_DSMCC = 0x08,
+ MPEG_STREAM_TYPE_ITUH222_1 = 0x09,
+ MPEG_STREAM_TYPE_ISO13818_6_A = 0x0a,
+ MPEG_STREAM_TYPE_ISO13818_6_B = 0x0b,
+ MPEG_STREAM_TYPE_ISO13818_6_C = 0x0c,
+ MPEG_STREAM_TYPE_ISO13818_6_D = 0x0d,
+ MPEG_STREAM_TYPE_ISO13818_1_AUX = 0x0e,
+ MPEG_STREAM_TYPE_ISO13818_7_AUDIO_ADTS = 0x0f,
+ MPEG_STREAM_TYPE_ISO14496_2_VISUAL = 0x10,
+ MPEG_STREAM_TYPE_ISO14496_3_AUDIO_LATM = 0x11,
+ MPEG_STREAM_TYPE_ISO14496_1_PES = 0x12,
+ MPEG_STREAM_TYPE_ISO14496_1_SECTIONS = 0x13,
+ MPEG_STREAM_TYPE_ISO14496_6_SYNCDOWNLOAD = 0x14,
+ MPEG_STREAM_TYPE_METADATA_PES = 0x15,
+ MPEG_STREAM_TYPE_METADATA_SECTIONS = 0x16,
+ MPEG_STREAM_TYPE_METADATA_DSMCC_DATA = 0x17,
+ MPEG_STREAM_TYPE_METADATA_DSMCC_OBJECT = 0x18,
+ MPEG_STREAM_TYPE_METADATA_SYNCDOWNLOAD = 0x19,
+};
+
+/**
+ * Metadata formats
+ */
+enum {
+ MPEG_METADATA_FORMAT_ISO15938_1_TEM = 0x01,
+ MPEG_METADATA_FORMAT_ISO15938_1_BIM = 0x02,
+ MPEG_METADATA_FORMAT_METADATA_APPLICATION_FORMAT = 0x3F,
+ MPEG_METADATA_FORMAT_METADATA_APPLICATION_FORMAT_ID = 0xFF,
+};
+
+/**
+ * MPEG 4 audio profile and levels.
+ */
+enum {
+ MPEG4_AUDIO_PROFILE_MAIN_LEVEL_1 = 0x10,
+ MPEG4_AUDIO_PROFILE_MAIN_LEVEL_2 = 0x11,
+ MPEG4_AUDIO_PROFILE_MAIN_LEVEL_3 = 0x12,
+ MPEG4_AUDIO_PROFILE_MAIN_LEVEL_4 = 0x13,
+
+ MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_1 = 0x18,
+ MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_2 = 0x19,
+ MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_3 = 0x1a,
+ MPEG4_AUDIO_PROFILE_SCALABLE_LEVEL_4 = 0x1b,
+
+ MPEG4_AUDIO_PROFILE_SPEECH_LEVEL_1 = 0x20,
+ MPEG4_AUDIO_PROFILE_SPEECH_LEVEL_2 = 0x21,
+
+ MPEG4_AUDIO_PROFILE_SYNTHESIS_LEVEL_1 = 0x28,
+ MPEG4_AUDIO_PROFILE_SYNTHESIS_LEVEL_2 = 0x29,
+ MPEG4_AUDIO_PROFILE_SYNTHESIS_LEVEL_3 = 0x2a,
+
+ MPEG4_AUDIO_PROFILE_HQ_LEVEL_1 = 0x30,
+ MPEG4_AUDIO_PROFILE_HQ_LEVEL_2 = 0x31,
+ MPEG4_AUDIO_PROFILE_HQ_LEVEL_3 = 0x32,
+ MPEG4_AUDIO_PROFILE_HQ_LEVEL_4 = 0x33,
+ MPEG4_AUDIO_PROFILE_HQ_LEVEL_5 = 0x34,
+ MPEG4_AUDIO_PROFILE_HQ_LEVEL_6 = 0x35,
+ MPEG4_AUDIO_PROFILE_HQ_LEVEL_7 = 0x36,
+ MPEG4_AUDIO_PROFILE_HQ_LEVEL_8 = 0x37,
+
+ MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_1 = 0x38,
+ MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_2 = 0x39,
+ MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_3 = 0x3a,
+ MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_4 = 0x3b,
+ MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_5 = 0x3c,
+ MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_6 = 0x3d,
+ MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_7 = 0x3e,
+ MPEG4_AUDIO_PROFILE_LOW_DELAY_LEVEL_8 = 0x3f,
+
+ MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_1 = 0x40,
+ MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_2 = 0x41,
+ MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_3 = 0x42,
+ MPEG4_AUDIO_PROFILE_NATURAL_LEVEL_4 = 0x43,
+
+ MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_1 = 0x48,
+ MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_2 = 0x49,
+ MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_3 = 0x4a,
+ MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_4 = 0x4b,
+ MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_5 = 0x4c,
+ MPEG4_AUDIO_PROFILE_MOBILE_LEVEL_6 = 0x4d,
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/video_stream_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/video_stream_descriptor.h
new file mode 100644
index 0000000..14e9196
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/video_stream_descriptor.h
@@ -0,0 +1,101 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_VIDEO_STREAM_DESCRIPTOR
+#define _UCSI_MPEG_VIDEO_STREAM_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+#include <libucsi/endianops.h>
+
+/**
+ * The mpeg_video_stream_descriptor structure
+ */
+struct mpeg_video_stream_descriptor {
+ struct descriptor d;
+
+ EBIT5(uint8_t multiple_frame_rate_flag : 1; ,
+ uint8_t frame_rate_code : 4; ,
+ uint8_t mpeg_1_only_flag : 1; ,
+ uint8_t constrained_parameter_flag : 1; ,
+ uint8_t still_picture_flag : 1; );
+ /* if (mpeg_1_only_flag == 0) struct mpeg_video_stream_extra extra */
+} __ucsi_packed;
+
+/**
+ * The mpeg_video_stream_extra - only present in non-MPEG1-only streams.
+ */
+struct mpeg_video_stream_extra {
+ uint8_t profile_and_level_indication;
+ EBIT3(uint8_t chroma_format : 2; ,
+ uint8_t frame_rate_extension : 1; ,
+ uint8_t reserved : 5; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_video_stream_descriptor structure.
+ *
+ * @param d Pointer to the generic descriptor structure.
+ * @return Pointer to the mpeg_video_stream_descriptor, or NULL on error.
+ */
+static inline struct mpeg_video_stream_descriptor*
+ mpeg_video_stream_descriptor_codec(struct descriptor* d)
+{
+ struct mpeg_video_stream_descriptor* vsd =
+ (struct mpeg_video_stream_descriptor*) d;
+
+ if (d->len < (sizeof(struct mpeg_video_stream_descriptor) - 2))
+ return NULL;
+
+ if (!vsd->mpeg_1_only_flag) {
+ if (d->len != (sizeof(struct mpeg_video_stream_descriptor) +
+ sizeof(struct mpeg_video_stream_extra) - 2))
+ return NULL;
+ }
+
+ return (struct mpeg_video_stream_descriptor*) d;
+}
+
+/**
+ * Get a pointer to the mpeg_video_stream_extra structure.
+ *
+ * @param d Pointer to the mpeg_video_stream_descriptor structure.
+ * @return Pointer to the mpeg_video_stream_extra structure, or NULL on error.
+ */
+static inline struct mpeg_video_stream_extra*
+ mpeg_video_stream_descriptor_extra(struct mpeg_video_stream_descriptor* d)
+{
+ if (d->mpeg_1_only_flag != 0)
+ return NULL;
+
+ return (struct mpeg_video_stream_extra*)
+ ((uint8_t*) d + sizeof(struct mpeg_video_stream_descriptor));
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/mpeg/video_window_descriptor.h b/kaffeine/src/input/dvb/lib/libucsi/mpeg/video_window_descriptor.h
new file mode 100644
index 0000000..a9a63c7
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/mpeg/video_window_descriptor.h
@@ -0,0 +1,64 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_MPEG_VIDEO_WINDOW_DESCRIPTOR
+#define _UCSI_MPEG_VIDEO_WINDOW_DESCRIPTOR 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/descriptor.h>
+
+/**
+ * mpeg_video_window_descriptor structure.
+ */
+struct mpeg_video_window_descriptor {
+ struct descriptor d;
+
+ EBIT3(uint32_t horizontal_offset : 14; ,
+ uint32_t vertical_offset : 14; ,
+ uint32_t window_priority : 4; );
+} __ucsi_packed;
+
+/**
+ * Process an mpeg_video_window_descriptor.
+ *
+ * @param d Pointer to the generic descriptor structure.
+ * @return Pointer to the mpeg_video_window_descriptor structure, or NULL on error.
+ */
+static inline struct mpeg_video_window_descriptor*
+ mpeg_video_window_descriptor_codec(struct descriptor* d)
+{
+ if (d->len != (sizeof(struct mpeg_video_window_descriptor) - 2))
+ return NULL;
+
+ bswap32((uint8_t*) d + 2);
+
+ return (struct mpeg_video_window_descriptor*) d;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/section.h b/kaffeine/src/input/dvb/lib/libucsi/section.h
new file mode 100644
index 0000000..e2f7551
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/section.h
@@ -0,0 +1,253 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Kenneth Aafloy (kenneth@linuxtv.org)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_SECTION_H
+#define _UCSI_SECTION_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <libucsi/endianops.h>
+#include <libucsi/descriptor.h>
+#include <libucsi/crc32.h>
+#include <stdint.h>
+#include <string.h>
+
+#define CRC_SIZE 4
+
+
+/**
+ * Generic section header.
+ */
+struct section {
+ uint8_t table_id;
+ EBIT4(uint16_t syntax_indicator : 1; ,
+ uint16_t private_indicator : 1; , /* 2.4.4.10 */
+ uint16_t reserved : 2; ,
+ uint16_t length :12; )
+} __ucsi_packed;
+
+/**
+ * Generic extended section header structure.
+ */
+struct section_ext {
+ uint8_t table_id;
+ EBIT4(uint16_t syntax_indicator : 1; ,
+ uint16_t private_indicator : 1; , /* 2.4.4.10 */
+ uint16_t reserved : 2; ,
+ uint16_t length :12; )
+
+ uint16_t table_id_ext;
+ EBIT3(uint8_t reserved1 : 2; ,
+ uint8_t version_number : 5; ,
+ uint8_t current_next_indicator : 1; )
+ uint8_t section_number;
+ uint8_t last_section_number;
+} __ucsi_packed;
+
+/**
+ * Structure for keeping track of sections of a PSI table.
+ */
+struct psi_table_state {
+ uint8_t version_number;
+ uint16_t next_section_number;
+ uint8_t complete:1;
+ uint8_t new_table:1;
+} __ucsi_packed;
+
+
+/**
+ * Process a section structure in-place.
+ *
+ * @param buf Pointer to the data.
+ * @param len Length of data.
+ * @return Pointer to the section structure, or NULL if invalid.
+ */
+static inline struct section * section_codec(uint8_t * buf, int len)
+{
+ struct section * ret = (struct section *)buf;
+
+ if (len < 3)
+ return NULL;
+
+ bswap16(buf+1);
+
+ if (len != ret->length + 3)
+ return NULL;
+
+ return ret;
+}
+
+/**
+ * Some sections have a CRC even though they are not section_exts.
+ * This function is to allow checking of them.
+ *
+ * @param section Pointer to the processed section structure.
+ * @return Nonzero on error, or 0 if the CRC was correct.
+ */
+static inline int section_check_crc(struct section *section)
+{
+ uint8_t * buf = (uint8_t *) section;
+ int len = sizeof(struct section) + section->length;
+ uint32_t crc;
+
+ /* the crc check has to be performed on the unswapped data */
+ bswap16(buf+1);
+ crc = crc32(CRC32_INIT, buf, len);
+ bswap16(buf+1);
+
+ /* the crc check includes the crc value,
+ * the result should therefore be zero.
+ */
+ if (crc)
+ return -1;
+ return 0;
+}
+
+
+/**
+ * Decode an extended section structure.
+ *
+ * @param section Pointer to the processed section structure.
+ * @param check_crc If 1, the CRC of the section will also be checked.
+ * @return Pointer to the parsed section_ext structure, or NULL if invalid.
+ */
+static inline struct section_ext * section_ext_decode(struct section * section,
+ int check_crc)
+{
+ if (section->syntax_indicator == 0)
+ return NULL;
+
+ if (check_crc) {
+ if (section_check_crc(section))
+ return NULL;
+ }
+
+ bswap16((uint8_t *)section + sizeof(struct section));
+
+ return (struct section_ext *)section;
+}
+
+/**
+ * Encode an extended section structure for transmission.
+ *
+ * @param section Pointer to the section_ext structure.
+ * @param update_crc If 1, the CRC of the section will also be updated.
+ * @return Pointer to the encoded section_ext structure, or NULL if invalid.
+ */
+static inline struct section_ext * section_ext_encode(struct section_ext* section,
+ int update_crc)
+{
+ if (section->syntax_indicator == 0)
+ return NULL;
+
+ bswap16((uint8_t *)section + sizeof(struct section));
+
+ if (update_crc) {
+ uint8_t * buf = (uint8_t *) section;
+ int len = sizeof(struct section) + section->length;
+ uint32_t crc;
+
+ /* zap the current CRC value */
+ memset(buf+len-4, 0, 4);
+
+ /* the crc has to be performed on the swapped data */
+ bswap16(buf+1);
+ crc = crc32(CRC32_INIT, buf, len);
+ bswap16(buf+1);
+
+ /* update the CRC */
+ *((uint32_t*) (buf+len-4)) = crc;
+ bswap32(buf+len-4);
+ }
+
+ return (struct section_ext *)section;
+}
+
+/**
+ * Determine the total length of a section, including the header.
+ *
+ * @param section The parsed section structure.
+ * @return The length.
+ */
+static inline int section_length(struct section *section)
+{
+ return section->length + sizeof(struct section);
+}
+
+/**
+ * Determine the total length of an extended section, including the header,
+ * but omitting the CRC.
+ *
+ * @param section The parsed section_ext structure.
+ * @return The length.
+ */
+static inline int section_ext_length(struct section_ext * section)
+{
+ return section->length + sizeof(struct section) - CRC_SIZE;
+}
+
+/**
+ * Reset a psi_table_state structure.
+ *
+ * @param tstate The structure to reset.
+ */
+static inline void psi_table_state_reset(struct psi_table_state *tstate)
+{
+ tstate->version_number = 0xff;
+}
+
+/**
+ * Check if a supplied section_ext is something we want to process.
+ *
+ * @param section The parsed section_ext structure.
+ * @param tstate The state structure for this PSI table.
+ * @return 0=> not useful. nonzero => useful.
+ */
+static inline int section_ext_useful(struct section_ext *section, struct psi_table_state *tstate)
+{
+ if ((section->version_number == tstate->version_number) && tstate->complete)
+ return 0;
+ if ((section->version_number != tstate->version_number) && (section->section_number == 0)) {
+ tstate->next_section_number = 0;
+ tstate->complete = 0;
+ tstate->version_number = section->version_number;
+ tstate->new_table = 1;
+ } else if (section->section_number == tstate->next_section_number) {
+ tstate->new_table = 0;
+ } else {
+ return 0;
+ }
+
+ tstate->next_section_number++;
+ if (section->last_section_number < tstate->next_section_number) {
+ tstate->complete = 1;
+ }
+
+ return 1;
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/section_buf.c b/kaffeine/src/input/dvb/lib/libucsi/section_buf.c
new file mode 100644
index 0000000..35d465e
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/section_buf.c
@@ -0,0 +1,173 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <errno.h>
+#include <string.h>
+#include "section_buf.h"
+
+#define SECTION_HDR_SIZE 3
+#define SECTION_PAD 0xff
+
+int section_buf_init(struct section_buf *section, int max)
+{
+ if (max < SECTION_HDR_SIZE)
+ return -EINVAL;
+
+ memset(section, 0, sizeof(struct section_buf));
+ section->max = max; /* max size of data */
+ section->len = SECTION_HDR_SIZE;
+ section->wait_pdu = 1;
+
+ return 0;
+}
+
+int section_buf_add(struct section_buf *section, uint8_t* frag, int len, int *section_status)
+{
+ int copy;
+ int used = 0;
+ uint8_t *data;
+ uint8_t *pos = (uint8_t*) section + sizeof(struct section_buf) + section->count;
+
+ /* have we finished? */
+ if (section->header && (section->len == section->count)) {
+ *section_status = 1;
+ return 0;
+ }
+
+ /* skip over section padding bytes */
+ *section_status = 0;
+ if (section->count == 0) {
+ while(len && (*frag == SECTION_PAD)) {
+ frag++;
+ len--;
+ used++;
+ }
+
+ if (len == 0)
+ return used;
+ }
+
+ /* grab the header to get the section length */
+ if (!section->header) {
+ /* copy the header frag */
+ copy = SECTION_HDR_SIZE - section->count;
+ if (copy > len)
+ copy = len;
+ memcpy(pos, frag, copy);
+ section->count += copy;
+ pos += copy;
+ frag += copy;
+ used += copy;
+ len -= copy;
+
+ /* we need 3 bytes for the section header */
+ if (section->count != SECTION_HDR_SIZE)
+ return used;
+
+ /* work out the length & check it isn't too big */
+ data = (uint8_t*) section + sizeof(struct section_buf);
+ section->len = SECTION_HDR_SIZE + (((data[1] & 0x0f) << 8) | data[2]);
+ if (section->len > section->max) {
+ *section_status = -ERANGE;
+ return len + used;
+ }
+
+ /* update fields */
+ section->header = 1;
+ }
+
+ /* accumulate frag */
+ copy = section->len - section->count;
+ if (copy > len)
+ copy = len;
+ memcpy(pos, frag, copy);
+ section->count += copy;
+ used += copy;
+
+ /* have we finished? */
+ if (section->header && (section->len == section->count))
+ *section_status = 1;
+
+ /* return number of bytes used */
+ return used;
+}
+
+int section_buf_add_transport_payload(struct section_buf *section,
+ uint8_t* payload, int len,
+ int pdu_start, int *section_status)
+{
+ int used = 0;
+ int tmp;
+
+ /* have we finished? */
+ if (section->header && (section->len == section->count)) {
+ *section_status = 1;
+ return 0;
+ }
+
+ /* don't bother if we're waiting for a PDU */
+ *section_status = 0;
+ if (section->wait_pdu && (!pdu_start))
+ return len;
+
+ /* if we're at a PDU start, we need extra handling for the extra first
+ * byte giving the offset to the start of the next section. */
+ if (pdu_start) {
+ /* we have received a pdu */
+ section->wait_pdu = 0;
+
+ /* work out the offset to the _next_ payload */
+ int offset = payload[0];
+ if ((offset+1) > len) {
+ section->wait_pdu = 1;
+ *section_status = -EINVAL;
+ return len;
+ }
+
+ /* accumulate the end if we need to */
+ if (section->count != 0) {
+ /* add the final fragment. */
+ tmp = section_buf_add(section, payload + 1, offset, section_status);
+
+ /* the stream said this was the final fragment
+ * (PDU START bit) - check that it really was! */
+ if ((tmp != offset) || section_buf_remaining(section) || (*section_status != 1)) {
+ *section_status = -ERANGE;
+ section->wait_pdu = 1;
+ return 1 + tmp;
+ }
+
+ /* it is complete - return the number of bytes we used */
+ return 1 + tmp;
+ }
+
+ /* otherwise, we skip the end of the previous section, and
+ * start accumulating the new data. */
+ used = 1 + offset;
+ }
+
+ /* ok, just accumulate the data as normal */
+ tmp = section_buf_add(section, payload+used, len - used, section_status);
+ if (*section_status < 0) {
+ section->wait_pdu = 1;
+ }
+
+ return used + tmp;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/section_buf.h b/kaffeine/src/input/dvb/lib/libucsi/section_buf.h
new file mode 100644
index 0000000..e15cc1d
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/section_buf.h
@@ -0,0 +1,125 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_SECTION_BUF_H
+#define _UCSI_SECTION_BUF_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+
+#define DVB_MAX_SECTION_BYTES 4096
+
+/**
+ * Buffer used to keep track of section fragments. You should allocate an
+ * area of memory of size (sizeof(section_buf) + <maxsectionsize>), and pass that area
+ * to section_buf_init() to set it up.
+ */
+struct section_buf {
+ uint32_t max; /* maximum size of section - setup by section_buf_init() */
+ uint32_t count; /* number of bytes currently accumulated */
+ uint32_t len; /* total number of bytes expected in the complete section */
+ uint8_t header:1; /* flag indicating the section header has been commpletely received */
+ uint8_t wait_pdu:1;/* flag indicating to wait till the next PDU start */
+ /* uint8_t data[] */
+};
+
+/**
+ * Initialise a section_buf structure.
+ *
+ * @param section The section_buf to initialise.
+ * @param max Maximum number of bytes in section (must be > 3)
+ * @return 0 on success, nonzero on error.
+ */
+extern int section_buf_init(struct section_buf *section, int max);
+
+/**
+ * Initialise a section_buf structure.
+ *
+ * @param section The section_buf to initialise.
+ * @param max Maximum number of bytes in section (must be > 3)
+ * @return 0 on success, nonzero on error.
+ */
+static inline void section_buf_reset(struct section_buf *section)
+{
+ int tmp = section->wait_pdu;
+ section_buf_init(section, section->max);
+ section->wait_pdu = tmp;
+}
+
+/**
+ * Add a data fragment to a section_buf.
+ *
+ * @param section section_buf to add to.
+ * @param frag Pointer to data fragment.
+ * @param len Number of bytes of data.
+ * @param section_status 0: nothing special. 1: section complete. -ERANGE indicates that the
+ * section is larger than section->max.
+ * @return Number of bytes which were consumed.
+ */
+extern int section_buf_add(struct section_buf *section, uint8_t* frag, int len, int *section_status);
+
+/**
+ * Add a transport packet PSI payload to a section_buf. This takes into account
+ * the extra byte present in PDU_START flagged packets.
+ *
+ * @param section section_buf to add to.
+ * @param payload Pointer to packet payload data.
+ * @param len Number of bytes of data.
+ * @param pdu_start True if the payload_unit_start_indicator flag was set in the
+ * TS packet.
+ * @param section_status 0: nothing special. 1: section complete. -ERANGE indicates that the
+ * section is larger than section->max. -EINVAL indicates the pointer_field was completely
+ * invalid (too large).
+ */
+extern int section_buf_add_transport_payload(struct section_buf *section,
+ uint8_t* payload, int len,
+ int pdu_start, int *section_status);
+
+/**
+ * Get the number of bytes left to be received in a section_buf.
+ *
+ * @param section The section_buf concerned.
+ * @return The number of bytes.
+ */
+static inline int section_buf_remaining(struct section_buf *section)
+{
+ return section->len - section->count;
+}
+
+/**
+ * Return a pointer to the start of the data in the section_buf.
+ *
+ * @param section The section_buf concerned.
+ * @return The data.
+ */
+static inline uint8_t* section_buf_data(struct section_buf *section)
+{
+ return (uint8_t*) section + sizeof(struct section_buf);
+}
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/testrecord.txt b/kaffeine/src/input/dvb/lib/libucsi/testrecord.txt
new file mode 100644
index 0000000..259ffe1
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/testrecord.txt
@@ -0,0 +1,101 @@
+libucsi test record. Anything without PASS is either not tested, or is
+currently broken.
+
+Testing means (a) ensure there are no segfaults etc. (b) dump the raw hex,
+decode it by hand, and check it matches the output.
+
+Sections:
+PASS mpeg/cat_section.h
+ mpeg/odsmt_section.h
+PASS mpeg/pat_section.h
+PASS mpeg/pmt_section.h
+ mpeg/tsdt_section.h
+ mpeg/metadata_section.h
+PASS dvb/bat_section.h
+ dvb/dit_section.h
+PASS dvb/eit_section.h
+ dvb/int_section.h
+PASS dvb/nit_section.h
+ dvb/rst_section.h
+PASS dvb/sdt_section.h
+ dvb/sit_section.h
+PASS dvb/st_section.h
+PASS dvb/tdt_section.h
+PASS dvb/tot_section.h
+
+Descriptors:
+PASS mpeg/audio_stream_descriptor.h
+PASS mpeg/ca_descriptor.h
+PASS mpeg/copyright_descriptor.h
+PASS mpeg/data_stream_alignment_descriptor.h
+PASS mpeg/external_es_id_descriptor.h
+ mpeg/fmc_descriptor.h
+PASS mpeg/fmxbuffer_size_descriptor.h
+ mpeg/hierarchy_descriptor.h
+ mpeg/ibp_descriptor.h
+ mpeg/iod_descriptor.h
+PASS mpeg/iso_639_language_descriptor.h
+PASS mpeg/maximum_bitrate_descriptor.h
+ mpeg/mpeg4_audio_descriptor.h
+ mpeg/mpeg4_video_descriptor.h
+ mpeg/multiplex_buffer_descriptor.h
+PASS mpeg/multiplex_buffer_utilization_descriptor.h
+ mpeg/muxcode_descriptor.h
+PASS mpeg/private_data_indicator_descriptor.h
+PASS mpeg/registration_descriptor.h
+ mpeg/sl_descriptor.h
+PASS mpeg/smoothing_buffer_descriptor.h
+PASS mpeg/std_descriptor.h
+PASS mpeg/system_clock_descriptor.h
+ mpeg/target_background_grid_descriptor.h
+PASS mpeg/video_stream_descriptor.h
+ mpeg/video_window_descriptor.h
+
+ dvb/ac3_descriptor.h
+ dvb/ancillary_data_descriptor.h
+ dvb/announcement_support_descriptor.h
+ dvb/bouquet_name_descriptor.h
+ dvb/ca_identifier_descriptor.h
+ dvb/ca_system_descriptor.h
+ dvb/cable_delivery_descriptor.h
+ dvb/cell_frequency_link_descriptor.h
+ dvb/cell_list_descriptor.h
+ dvb/component_descriptor.h
+ dvb/content_descriptor.h
+ dvb/country_availability_descriptor.h
+ dvb/data_broadcast_descriptor.h
+ dvb/data_broadcast_id_descriptor.h
+ dvb/descriptor.h
+ dvb/dsng_descriptor.h
+ dvb/extended_event_descriptor.h
+ dvb/frequency_list_descriptor.h
+ dvb/linkage_descriptor.h
+ dvb/local_time_offset_descriptor.h
+ dvb/mosaic_descriptor.h
+ dvb/multilingual_bouquet_name_descriptor.h
+ dvb/multilingual_component_descriptor.h
+ dvb/multilingual_network_name_descriptor.h
+ dvb/multilingual_service_name_descriptor.h
+ dvb/network_name_descriptor.h
+ dvb/nvod_reference_descriptor.h
+ dvb/parental_rating_descriptor.h
+ dvb/partial_transport_stream_descriptor.h
+ dvb/pdc_descriptor.h
+ dvb/private_data_specifier_descriptor.h
+ dvb/satellite_delivery_descriptor.h
+ dvb/service_descriptor.h
+ dvb/service_list_descriptor.h
+ dvb/service_move_descriptor.h
+ dvb/short_event_descriptor.h
+ dvb/short_smoothing_buffer_descriptor.h
+ dvb/stream_identifier_descriptor.h
+ dvb/stuffing_descriptor.h
+ dvb/subtitling_descriptor.h
+ dvb/telephone_descriptor.h
+ dvb/teletext_descriptor.h
+ dvb/terrestrial_delivery_descriptor.h
+ dvb/time_shifted_event_descriptor.h
+ dvb/time_shifted_service_descriptor.h
+ dvb/transport_stream_descriptor.h
+ dvb/vbi_data_descriptor.h
+ dvb/vbi_teletext_descriptor.h
diff --git a/kaffeine/src/input/dvb/lib/libucsi/transport_packet.c b/kaffeine/src/input/dvb/lib/libucsi/transport_packet.c
new file mode 100644
index 0000000..ca6c2e1
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/transport_packet.c
@@ -0,0 +1,256 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "transport_packet.h"
+
+#define CONTINUITY_VALID 0x80
+#define CONTINUITY_DUPESEEN 0x40
+
+int transport_packet_values_extract(struct transport_packet *pkt,
+ struct transport_values *out,
+ enum transport_value extract)
+{
+ uint8_t *end = (uint8_t*) pkt + TRANSPORT_PACKET_LENGTH;
+ uint8_t *adapend;
+ uint8_t *pos = (uint8_t*) pkt + sizeof(struct transport_packet);
+ enum transport_value extracted = 0;
+ enum transport_adaptation_flags adapflags = 0;
+ enum transport_adaptation_extension_flags adapextflags = 0;
+ int adaplength = 0;
+ int adapextlength = 0;
+
+ /* does the packet contain an adaptation field ? */
+ if ((pkt->adaptation_field_control & 2) == 0)
+ goto extract_payload;
+
+ /* get the adaptation field length and skip the byte */
+ adaplength = *pos++;
+
+ /* do we actually have any adaptation data? */
+ if (adaplength == 0)
+ goto extract_payload;
+
+ /* sanity check */
+ adapend = pos + adaplength;
+ if (adapend > end)
+ return -1;
+
+ /* extract the adaptation flags (we must have at least 1 byte to be here) */
+ adapflags = *pos++;
+
+ /* do we actually want anything else? */
+ if ((extract & 0xffff) == 0)
+ goto extract_payload;
+
+ /* PCR? */
+ if (adapflags & transport_adaptation_flag_pcr) {
+ if ((pos+6) > adapend)
+ return -1;
+
+ if (extract & transport_value_pcr) {
+ uint64_t base = ((uint64_t) pos[0] << 25) |
+ ((uint64_t) pos[1] << 17) |
+ ((uint64_t) pos[2] << 9) |
+ ((uint64_t) pos[3] << 1) |
+ ((uint64_t) pos[4] >> 7);
+ uint64_t ext = (((uint64_t) pos[4] & 1) << 8) |
+ (uint64_t) pos[5];
+ out->pcr= base * 300ULL + ext;
+ extracted |= transport_value_pcr;
+ }
+ pos += 6;
+ }
+
+ /* OPCR? */
+ if (adapflags & transport_adaptation_flag_opcr) {
+ if ((pos+6) > adapend)
+ return -1;
+
+ if (extract & transport_value_opcr) {
+ uint64_t base = ((uint64_t) pos[0] << 25) |
+ ((uint64_t) pos[1] << 17) |
+ ((uint64_t) pos[2] << 9) |
+ ((uint64_t) pos[3] << 1) |
+ ((uint64_t) pos[4] >> 7);
+ uint64_t ext = (((uint64_t) pos[4] & 1) << 8) |
+ (uint64_t) pos[5];
+ out->opcr= base * 300ULL + ext;
+ extracted |= transport_value_opcr;
+ }
+ pos += 6;
+ }
+
+ /* splice countdown? */
+ if (adapflags & transport_adaptation_flag_splicing_point) {
+ if ((pos+1) > adapend)
+ return -1;
+
+ if (extract & transport_value_splice_countdown) {
+ out->splice_countdown = *pos;
+ extracted |= transport_value_splice_countdown;
+ }
+ pos++;
+ }
+
+ /* private data? */
+ if (adapflags & transport_adaptation_flag_private_data) {
+ if ((pos+1) > adapend)
+ return -1;
+ if ((pos+1+*pos) > adapend)
+ return -1;
+
+ if (extract & transport_value_private_data) {
+ out->private_data_length = *pos;
+ out->private_data = pos + 1;
+ extracted |= transport_value_private_data;
+ }
+ pos += 1 + *pos;
+ }
+
+ /* is there an adaptation extension? */
+ if (!(adapflags & transport_adaptation_flag_extension))
+ goto extract_payload;
+
+ /* get/check the length */
+ if (pos >= adapend)
+ return -1;
+ adapextlength = *pos++;
+ if ((pos + adapextlength) > adapend)
+ return -1;
+
+ /* do we want/have anything in the adaptation extension? */
+ if (((extract & 0xff00) == 0) || (adapextlength == 0))
+ goto extract_payload;
+
+ /* extract the adaptation extension flags (we must have at least 1 byte
+ * to be here) */
+ adapextflags = *pos++;
+
+ /* LTW? */
+ if (adapextflags & transport_adaptation_extension_flag_ltw) {
+ if ((pos+2) > adapend)
+ return -1;
+
+ if (extract & transport_value_ltw) {
+ if (*pos & 0x80) {
+ out->ltw_offset = ((pos[0] & 0x7f) << 8) |
+ (pos[1]);
+ extracted |= transport_value_ltw;
+ }
+ }
+ pos += 2;
+ }
+
+ /* piecewise_rate? */
+ if (adapextflags & transport_adaptation_extension_flag_piecewise_rate) {
+ if ((pos+3) > adapend)
+ return -1;
+
+ if (extract & transport_value_piecewise_rate) {
+ out->piecewise_rate = ((pos[0] & 0x3f) << 16) |
+ (pos[1] << 8) |
+ pos[2];
+ extracted |= transport_value_piecewise_rate;
+ }
+ pos += 3;
+ }
+
+ /* seamless_splice? */
+ if (adapextflags & transport_adaptation_extension_flag_seamless_splice) {
+ if ((pos+5) > adapend)
+ return -1;
+
+ if (extract & transport_value_piecewise_rate) {
+ out->splice_type = pos[0] >> 4;
+ out->dts_next_au = ((pos[0] & 0x0e) << 29) |
+ (pos[1] << 22) |
+ ((pos[2] & 0xfe) << 14) |
+ (pos[3] << 7) |
+ ((pos[4] & 0xfe) >> 1);
+ extracted |= transport_value_seamless_splice;
+ }
+ pos += 5;
+ }
+
+
+
+extract_payload:
+ /* does the packet contain a payload? */
+ if (pkt->adaptation_field_control & 1) {
+ int off = sizeof(struct transport_packet);
+ if (pkt->adaptation_field_control & 2)
+ off++;
+ off += adaplength;
+
+ out->payload = (uint8_t*) pkt + off;
+ out->payload_length = TRANSPORT_PACKET_LENGTH - off;
+ } else {
+ out->payload = NULL;
+ out->payload_length = 0;
+ }
+
+ out->flags = adapflags;
+ return extracted;
+}
+
+int transport_packet_continuity_check(struct transport_packet *pkt,
+ int discontinuity_indicator, unsigned char *cstate)
+{
+ unsigned char pktcontinuity = pkt->continuity_counter;
+ unsigned char prevcontinuity = *cstate & 0x0f;
+ unsigned char nextcontinuity;
+
+ /* NULL packets have undefined continuity */
+ if (transport_packet_pid(pkt) == TRANSPORT_NULL_PID)
+ return 0;
+
+ /* is the state valid? */
+ if (!(*cstate & CONTINUITY_VALID)) {
+ *cstate = pktcontinuity | CONTINUITY_VALID;
+ return 0;
+ }
+
+ /* check for discontinuity_indicator */
+ if (discontinuity_indicator) {
+ *cstate = pktcontinuity | CONTINUITY_VALID;
+ return 0;
+ }
+
+ /* only packets with a payload should increment the counter */
+ if (pkt->adaptation_field_control & 1)
+ nextcontinuity = (prevcontinuity + 1) & 0xf;
+ else
+ nextcontinuity = prevcontinuity;
+
+ /* check for a normal continuity progression */
+ if (nextcontinuity == pktcontinuity) {
+ *cstate = pktcontinuity | CONTINUITY_VALID;
+ return 0;
+ }
+
+ /* one dupe is allowed */
+ if ((prevcontinuity == pktcontinuity) && (!(*cstate & CONTINUITY_DUPESEEN))) {
+ *cstate = pktcontinuity | (CONTINUITY_VALID|CONTINUITY_DUPESEEN);
+ return 0;
+ }
+
+ /* continuity error */
+ return -1;
+}
diff --git a/kaffeine/src/input/dvb/lib/libucsi/transport_packet.h b/kaffeine/src/input/dvb/lib/libucsi/transport_packet.h
new file mode 100644
index 0000000..7dfbd78
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/transport_packet.h
@@ -0,0 +1,195 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_TRANSPORT_PACKET_H
+#define _UCSI_TRANSPORT_PACKET_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+#include <stdint.h>
+#include "descriptor.h"
+
+#define TRANSPORT_PACKET_LENGTH 188
+#define TRANSPORT_PACKET_SYNC 0x47
+#define TRANSPORT_MAX_PIDS 0x2000
+#define TRANSPORT_NULL_PID 0x1fff
+
+
+/**
+ * Enumeration of adaptation field control values.
+ */
+enum transport_adaptation_field_control {
+ transport_adaptation_field_control_reserved = 0x00,
+ transport_adaptation_field_control_payload_only = 0x01,
+ transport_adaptation_field_control_adaptation_only = 0x02,
+ transport_adaptation_field_control_adaptation_payload = 0x03,
+};
+
+/**
+ * Enumeration of scrambling control values.
+ */
+enum transport_scrambling_control {
+ transport_scrambling_control_unscrambled = 0x00,
+ transport_scrambling_control_user_1 = 0x01,
+ transport_scrambling_control_user_2 = 0x02,
+ transport_scrambling_control_user_3 = 0x03,
+};
+
+/**
+ * Enumeration of adaptation flags.
+ */
+enum transport_adaptation_flags {
+ transport_adaptation_flag_discontinuity = 0x80,
+ transport_adaptation_flag_random_access = 0x40,
+ transport_adaptation_flag_es_priority = 0x20,
+ transport_adaptation_flag_pcr = 0x10,
+ transport_adaptation_flag_opcr = 0x08,
+ transport_adaptation_flag_splicing_point = 0x04,
+ transport_adaptation_flag_private_data = 0x02,
+ transport_adaptation_flag_extension = 0x01,
+};
+
+/**
+ * Enumeration of adaptation extension flags.
+ */
+enum transport_adaptation_extension_flags {
+ transport_adaptation_extension_flag_ltw = 0x80,
+ transport_adaptation_extension_flag_piecewise_rate = 0x40,
+ transport_adaptation_extension_flag_seamless_splice = 0x20,
+};
+
+/**
+ * Enumeration of flags controlling which values to extract using the
+ * transport_packet_values_extract() function.
+ */
+enum transport_value {
+ /* normal adaptation */
+ transport_value_pcr = 0x0001,
+ transport_value_opcr = 0x0002,
+ transport_value_splice_countdown = 0x0004,
+ transport_value_private_data = 0x0008,
+
+ /* extension adaptation */
+ transport_value_ltw = 0x0100,
+ transport_value_piecewise_rate = 0x0200,
+ transport_value_seamless_splice = 0x0400,
+};
+
+/**
+ * Structure describing a transport packet header.
+ */
+struct transport_packet {
+ uint8_t sync_byte;
+ EBIT4(uint8_t transport_error_indicator : 1; ,
+ uint8_t payload_unit_start_indicator : 1; ,
+ uint8_t transport_priority : 1; ,
+ uint8_t pid_hi : 5; );
+ uint8_t pid_lo;
+ EBIT3(uint8_t transport_scrambling_control : 2; ,
+ uint8_t adaptation_field_control : 2; ,
+ uint8_t continuity_counter : 4; );
+ /* values */
+} __ucsi_packed;
+
+/**
+ * Structure to extract values into using the transport_packet_values_extract()
+ * function.
+ */
+struct transport_values {
+ enum transport_adaptation_flags flags; /* always extracted */
+ uint8_t *payload; /* always extracted */
+ uint16_t payload_length; /* always extracted */
+
+ uint64_t pcr;
+ uint64_t opcr;
+ uint8_t splice_countdown;
+ uint8_t private_data_length;
+ uint8_t *private_data;
+ uint16_t ltw_offset;
+ uint32_t piecewise_rate;
+ uint8_t splice_type;
+ uint64_t dts_next_au;
+};
+
+/**
+ * Extract the PID from a transport packet.
+ *
+ * @param pkt The packet.
+ * @return The PID.
+ */
+static inline int transport_packet_pid(struct transport_packet *pkt)
+{
+ return (pkt->pid_hi << 8) | (pkt->pid_lo);
+}
+
+/**
+ * Process a buffer into a transport packet.
+ *
+ * @param buf Raw buffer.
+ * @return transport_packet pointer, or NULL on error.
+ */
+static inline struct transport_packet *transport_packet_init(unsigned char *buf)
+{
+ struct transport_packet *pkt = (struct transport_packet*) buf;
+
+ if (pkt->sync_byte != TRANSPORT_PACKET_SYNC)
+ return NULL;
+
+ if (transport_packet_pid(pkt) >= TRANSPORT_MAX_PIDS)
+ return NULL;
+
+ return pkt;
+}
+
+/**
+ * Check the continuity counter for a packet in a PID stream.
+ *
+ * @param pkt transport_packet to check.
+ * @param discontinuity_indicator Set to 1 if the packet's discontinuity_indicator flag is set.
+ * @param cstate Pointer to a single 8 bit character, used to store state for validating
+ * continuity. To initialise the state, simply set it to 0 before the first call.
+ * @return 0 if the continuity was correct, or nonzero on error. cstate will not be updated on error,
+ * it is up to the caller to clear it to accept the next packet.
+ */
+extern int transport_packet_continuity_check(struct transport_packet *pkt,
+ int discontinuity_indicator, unsigned char *cstate);
+
+/**
+ * Extract selected fields from a transport packet.
+ *
+ * @param pkt The packet.
+ * @param out Destination structure for values.
+ * @param extract Orred bitmask of enum transport_value - tells it what fields
+ * to extract if they are available.
+ * @return < 0 => error. Otherwise, an orred bitmask of enum transport_value
+ * telling you what fields were successfully extracted.
+ */
+extern int transport_packet_values_extract(struct transport_packet *pkt,
+ struct transport_values *out,
+ enum transport_value extract);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/lib/libucsi/types.h b/kaffeine/src/input/dvb/lib/libucsi/types.h
new file mode 100644
index 0000000..b01d79a
--- /dev/null
+++ b/kaffeine/src/input/dvb/lib/libucsi/types.h
@@ -0,0 +1,36 @@
+/*
+ * section and descriptor parser
+ *
+ * Copyright (C) 2005 Andrew de Quincey (adq_dvb@lidskialf.net)
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _UCSI_TYPES_H
+#define _UCSI_TYPES_H 1
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+typedef uint8_t iso639lang_t[3];
+typedef uint8_t iso639country_t[3];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/kaffeine/src/input/dvb/plugins/Makefile.am b/kaffeine/src/input/dvb/plugins/Makefile.am
new file mode 100644
index 0000000..63f5318
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/Makefile.am
@@ -0,0 +1 @@
+SUBDIRS = epg stream \ No newline at end of file
diff --git a/kaffeine/src/input/dvb/plugins/epg/Makefile.am b/kaffeine/src/input/dvb/plugins/epg/Makefile.am
new file mode 100644
index 0000000..28ef5bf
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/epg/Makefile.am
@@ -0,0 +1,16 @@
+lib_LTLIBRARIES = libkaffeineepgplugin.la
+
+METASOURCES = AUTO
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/dvb \
+ -I$(top_srcdir)/kaffeine/src \
+ $(all_includes)
+
+kaffeineincludedir = $(includedir)/kaffeine
+kaffeineinclude_HEADERS = kaffeinedvbevents.h kaffeinedvbsection.h
+
+libkaffeineepgplugin_la_SOURCES = kaffeinedvbevents.cpp kaffeinedvbsection.cpp
+libkaffeineepgplugin_la_LIBADD = $(LIB_KPARTS)
+libkaffeineepgplugin_la_LDFLAGS = $(all_libraries) -version-info 0:1:0 -no-undefined
+
+kde_servicetypes_DATA = kaffeineepgplugin.desktop
diff --git a/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbevents.cpp b/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbevents.cpp
new file mode 100644
index 0000000..afa5e55
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbevents.cpp
@@ -0,0 +1,496 @@
+/*
+ * kaffeinedvbevents.cpp
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/time.h>
+#include <sys/resource.h>
+
+#include <qdatetime.h>
+#include <qfile.h>
+
+#include <klocale.h>
+#include <kstandarddirs.h>
+
+#include "kaffeinedvbevents.h"
+
+
+
+ShortEvent::ShortEvent()
+{
+ name=text="";
+}
+
+ShortEvent::~ShortEvent()
+{
+}
+
+EventDesc::EventDesc()
+{
+ loop = 0;
+ nid=sid=tsid=eid=0;
+ tid=sn=lsn=running=0;
+ title=subtitle="";
+ source="";
+ shortEvents.setAutoDelete( true );
+ extEvents.setAutoDelete( true );
+}
+
+EventDesc::~EventDesc()
+{
+ shortEvents.clear();
+ extEvents.clear();
+}
+
+
+
+EventSid::EventSid( int s )
+{
+ sid = s;
+ events.setAutoDelete( true );
+}
+
+EventSid::~EventSid()
+{
+ QMutexLocker locker( &mutex );
+ events.clear();
+}
+
+void EventSid::remove( EventDesc *d )
+{
+ QMutexLocker locker( &mutex );
+ events.remove( d );
+}
+
+EventDesc *EventSid::getEventDesc( int n )
+{
+ QMutexLocker locker( &mutex );
+ return events.at(n);
+}
+
+
+
+EventTsid::EventTsid( int n, int t )
+{
+ tsid = t;
+ nid = n;
+ sidList.setAutoDelete( true );
+}
+
+EventTsid::~EventTsid()
+{
+ QMutexLocker locker( &mutex );
+ sidList.clear();
+}
+
+EventSid *EventTsid::getNEventSid( int n )
+{
+ QMutexLocker locker( &mutex );
+ return sidList.at( n );
+}
+
+EventSid *EventTsid::getEventSid( int sid )
+{
+ int i;
+
+ QMutexLocker locker( &mutex );
+ for ( i=0; i<(int)sidList.count(); i++ ) {
+ if ( sidList.at(i)->getSid()==sid )
+ return sidList.at(i);
+ }
+ EventSid *es = new EventSid( sid );
+ sidList.append( es );
+ return es;
+}
+
+EventDesc *EventTsid::getEventDesc( int sid, int n )
+{
+ int i;
+ EventSid *es=0;
+
+ mutex.lock();
+ for ( i=0; i<(int)sidList.count(); i++ ) {
+ if ( sidList.at(i)->getSid()==sid ) {
+ es = sidList.at(i);
+ break;
+ }
+ }
+ mutex.unlock();
+ if ( !es )
+ return 0;
+ return es->getEventDesc( n );
+}
+
+
+
+EventSource::EventSource( QString src )
+{
+ source = src;
+ tsidList.setAutoDelete( true );
+}
+
+EventSource::~EventSource()
+{
+ QMutexLocker locker( &mutex );
+ tsidList.clear();
+}
+
+EventTsid *EventSource::getNEventTsid( int n )
+{
+ QMutexLocker locker( &mutex );
+ return tsidList.at( n );
+}
+
+EventSid *EventSource::getEventSid( int nid, int tsid, int sid )
+{
+ int i;
+ EventTsid *et=0;
+
+ mutex.lock();
+ for ( i=0; i<(int)tsidList.count(); i++ ) {
+ if ( tsidList.at(i)->getTsid()==tsid && (nid==0 || tsidList.at(i)->getNid()==nid) ) {
+ et = tsidList.at(i);
+ break;
+ }
+ }
+ if ( !et ) {
+ if ( nid==0) {
+ mutex.unlock();
+ return 0;
+ }
+ et = new EventTsid( nid, tsid );
+ tsidList.append( et );
+ }
+ mutex.unlock();
+ return et->getEventSid( sid );
+}
+
+EventDesc *EventSource::getEventDesc( int nid, int tsid, int sid, int n )
+{
+ int i;
+ EventTsid *et=0;
+
+ mutex.lock();
+ for ( i=0; i<(int)tsidList.count(); i++ ) {
+ if ( tsidList.at(i)->getTsid()==tsid && (nid==0 || tsidList.at(i)->getNid()==nid) ) {
+ et = tsidList.at(i);
+ break;
+ }
+ }
+ mutex.unlock();
+ if ( !et )
+ return 0;
+ return et->getEventDesc( sid, n );
+}
+
+
+
+
+EventTable::EventTable()
+{
+ srcList.setAutoDelete( true );
+ connect ( &cleanTimer, SIGNAL(timeout()), this, SLOT(setClean()) );
+ cleanTimer.start( 10000 );
+ epgLoaded = false;
+}
+
+EventTable::~EventTable()
+{
+ QMutexLocker locker( &mutex );
+ srcList.clear();
+}
+
+void EventTable::saveEpg()
+{
+ EventSource *esrc;
+ EventTsid *et;
+ EventSid *es;
+ QPtrList<EventDesc> *esEvents;
+ EventDesc *desc;
+ int i, k, j, m, n;
+ QCString c;
+ int count=0;
+ unsigned char sync=0xff;
+ QTime t1=QTime::currentTime();
+
+ QFile f( locateLocal("appdata", "dvbepg.data" ) );
+ if ( f.open(IO_WriteOnly|IO_Truncate) ) {
+ QDataStream dt( &f );
+ for( i=0; i<getNSource(); i++ ) {
+ if ( !(esrc=getNEventSource( i )) )
+ continue;
+ for ( m=0; m<esrc->getNTsid(); m++ ) {
+ if ( !(et=esrc->getNEventTsid( m )) )
+ continue;
+ for ( n=0; n<et->getNSid(); n++ ) {
+ if ( !(es=et->getNEventSid( n )) )
+ continue;
+ esEvents = es->getEvents();
+ es->lock();
+ for ( j=0; j<(int)esEvents->count(); j++ ) {
+ if ( !(desc=esEvents->at( j )) )
+ continue;
+ dt << sync; // sync byte
+ c = desc->source.utf8();
+ dt << c.data();
+ dt << desc->tid;
+ dt << desc->sid;
+ dt << desc->tsid;
+ dt << desc->nid;
+ dt << desc->sn;
+ dt << desc->lsn;
+ dt << desc->eid;
+ dt << desc->running;
+ dt << desc->startDateTime.toTime_t();
+ dt << (uint)((desc->duration.hour()*3600)+(desc->duration.minute()*60)+desc->duration.second());
+ dt << desc->shortEvents.count();
+ for ( k=0; k<(int)desc->shortEvents.count(); k++ ) {
+ c = desc->shortEvents.at(k)->name.utf8();
+ dt << c.data();
+ c = desc->shortEvents.at(k)->text.utf8();
+ dt << c.data();
+ }
+ dt << (uint)desc->extEvents.count();
+ for ( k=0; k<(int)desc->extEvents.count(); k++ ) {
+ c = desc->extEvents.at(k)->utf8();
+ dt << c.data();
+ }
+ c = desc->title.utf8();
+ dt << c.data();
+ c = desc->subtitle.utf8();
+ dt << c.data();
+ ++count;
+ }
+ es->unlock();
+ }
+ }
+ }
+ f.close();
+ fprintf( stderr, "Saved epg data : %d events (%d msecs)\n", count, t1.msecsTo(QTime::currentTime()) );
+ }
+}
+
+void EventTable::loadEpg()
+{
+ EventDesc *desc;
+ ShortEvent *sev;
+ EventSid *slist;
+ uint count, tmp, i;
+#define EPGBUFSIZE 500
+ char buf[EPGBUFSIZE];
+ int num=0;
+ unsigned char sync;
+ QDateTime cur=QDateTime::currentDateTime();
+ QTime t1=QTime::currentTime();
+
+ if ( epgLoaded )
+ return;
+
+ epgLoaded = true;
+ QFile f( locateLocal("appdata", "dvbepg.data" ) );
+ if ( f.open(IO_ReadOnly) ) {
+ QDataStream dt( &f );
+ while (!dt.eof() ) {
+ dt >> sync;
+ if ( sync!=0xff ) {
+ f.close();
+ fprintf( stderr, "Sync error while loading epg data : %d events loaded\n", num );
+ return;
+ }
+ desc = new EventDesc();
+ dt >> tmp;
+ if ( !validString( f, desc, tmp, EPGBUFSIZE, num ) ) return;
+ dt.readRawBytes( buf, tmp );
+ desc->source = QString::fromUtf8( buf );
+ dt >> desc->tid;
+ dt >> desc->sid;
+ dt >> desc->tsid;
+ dt >> desc->nid;
+ dt >> desc->sn;
+ dt >> desc->lsn;
+ dt >> desc->eid;
+ dt >> desc->running;
+ dt >> tmp;
+ desc->startDateTime.setTime_t( tmp );
+ dt >> tmp;
+ desc->duration = QTime().addSecs( tmp );
+ dt >> count;
+ for ( i=0; i<count; i++ ) {
+ sev = new ShortEvent();
+ dt >> tmp;
+ if ( !validString( f, desc, tmp, EPGBUFSIZE, num ) ) return;
+ dt.readRawBytes( buf, tmp );
+ sev->name = QString::fromUtf8( buf );
+ dt >> tmp;
+ if ( !validString( f, desc, tmp, EPGBUFSIZE, num ) ) return;
+ dt.readRawBytes( buf, tmp );
+ sev->text = QString::fromUtf8( buf );
+ desc->shortEvents.append( sev );
+ }
+ dt >> count;
+ for ( i=0; i<count; i++ ) {
+ dt >> tmp;
+ if ( !validString( f, desc, tmp, EPGBUFSIZE, num ) ) return;
+ dt.readRawBytes( buf, tmp );
+ desc->extEvents.append( new QString( QString::fromUtf8( buf ) ) );
+ }
+ dt >> tmp;
+ if ( !validString( f, desc, tmp, EPGBUFSIZE, num ) ) return;
+ dt.readRawBytes( buf, tmp );
+ desc->title = QString::fromUtf8( buf );
+ dt >> tmp;
+ if ( !validString( f, desc, tmp, EPGBUFSIZE, num ) ) return;
+ dt.readRawBytes( buf, tmp );
+ desc->subtitle = QString::fromUtf8( buf );
+ if ( desc->startDateTime.addSecs( (desc->duration.hour()*3600)+(desc->duration.minute()*60)+desc->duration.second() )<cur )
+ delete desc;
+ else {
+ slist = getEventSource( desc->source )->getEventSid( desc->nid, desc->tsid, desc->sid );
+ if ( !slist )
+ continue;
+ slist->lock();
+ slist->getEvents()->append( desc );
+ slist->unlock();
+ ++num;
+ }
+ }
+ f.close();
+ fprintf( stderr, "Loaded epg data : %d events (%d msecs)\n", num, t1.msecsTo(QTime::currentTime()) );
+ }
+}
+
+bool EventTable::validString( QFile &f, EventDesc *d, int len, int buflen, int nev )
+{
+ if ( len<1 || len>buflen ) {
+ f.close();
+ fprintf( stderr, "Error while loading epg data : %d events loaded\n", nev );
+ delete d;
+ return false;
+ }
+ return true;
+}
+
+void EventTable::setClean()
+{
+ start();
+}
+
+void EventTable::doClean( bool b )
+{
+ if ( b ) {
+ if ( cleanTimer.isActive() )
+ return;
+ cleanTimer.start( 10000 );
+ }
+ else {
+ cleanTimer.stop();
+ wait();
+ }
+}
+
+void EventTable::run()
+{
+ int k, m, n, sec;
+ EventSource *esrc;
+ EventTsid *et;
+ EventSid *es;
+ EventDesc *desc;
+ QDateTime dt, cur;
+
+ setpriority(PRIO_PROCESS, 0, 19);
+
+ cur = QDateTime::currentDateTime();
+ for( k=0; k<getNSource(); k++ ) {
+ if ( !(esrc=getNEventSource( k )) )
+ continue;
+ for ( m=0; m<esrc->getNTsid(); m++ ) {
+ if ( !(et=esrc->getNEventTsid( m )) )
+ continue;
+ for ( n=0; n<et->getNSid(); n++ ) {
+ if ( !(es=et->getNEventSid( n )) )
+ continue;
+ if ( !(desc=es->getEventDesc( 0 )) )
+ continue;
+ dt = desc->startDateTime;
+ sec = desc->duration.hour()*3600+desc->duration.minute()*60+desc->duration.second();
+ if ( dt.addSecs( sec )<cur )
+ es->remove( desc );
+ }
+ }
+ }
+}
+
+EventSource *EventTable::getNEventSource( int n )
+{
+ QMutexLocker locker( &mutex );
+ return srcList.at( n );
+}
+
+EventSource *EventTable::getEventSource( QString src )
+{
+ int i;
+
+ QMutexLocker locker( &mutex );
+ for ( i=0; i<(int)srcList.count(); i++ ) {
+ if ( srcList.at(i)->getSource()==src )
+ return srcList.at(i);
+ }
+ EventSource *es = new EventSource( src );
+ srcList.append( es );
+ return es;
+}
+
+EventDesc *EventTable::getEventDesc( QString src, int nid, int tsid, int sid, int n )
+{
+ int i;
+ EventSource *es=0;
+
+ mutex.lock();
+ for ( i=0; i<(int)srcList.count(); i++ ) {
+ if ( srcList.at(i)->getSource()==src ) {
+ es = srcList.at(i);
+ break;
+ }
+ }
+ mutex.unlock();
+ if ( !es )
+ return 0;
+ return es->getEventDesc( nid, tsid, sid, n );
+}
+
+
+
+KaffeineEpgPlugin::KaffeineEpgPlugin( QObject* parent, const char* name ) : KParts::Part( parent, name )
+{
+}
+
+KaffeineEpgPlugin::~KaffeineEpgPlugin()
+{
+}
+
+bool KaffeineEpgPlugin::safeLen( unsigned char* buf )
+{
+ if ( buf<(secbuf+readSize) )
+ return true;
+ fprintf( stderr, "EIT (%d:%d) : buffer overflow! Rejected\n", adapter, tuner );
+ return false;
+}
+
+#include "kaffeinedvbevents.moc"
diff --git a/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbevents.h b/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbevents.h
new file mode 100644
index 0000000..07dbd16
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbevents.h
@@ -0,0 +1,177 @@
+/*
+ * kaffeinedvbevents.h
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KAFFEINEDVBEVENTS_H
+#define KAFFEINEDVBEVENTS_H
+
+#include <qtimer.h>
+#include <qmutex.h>
+#include <qfile.h>
+#include <qobject.h>
+
+#include <kparts/part.h>
+
+#include "kaffeinedvbsection.h"
+
+
+
+class ShortEvent
+{
+
+public:
+
+ ShortEvent();
+ ~ShortEvent();
+
+ QString name;
+ QString text;
+};
+
+class EventDesc
+{
+
+public:
+
+ EventDesc();
+ ~EventDesc();
+
+ QString source;
+ unsigned char tid;
+ unsigned short sid;
+ unsigned short tsid;
+ unsigned short nid;
+ unsigned char sn;
+ unsigned char lsn;
+ unsigned short eid;
+ unsigned char running;
+ QDateTime startDateTime;
+ QTime duration;
+ QPtrList<ShortEvent> shortEvents;
+ QPtrList<QString> extEvents;
+ QString title;
+ QString subtitle;
+ unsigned int loop;
+};
+
+
+
+class EventSid
+{
+public:
+ EventSid( int s );
+ ~EventSid();
+ int getSid() { return sid; }
+ void lock() { mutex.lock(); }
+ void unlock() { mutex.unlock(); }
+ QPtrList<EventDesc> *getEvents() { return &events; }
+ EventDesc *getEventDesc( int n );
+ int getNDesc() { return events.count(); }
+ void remove( EventDesc *d );
+private:
+ QMutex mutex;
+ int sid;
+ QPtrList<EventDesc> events;
+};
+
+
+
+class EventTsid
+{
+public:
+ EventTsid( int n, int t );
+ ~EventTsid();
+ int getTsid() { return tsid; }
+ int getNid() { return nid; }
+ EventSid *getEventSid( int sid );
+ EventSid *getNEventSid( int n );
+ int getNSid() { return sidList.count(); }
+ EventDesc *getEventDesc( int sid, int n );
+private:
+ QMutex mutex;
+ int tsid, nid;
+ QPtrList<EventSid> sidList;
+};
+
+
+
+class EventSource
+{
+public:
+ EventSource( QString src );
+ ~EventSource();
+ EventSid *getEventSid( int nid, int tsid, int sid );
+ EventTsid *getNEventTsid( int n );
+ int getNTsid() { return tsidList.count(); }
+ EventDesc *getEventDesc( int nid, int tsid, int sid, int n );
+ QString getSource() { return source; }
+private:
+ QMutex mutex;
+ QString source;
+ QPtrList<EventTsid> tsidList;
+};
+
+
+
+class EventTable : public QObject, public QThread
+{
+ Q_OBJECT
+public:
+ EventTable();
+ ~EventTable();
+ EventSource *getEventSource( QString src );
+ EventDesc *getEventDesc( QString src, int nid, int tsid, int sid, int n );
+ EventSource *getNEventSource( int n );
+ int getNSource() { return srcList.count(); }
+ void doClean( bool b );
+ void saveEpg();
+ void loadEpg();
+protected:
+ virtual void run();
+private:
+ bool validString( QFile &f, EventDesc *d, int len, int buflen, int nev );
+ QMutex mutex;
+ QPtrList<EventSource> srcList;
+ QTimer cleanTimer;
+ bool epgLoaded;
+private slots:
+ void setClean();
+};
+
+
+
+class KDE_EXPORT KaffeineEpgPlugin : public KParts::Part, public KaffeineDVBsection
+{
+ Q_OBJECT
+public:
+ KaffeineEpgPlugin( QObject* parent, const char* name );
+ virtual ~KaffeineEpgPlugin();
+ virtual bool go( QString /*src*/, int /*freqKhz*/ ) { return false; }
+ virtual void stop() {}
+ void setTable( EventTable *table ) { events = table; }
+
+protected:
+ bool safeLen( unsigned char* buf );
+
+ unsigned char secbuf[4096];
+ int readSize;
+ EventTable *events;
+};
+
+#endif /* KAFFEINEDVBEVENTS_H */
diff --git a/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbsection.cpp b/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbsection.cpp
new file mode 100644
index 0000000..d6170e8
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbsection.cpp
@@ -0,0 +1,327 @@
+/*
+ * kaffeinedvbsection.cpp
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+#include <time.h>
+#include <iconv.h>
+
+#include <klocale.h>
+
+#include "kaffeinedvbsection.h"
+
+
+
+KaffeineDVBsection::KaffeineDVBsection()
+{
+}
+
+
+
+KaffeineDVBsection::KaffeineDVBsection( int anum, int tnum, const QString &charset )
+{
+ initSection( anum, tnum, charset );
+}
+
+
+
+void KaffeineDVBsection::initSection( int anum, int tnum, const QString &charset )
+{
+ defaultCharset = charset.ascii();
+ adapter = anum;
+ tuner = tnum;
+ isRunning = false;
+ fdDemux = -1;
+}
+
+
+
+KaffeineDVBsection::~KaffeineDVBsection()
+{
+ if ( fdDemux>-1 )
+ close( fdDemux );
+}
+
+
+
+bool KaffeineDVBsection::setFilter( int pid, int tid, int timeout, bool checkcrc )
+{
+ struct dmx_sct_filter_params sctfilter;
+ QString demuxer = QString("/dev/dvb/adapter%1/demux%2").arg( adapter ).arg( tuner );
+
+ if ((fdDemux = open( demuxer.ascii(), O_RDWR | O_NONBLOCK )) < 0) {
+ perror ("open failed");
+ return false;
+ }
+
+ pf[0].fd = fdDemux;
+ pf[0].events = POLLIN;
+
+ memset( &sctfilter, 0, sizeof( sctfilter ) );
+
+ sctfilter.pid = pid;
+ if ( tid<256 && tid>0 ) {
+ sctfilter.filter.filter[0] = tid;
+ sctfilter.filter.mask[0] = 0xff;
+ }
+ sctfilter.flags = DMX_IMMEDIATE_START;
+ if ( checkcrc )
+ sctfilter.flags|= DMX_CHECK_CRC;
+ sctfilter.timeout = timeout;
+
+ if ( ioctl( fdDemux, DMX_SET_FILTER, &sctfilter ) < 0 ) {
+ perror ( "ioctl DMX_SET_FILTER failed" );
+ return false;
+ }
+ return true;
+}
+
+
+
+void KaffeineDVBsection::stopFilter()
+{
+ ioctl( fdDemux, DMX_STOP );
+ close( fdDemux );
+ fdDemux = -1;
+}
+
+
+
+unsigned int KaffeineDVBsection::getBits( unsigned char *b, int offbits, int nbits )
+{
+ int i, nbytes;
+ unsigned int ret = 0;
+ unsigned char *buf;
+
+ buf = b+(offbits/8);
+ offbits %=8;
+ nbytes = (offbits+nbits)/8;
+ if ( ((offbits+nbits)%8)>0 )
+ nbytes++;
+ for ( i=0; i<nbytes; i++ )
+ ret += buf[i]<<((nbytes-i-1)*8);
+ i = (4-nbytes)*8+offbits;
+ ret = ((ret<<i)>>i)>>((nbytes*8)-nbits-offbits);
+
+ return ret;
+}
+
+
+
+bool KaffeineDVBsection::doIconv( QCString &s, QCString table, char *buffer, int buflen )
+{
+ size_t inSize, outSize=buflen;
+ char *inBuf, *outBuf;
+ iconv_t cd;
+
+ inSize = s.length();
+ if ( inSize<1 )
+ return false;
+ cd = iconv_open( "UTF8", table );
+ inBuf = s.data();
+ outBuf = buffer;
+ outBuf[0] = 0;
+ iconv( cd, &inBuf, &inSize, &outBuf, &outSize );
+ *outBuf = 0;
+ iconv_close( cd );
+ return true;
+}
+
+
+
+QString KaffeineDVBsection::getText( unsigned char *buf, int length )
+{
+ QCString s;
+ QString ret="";
+ int i=0;
+ char buffer[1000];
+ QCString table=defaultCharset;
+
+ if ( length==0 )
+ return "";
+
+ while ( i<length ) {
+ if ( buf[i]<0x20 && (i+2)<length ) {
+ if ( !s.isEmpty() ) {
+ if ( doIconv( s, table, buffer, sizeof(buffer) ) ) {
+ ret += QString::fromUtf8( buffer );
+ s = "";
+ }
+ }
+ switch ( buf[i] ) {
+ case 0x01: table = "ISO8859-5"; ++i; break;
+ case 0x02: table = "ISO8859-6"; ++i; break;
+ case 0x03: table = "ISO8859-7"; ++i; break;
+ case 0x04: table = "ISO8859-8"; ++i; break;
+ case 0x05: table = "ISO8859-9"; ++i; break;
+ case 0x06: table = "ISO8859-10"; ++i; break;
+ case 0x07: table = "ISO8859-11"; ++i; break;
+ case 0x09: table = "ISO8859-13"; ++i; break;
+ case 0x0A: table = "ISO8859-14"; ++i; break;
+ case 0x0B: table = "ISO8859-15"; ++i; break;
+ case 0x13: table = "GB2312"; ++i; break;
+ case 0x14: table = "BIG5"; ++i; break;
+ case 0x10: {
+ switch ( buf[i+2] ) {
+ case 0x01: table = "ISO8859-1"; break;
+ case 0x02: table = "ISO8859-2"; break;
+ case 0x03: table = "ISO8859-3"; break;
+ case 0x04: table = "ISO8859-4"; break;
+ case 0x05: table = "ISO8859-5"; break;
+ case 0x06: table = "ISO8859-6"; break;
+ case 0x07: table = "ISO8859-7"; break;
+ case 0x08: table = "ISO8859-8"; break;
+ case 0x09: table = "ISO8859-9"; break;
+ case 0x0A: table = "ISO8859-10"; break;
+ case 0x0B: table = "ISO8859-11"; break;
+ case 0x0D: table = "ISO8859-13"; break;
+ case 0x0E: table = "ISO8859-14"; break;
+ case 0x0F: table = "ISO8859-15"; break;
+ }
+ i+= 3;
+ break;
+ }
+ default: ++i;
+ }
+ }
+
+ if ( buf[i]>=0x80 && buf[i]<=0x9f ) {
+ ++i;
+ continue; // control codes
+ }
+ s += buf[i++];
+ }
+
+ if ( !s.isEmpty() ) {
+ if ( doIconv( s, table, buffer, sizeof(buffer) ) ) {
+ ret += QString::fromUtf8( buffer );
+ }
+ }
+ return ret;
+}
+
+
+
+QString KaffeineDVBsection::langDesc( unsigned char* buf )
+{
+ char c[4];
+ QString s;
+
+ memset( mempcpy( c, buf+2, 3 ), 0, 1 );
+ s = c;
+ return s;
+}
+
+
+
+QTime KaffeineDVBsection::getTime( unsigned char *buf )
+{
+ int h, m, s;
+
+ h = ((getBits(buf,0,4)*10)+getBits(buf,4,4))%24;
+ m = ((getBits(buf,8,4)*10)+getBits(buf,12,4))%60;
+ s = ((getBits(buf,16,4)*10)+getBits(buf,20,4))%60;
+ return QTime( h, m, s );
+}
+
+
+
+QDate KaffeineDVBsection::getDate( unsigned char *buf )
+{
+ int i, j, m, D, Y, M, k, mjd;
+
+ mjd = getBits(buf,0,16);
+ i = (int)((mjd-15078.2)/365.25);
+ j = (int)(i*365.25);
+ m = (int)((mjd-14956.1-j)/30.6001);
+ D = mjd-14956-j-(int)(m*30.6001);
+ if ( m==14 || m==15 )
+ k = 1;
+ else
+ k = 0;
+ Y = i+k+1900;
+ M = m-1-k*12;
+
+ return QDate( (Y>=1970)?Y:1970, (M>0 && M<13)?M:1, (D>0 && D<32)?D:1 );
+}
+
+
+
+QDateTime KaffeineDVBsection::getDateTime( unsigned char *buf )
+{
+ /*int hh, mm, ss;
+ int i, j, m, D, Y, M, k, mjd;
+ int sec;
+
+ mjd = getBits(buf,0,16);
+ i = (int)((mjd-15078.2)/365.25);
+ j = (int)(i*365.25);
+ m = (int)((mjd-14956.1-j)/30.6001);
+ D = mjd-14956-j-(int)(m*30.6001);
+ if ( m==14 || m==15 ) k = 1;
+ else k = 0;
+ Y = i+k+1900;
+ M = m-1-k*12;
+
+ hh = ((getBits(buf+2,0,4)*10)+getBits(buf+2,4,4))%24;
+ mm = ((getBits(buf+2,8,4)*10)+getBits(buf+2,12,4))%60;
+ ss = ((getBits(buf+2,16,4)*10)+getBits(buf+2,20,4))%60;
+
+ QDateTime dt( QDate( (Y>=1970)?Y:1970, (M>0 && M<13)?M:1, (D>0 && D<32)?D:1 ), QTime( hh, mm, ss ) );
+ QDateTime u( QDate( 1970, 1, 1 ), QTime( 0, 0, 0 ) );
+ sec = u.secsTo( dt );
+ u.setTime_t( sec ); // UTC to local
+ return u;*/
+
+ int i, j, m, k, mjd;
+ struct tm tt;
+ struct tm *t=&tt;
+
+ mjd = getBits(buf,0,16);
+ i = (int)((mjd-15078.2)/365.25);
+ j = (int)(i*365.25);
+ m = (int)((mjd-14956.1-j)/30.6001);
+ t->tm_mday = mjd-14956-j-(int)(m*30.6001);
+ if ( m==14 || m==15 )
+ k = 1;
+ else
+ k = 0;
+ t->tm_year = i+k;
+ t->tm_mon = m-1-k*12-1;
+ t->tm_sec = ((getBits(buf+2,16,4)*10)+getBits(buf+2,20,4))%60;
+ t->tm_min = ((getBits(buf+2,8,4)*10)+getBits(buf+2,12,4))%60;
+ t->tm_hour = ((getBits(buf+2,0,4)*10)+getBits(buf+2,4,4))%24;
+ t->tm_isdst = -1;
+ t->tm_gmtoff = 0;
+
+ time_t p=timegm(t);
+ if ( p>0 ) {
+ t = localtime(&p);
+ return QDateTime( QDate( t->tm_year+1900, t->tm_mon+1, t->tm_mday ), QTime( t->tm_hour, t->tm_min, t->tm_sec ) );
+ }
+ else
+ return QDateTime( QDate( 1970, 1, 1 ), QTime( 0, 0, 0 ) );
+}
diff --git a/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbsection.h b/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbsection.h
new file mode 100644
index 0000000..af451f2
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/epg/kaffeinedvbsection.h
@@ -0,0 +1,64 @@
+/*
+ * kaffeinedvbsection.h
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KAFFEINEDVBSECTION_H
+#define KAFFEINEDVBSECTION_H
+
+#include <sys/poll.h>
+#include <linux/dvb/dmx.h>
+
+#include <qthread.h>
+#include <qdatetime.h>
+
+
+
+class KaffeineDVBsection : public QThread
+{
+
+public:
+
+ KaffeineDVBsection();
+ KaffeineDVBsection( int anum, int tnum, const QString &charset="ISO8859-1" );
+ ~KaffeineDVBsection();
+ void initSection( int anum, int tnum, const QString &charset="ISO8859-1" );
+ static unsigned int getBits( unsigned char *b, int offbits, int nbits );
+
+protected:
+
+ virtual void run() {}
+ QString langDesc( unsigned char* buf );
+ bool setFilter( int pid, int tid, int timeout=5000, bool checkcrc=true );
+ void stopFilter();
+ QString getText( unsigned char *buf, int length );
+ bool doIconv( QCString &s, QCString table, char *buffer, int buflen );
+ QTime getTime( unsigned char *buf );
+ QDate getDate( unsigned char *buf );
+ QDateTime getDateTime( unsigned char *buf );
+
+ int fdDemux;
+ int indexChannels;
+ bool isRunning;
+ int adapter;
+ int tuner;
+ QCString defaultCharset;
+ struct pollfd pf[1];
+};
+
+#endif /* KAFFEINEDVBSECTION_H */
diff --git a/kaffeine/src/input/dvb/plugins/epg/kaffeineepgplugin.desktop b/kaffeine/src/input/dvb/plugins/epg/kaffeineepgplugin.desktop
new file mode 100644
index 0000000..2a71d4f
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/epg/kaffeineepgplugin.desktop
@@ -0,0 +1,4 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=ServiceType
+X-KDE-ServiceType=KaffeineEpgPlugin
diff --git a/kaffeine/src/input/dvb/plugins/stream/Makefile.am b/kaffeine/src/input/dvb/plugins/stream/Makefile.am
new file mode 100644
index 0000000..3d3f9b9
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/stream/Makefile.am
@@ -0,0 +1,16 @@
+lib_LTLIBRARIES = libkaffeinedvbplugin.la
+
+METASOURCES = AUTO
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/dvb \
+ -I$(top_srcdir)/kaffeine/src \
+ $(all_includes)
+
+kaffeineincludedir = $(includedir)/kaffeine
+kaffeineinclude_HEADERS = kaffeinedvbplugin.h
+
+libkaffeinedvbplugin_la_SOURCES = kaffeinedvbplugin.cpp
+libkaffeinedvbplugin_la_LIBADD = $(LIB_KPARTS)
+libkaffeinedvbplugin_la_LDFLAGS = $(all_libraries) -version-info 0:1:0 -no-undefined
+
+kde_servicetypes_DATA = kaffeinedvbplugin.desktop
diff --git a/kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.cpp b/kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.cpp
new file mode 100644
index 0000000..bd3e5b3
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.cpp
@@ -0,0 +1,30 @@
+/*
+ * kaffeinedvbplugin.cpp
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "kaffeinedvbplugin.h"
+#include "kaffeinedvbplugin.moc"
+
+KaffeineDvbPlugin::KaffeineDvbPlugin(QObject* parent, const char* name) : KParts::Part( parent, name )
+{
+}
+
+KaffeineDvbPlugin::~KaffeineDvbPlugin()
+{
+}
diff --git a/kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.desktop b/kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.desktop
new file mode 100644
index 0000000..cc28b16
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.desktop
@@ -0,0 +1,4 @@
+[Desktop Entry]
+Encoding=UTF-8
+Type=ServiceType
+X-KDE-ServiceType=KaffeineDvbPlugin
diff --git a/kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.h b/kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.h
new file mode 100644
index 0000000..f112397
--- /dev/null
+++ b/kaffeine/src/input/dvb/plugins/stream/kaffeinedvbplugin.h
@@ -0,0 +1,52 @@
+/*
+ * kaffeinedvbplugin.h
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KAFFEINEDVBPLUGIN_H
+#define KAFFEINEDVBPLUGIN_H
+
+#include <qpopupmenu.h>
+#include <qstring.h>
+
+#include <kparts/part.h>
+#include <kconfig.h>
+
+/*
+ * Base-Class for Kaffeine DVB plugins.
+ */
+
+class KDE_EXPORT KaffeineDvbPlugin : public KParts::Part
+{
+ Q_OBJECT
+public:
+ KaffeineDvbPlugin(QObject* parent, const char* name);
+ virtual ~KaffeineDvbPlugin();
+ virtual QString pluginName() { return QString(); }
+
+ // returns a "handle".
+ virtual void* init( int /*sid*/ , int /*anum*/, int /*tnum*/, int /*fta*/ ) { return NULL; }
+
+ virtual void process( void* /*handle*/, unsigned char* /*buf*/, int /*len*/ ) {};
+ virtual void close( void* /*handle*/ ) {};
+
+public slots:
+ virtual void configDialog() {};
+};
+
+#endif /* KAFFEINEDVBPLUGIN_H */
diff --git a/kaffeine/src/input/dvb/scandialog.cpp b/kaffeine/src/input/dvb/scandialog.cpp
new file mode 100644
index 0000000..2399c74
--- /dev/null
+++ b/kaffeine/src/input/dvb/scandialog.cpp
@@ -0,0 +1,1019 @@
+/*
+ * scandialog.cpp
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qlayout.h>
+#include <qdir.h>
+#include <qpushbutton.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qgroupbox.h>
+#include <qlistview.h>
+#include <qpopupmenu.h>
+#include <qcursor.h>
+#include <qwhatsthis.h>
+#include <qapplication.h>
+#include <qaccel.h>
+
+#include <klocale.h>
+#include <kiconloader.h>
+#include <kmessagebox.h>
+
+#include "scandialog.h"
+#include "channeleditor.h"
+#include "dvbsi.h"
+
+
+
+DListViewItem::DListViewItem( QListView *parent, ChannelDesc *desc, QString label1, QString label2 )
+ : QListViewItem( parent, label1, label2 )
+{
+ chan = desc;
+}
+
+
+
+ScanDialog::ScanDialog( QPtrList<DvbStream> *d, QPtrList<ChannelDesc> *ch, QSize size, QString src, const QString &charset )
+{
+ QString s;
+ int i, j;
+ QStringList list, tmp;
+
+ KIconLoader *icon = new KIconLoader();
+ tvPix = icon->loadIcon( "kdvbtv", KIcon::Small );
+ tvcPix = icon->loadIcon( "kdvbtvc", KIcon::Small );
+ raPix = icon->loadIcon( "kdvbra", KIcon::Small );
+ racPix = icon->loadIcon( "kdvbrac", KIcon::Small );
+
+ chandesc = ch;
+ dvbsi = 0;
+ dvb = d;
+ sourcesPath = src;
+ defaultCharset = charset;
+
+ for ( i=0; i<(int)dvb->count(); i++ ) {
+ tmp = dvb->at(i)->getSources( true );
+ for ( j=0; j<(int)tmp.count(); j++ ) {
+ if ( tmp[j].startsWith( "AUTO" ) )
+ list.append( QString("AUTO(%1:%2)").arg(dvb->at(i)->getAdapter()).arg(dvb->at(i)->getTuner()) );
+ else
+ list.append( tmp[j] );
+ }
+ }
+ searchComb->insertStringList( list );
+
+ setCaption( i18n("Channels") );
+
+ transponders.setAutoDelete( true );
+
+ QGridLayout *statLayout = new QGridLayout( statusFrame, 1, 1, 11, 6 );
+
+ QLabel *lab = new QLabel( i18n("Signal:"), statusFrame );
+ statLayout->addWidget( lab, 0, 0 );
+ signal = new KGradProgress( statusFrame );
+ statLayout->addWidget( signal, 0, 1 );
+ lab = new QLabel( i18n("SNR:"), statusFrame );
+ statLayout->addWidget( lab, 1, 0 );
+ snr = new KGradProgress( statusFrame );
+ statLayout->addWidget( snr, 1, 1 );
+ lab = new QLabel( i18n("Tuned:"), statusFrame );
+ statLayout->addWidget( lab, 2, 0 );
+ lock = new KLed( statusFrame, "lockLed" );
+ lock->setState( KLed::Off );
+ lock->setDarkFactor( 500 );
+ statLayout->addWidget( lock, 2, 1 );
+ progress = new QProgressBar( 100, statusFrame );
+ progress->setIndicatorFollowsStyle( false );
+ progress->setProgress( 0 );
+ statLayout->addMultiCellWidget( progress, 3, 3, 0, 1 );
+ progressLab = new QLabel( statusFrame );
+ statLayout->addMultiCellWidget( progressLab, 4, 4, 0, 1 );
+
+ channelsList->clear();
+ foundList->clear();
+ foundList->setAllColumnsShowFocus( true );
+ foundList->setSelectionMode( QListView::Extended );
+ channelsList->setSorting( 0 );
+
+ ChannelDesc *chan;
+ QListViewItem *it;
+ for ( int i=0; i<(int)chandesc->count(); i++ ) {
+ chan = chandesc->at(i);
+ it = new QListViewItem( channelsList, chan->name );
+ if ( !chan->pix.isNull() )
+ it->setPixmap( 0, chan->pix );
+ else {
+ if ( chan->type==1 ) {
+ if ( chan->fta )
+ it->setPixmap( 0, tvcPix );
+ else
+ it->setPixmap( 0, tvPix );
+ }
+ else {
+ if ( chan->fta )
+ it->setPixmap( 0, racPix );
+ else
+ it->setPixmap( 0, raPix );
+ }
+ }
+ }
+
+ startBtn->setPaletteForegroundColor( QColor(255,0,0) );
+
+ connect( searchComb, SIGNAL(activated(int)), this, SLOT(setDvb(int)) );
+
+ ds = dvb->at(0);
+ ds->setScanning( true );
+ if ( searchComb->currentText().startsWith( "AUTO" ) )
+ offsetGroup->show();
+ else
+ offsetGroup->hide();
+ bool ok=false;
+ dvbsi = new DVBsi( &ok, ds->getAdapter(), ds->getTuner(), ds, defaultCharset );
+ connect( ds, SIGNAL(snrStatus(int)), snr, SLOT(setProgress(int)) );
+ connect( ds, SIGNAL(signalStatus(int)), signal, SLOT(setProgress(int)) );
+ connect( ds, SIGNAL(lockStatus(bool)), this, SLOT(setLock(bool)) );
+ connect( dvbsi, SIGNAL(end(bool)), this, SLOT(siEnded(bool)) );
+
+ connect( &checkTimer, SIGNAL( timeout() ), this, SLOT( checkNewChannel() ) );
+ connect( &progressTimer, SIGNAL( timeout() ), this, SLOT( setProgress() ) );
+ connect( startBtn, SIGNAL(toggled(bool)), this, SLOT(scan(bool)) );
+ connect( addfilteredBtn, SIGNAL(clicked()), this, SLOT(addFiltered()) );
+ connect( addselectedBtn, SIGNAL(clicked()), this, SLOT(addSelected()) );
+ connect( channelsList, SIGNAL(contextMenuRequested(QListViewItem*,const QPoint&,int)), this, SLOT(pop(QListViewItem*,const QPoint&,int)) );
+ connect( channelsList, SIGNAL(doubleClicked(QListViewItem*,const QPoint &,int)), this, SLOT( slotChannelChanged(QListViewItem*,const QPoint &,int) ) );
+ connect( newBtn, SIGNAL(clicked()), this, SLOT(newChannel()) );
+ connect( delBtn, SIGNAL(clicked()), this, SLOT(deleteAll()) );
+ connect( selectallBtn, SIGNAL(clicked()), this, SLOT(selectAll()) );
+
+ QAccel *ac = new QAccel( channelsList );
+ ac->insertItem( Key_Delete, 100 );
+ ac->connectItem( 100, this, SLOT(deleteChannel()) );
+
+ resize( size );
+ delete icon;
+}
+
+
+
+void ScanDialog::selectAll()
+{
+ foundList->selectAll( true );
+}
+
+
+
+void ScanDialog::slotChannelChanged( QListViewItem *_channel, const QPoint &, int )
+{
+ if ( !_channel )
+ return;
+ QPixmap pix;
+ QString s = _channel->text(0);
+ if ( edit( s, pix ) ) {
+ _channel->setText( 0, s );
+ _channel->setPixmap( 0, pix );
+ }
+}
+
+
+
+void ScanDialog::setDvb( int index )
+{
+ int i, pos=0;
+ QStringList list;
+ bool ok=false;
+
+ for ( i=0; i<(int)dvb->count(); i++ ) {
+ list = dvb->at(i)->getSources( true );
+ pos+= list.count();
+ if ( index<pos ) {
+ if ( checkTimer.isActive() )
+ checkTimer.stop();
+ if ( progressTimer.isActive() )
+ progressTimer.stop();
+ disconnect( ds, SIGNAL(snrStatus(int)), snr, SLOT(setProgress(int)) );
+ disconnect( ds, SIGNAL(signalStatus(int)), signal, SLOT(setProgress(int)) );
+ disconnect( ds, SIGNAL(lockStatus(bool)), this, SLOT(setLock(bool)) );
+ disconnect( dvbsi, SIGNAL(end(bool)), this, SLOT(siEnded(bool)) );
+ ds->setScanning( false );
+ dvbsi->stop();
+ delete dvbsi;
+ ds = dvb->at(i);
+ ds->setScanning( true );
+ dvbsi = new DVBsi( &ok, ds->getAdapter(), ds->getTuner(), ds, defaultCharset );
+ connect( ds, SIGNAL(snrStatus(int)), snr, SLOT(setProgress(int)) );
+ connect( ds, SIGNAL(signalStatus(int)), signal, SLOT(setProgress(int)) );
+ connect( ds, SIGNAL(lockStatus(bool)), this, SLOT(setLock(bool)) );
+ connect( dvbsi, SIGNAL(end(bool)), this, SLOT(siEnded(bool)) );
+ break;
+ }
+ }
+ if ( searchComb->currentText().startsWith( "AUTO" ) )
+ offsetGroup->show();
+ else
+ offsetGroup->hide();
+}
+
+
+
+void ScanDialog::pop( QListViewItem *it, const QPoint &pos, int col )
+{
+ QPoint p=pos;
+
+ if ( !it )
+ return;
+
+ int i=col;
+ QPixmap pix;
+ QString s = it->text(0);
+
+ QPopupMenu *pop = new QPopupMenu();
+ pop->insertItem( i18n("Edit..."), 1 );
+ pop->insertItem( i18n("Delete"), 2 );
+ i = 0;
+ i = pop->exec( QCursor::pos() );
+ switch ( i ) {
+ case 0 :
+ break;
+ case 1 :
+ if ( edit( s, pix ) ) {
+ it->setText( 0, s );
+ it->setPixmap( 0, pix );
+ }
+ break;
+ case 2 :
+ deleteChannel( it->text(0) );
+ break;
+ }
+ delete pop;
+}
+
+
+
+void ScanDialog::deleteChannel()
+{
+ QListViewItem *it = channelsList->currentItem();
+ if ( it )
+ deleteChannel( it->text(0) );
+}
+
+
+
+void ScanDialog::deleteChannel( QString name )
+{
+ int j, i;
+ QListViewItem *it;
+
+ for ( j=0; j<(int)chandesc->count(); j++ ) {
+ if ( chandesc->at(j)->name==name ) {
+ for ( i=0; i<(int)chandesc->count(); i++ ) {
+ if ( chandesc->at(i)->num==chandesc->count() ) {
+ chandesc->at(i)->num = chandesc->at(j)->num;
+ break;
+ }
+ }
+ dvbsi->channels.append( new ChannelDesc( *chandesc->at(j) ) );
+ addFound( dvbsi->channels.getLast(), false );
+ chandesc->remove(j);
+ it = channelsList->firstChild();
+ while ( it!=0 ) {
+ if ( name==it->text(0) ) {
+ channelsList->removeItem( it );
+ break;
+ }
+ it = it->nextSibling();
+ }
+ break;
+ }
+ }
+}
+
+
+
+void ScanDialog::newChannel()
+{
+ ChannelDesc chan;
+ QStringList list;
+ //int i;
+
+ //for ( i=0; i<(int)searchComb->count(); i++ ) list.append( searchComb->text(i) );
+ if ( ds->getType()==FE_QPSK )
+ list.append( searchComb->currentText() );
+ else
+ list = ds->getSources();
+
+ chandesc->append( new ChannelDesc( chan ) );
+ chan.tp.type = ds->getType();
+ chan.num = chandesc->count();
+
+ ChannelEditor dlg( list, false, &chan, chandesc, this );
+
+ int ret = dlg.exec();
+ chandesc->remove();
+ if ( ret==ChannelEditor::Accepted ) {
+ chandesc->append( new ChannelDesc( chan ) );
+ QListViewItem *it = new QListViewItem( channelsList, chan.name );
+ if ( chan.type==1 ) {
+ if ( chan.fta )
+ it->setPixmap( 0, tvcPix );
+ else
+ it->setPixmap( 0, tvPix );
+ }
+ else {
+ if ( chan.fta )
+ it->setPixmap( 0, racPix );
+ else
+ it->setPixmap( 0, raPix );
+ }
+ }
+}
+
+
+
+void ScanDialog::deleteAll()
+{
+ int i, ret;
+
+ ret = KMessageBox::questionYesNo( this, i18n("Do you really want to delete all channels?") );
+ if ( ret!=KMessageBox::Yes )
+ return;
+ for ( i=0; i<(int)chandesc->count(); i++ ) {
+ dvbsi->channels.append( new ChannelDesc( *chandesc->at(i) ) );
+ addFound( dvbsi->channels.getLast(), false );
+ }
+ channelsList->clear();
+ chandesc->clear();
+}
+
+
+
+bool ScanDialog::edit( QString &name, QPixmap &pix )
+{
+ int j;
+ ChannelDesc *chan=0;
+ QStringList list, tmp;
+ int i;
+
+ for ( i=0; i<(int)dvb->count(); i++ ) {
+ tmp = dvb->at(i)->getSources();
+ for ( j=0; j<(int)tmp.count(); j++ )
+ list.append( tmp[j] );
+ }
+
+ for ( j=0; j<(int)chandesc->count(); j++ ) {
+ chan = chandesc->at(j);
+ if ( chan->name==name ) {
+ j = -1;
+ break;
+ }
+ }
+ if ( j==-1 ) {
+ ChannelEditor dlg( list, false, chan, chandesc, this );
+ int ret = dlg.exec();
+ if ( ret==ChannelEditor::Accepted ) {
+ name = chan->name;
+ if ( chan->type==1 ) {
+ if ( chan->fta )
+ pix = tvcPix;
+ else
+ pix = tvPix;
+ }
+ else {
+ if ( chan->fta )
+ pix = racPix;
+ else
+ pix = raPix;
+ }
+ return true;
+ }
+ }
+ return false;
+}
+
+
+
+void ScanDialog::parseTp( QString s, fe_type_t type, QString src )
+{
+ Transponder *trans;
+ QString t;
+ int pos;
+
+ s = s.stripWhiteSpace();
+ trans = new Transponder();
+ pos = s.find(" ");
+ if ( s.left(pos)=="T" ) {
+ trans->type=FE_OFDM;
+ trans->source = "Terrestrial";
+ }
+ else if ( s.left(pos)=="C" ) {
+ trans->type=FE_QAM;
+ trans->source = "Cable";
+ }
+ else {
+ trans->type=FE_QPSK;
+ trans->source = src;
+ }
+ if ( trans->type!=type ) {
+ delete trans;
+ return;
+ }
+ s = s.right( s.length()-pos-1 );
+ s = s.stripWhiteSpace();
+ pos = s.find(" ");
+ trans->freq = s.left(pos).toULong()/1000;
+ s = s.right( s.length()-pos-1 );
+ s = s.stripWhiteSpace();
+ pos = s.find(" ");
+ if ( trans->type==FE_QPSK ) {
+ trans->pol = s.left(pos).lower()[0].latin1();
+ s = s.right( s.length()-pos-1 );
+ s = s.stripWhiteSpace();
+ pos = s.find(" ");
+ }
+ if ( trans->type!=FE_OFDM ) {
+ trans->sr = s.left(pos).toULong()/1000;
+ }
+ else {
+ if ( s.left(pos)=="8MHz" )
+ trans->bandwidth = BANDWIDTH_8_MHZ;
+ else if ( s.left(pos)=="7MHz" )
+ trans->bandwidth = BANDWIDTH_7_MHZ;
+ else if ( s.left(pos)=="6MHz" )
+ trans->bandwidth = BANDWIDTH_6_MHZ;
+ else
+ trans->bandwidth = BANDWIDTH_AUTO;
+ }
+ s = s.right( s.length()-pos-1 );
+ s = s.stripWhiteSpace();
+ pos = s.find(" ");
+ if ( s.left(pos)=="1/2" )
+ trans->coderateH = FEC_1_2;
+ else if ( s.left(pos)=="2/3" )
+ trans->coderateH = FEC_2_3;
+ else if ( s.left(pos)=="3/4" )
+ trans->coderateH = FEC_3_4;
+ else if ( s.left(pos)=="4/5" )
+ trans->coderateH = FEC_4_5;
+ else if ( s.left(pos)=="5/6" )
+ trans->coderateH = FEC_5_6;
+ else if ( s.left(pos)=="6/7" )
+ trans->coderateH = FEC_6_7;
+ else if ( s.left(pos)=="7/8" )
+ trans->coderateH = FEC_7_8;
+ else if ( s.left(pos)=="8/9" )
+ trans->coderateH = FEC_8_9;
+ else if ( s.left(pos)=="NONE" )
+ trans->coderateH = FEC_NONE;
+ else
+ trans->coderateH = FEC_AUTO;
+ s = s.right( s.length()-pos-1 );
+ s = s.stripWhiteSpace();
+ pos = s.find(" ");
+ if ( trans->type==FE_OFDM ) {
+ if ( s.left(pos)=="1/2" )
+ trans->coderateL = FEC_1_2;
+ else if ( s.left(pos)=="2/3" )
+ trans->coderateL = FEC_2_3;
+ else if ( s.left(pos)=="3/4" )
+ trans->coderateL = FEC_3_4;
+ else if ( s.left(pos)=="4/5" )
+ trans->coderateL = FEC_4_5;
+ else if ( s.left(pos)=="5/6" )
+ trans->coderateL = FEC_5_6;
+ else if ( s.left(pos)=="6/7" )
+ trans->coderateL = FEC_6_7;
+ else if ( s.left(pos)=="7/8" )
+ trans->coderateL = FEC_7_8;
+ else if ( s.left(pos)=="8/9" )
+ trans->coderateL = FEC_8_9;
+ else if ( s.left(pos)=="NONE" )
+ trans->coderateL = FEC_NONE;
+ else
+ trans->coderateL = FEC_AUTO;
+
+ if ( trans->coderateH==FEC_NONE )
+ trans->coderateH = FEC_AUTO;
+ if ( trans->coderateL==FEC_NONE )
+ trans->coderateL = FEC_AUTO;
+
+ s = s.right( s.length()-pos-1 );
+ s = s.stripWhiteSpace();
+ pos = s.find(" ");
+ }
+ if ( trans->type!=FE_QPSK ) {
+ if ( s.left(pos)=="QPSK" )
+ trans->modulation = QPSK;
+ else if ( s.left(pos)=="QAM16" )
+ trans->modulation = QAM_16;
+ else if ( s.left(pos)=="QAM32" )
+ trans->modulation = QAM_32;
+ else if ( s.left(pos)=="QAM64" )
+ trans->modulation = QAM_64;
+ else if ( s.left(pos)=="QAM128" )
+ trans->modulation = QAM_128;
+ else if ( s.left(pos)=="QAM256" )
+ trans->modulation = QAM_256;
+ else
+ trans->modulation = QAM_AUTO;
+ }
+ if ( trans->type==FE_OFDM ) {
+ s = s.right( s.length()-pos-1 );
+ s = s.stripWhiteSpace();
+ pos = s.find(" ");
+ if ( s.left(pos)=="8k" )
+ trans->transmission = TRANSMISSION_MODE_8K;
+ else if ( s.left(pos)=="2k" )
+ trans->transmission = TRANSMISSION_MODE_2K;
+ else
+ trans->transmission = TRANSMISSION_MODE_AUTO;
+
+ s = s.right( s.length()-pos-1 );
+ s = s.stripWhiteSpace();
+ pos = s.find(" ");
+ if ( s.left(pos)=="1/32" )
+ trans->guard = GUARD_INTERVAL_1_32;
+ else if ( s.left(pos)=="1/16" )
+ trans->guard = GUARD_INTERVAL_1_16;
+ else if ( s.left(pos)=="1/8" )
+ trans->guard = GUARD_INTERVAL_1_8;
+ else if ( s.left(pos)=="1/4" )
+ trans->guard = GUARD_INTERVAL_1_4;
+ else
+ trans->guard = GUARD_INTERVAL_AUTO;
+
+ s = s.right( s.length()-pos-1 );
+ s = s.stripWhiteSpace();
+ pos = s.find(" ");
+ if ( s.left(pos)=="1" )
+ trans->hierarchy = HIERARCHY_1;
+ else if ( s.left(pos)=="2" )
+ trans->hierarchy = HIERARCHY_2;
+ else if ( s.left(pos)=="4" )
+ trans->hierarchy = HIERARCHY_4;
+ else if ( s.left(pos)=="NONE" )
+ trans->hierarchy = HIERARCHY_NONE;
+ else
+ trans->hierarchy = HIERARCHY_AUTO;
+ }
+ transponders.append( trans );
+}
+
+
+
+bool ScanDialog::getTransData()
+{
+ QString s=sourcesPath;
+
+ transponders.clear();
+
+ if ( searchComb->currentText().startsWith("AUTO") ) {
+ int i;
+ for ( i=402; i<900; i+=8 ) {
+ if ( offset167m->isChecked() ) {
+ s = QString("T %1 8MHz AUTO AUTO AUTO AUTO AUTO AUTO").arg( (i*1000000)-167000 );
+ parseTp( s, ds->getType(), "" );
+ }
+ if ( offset0->isChecked() ) {
+ s = QString("T %1 8MHz AUTO AUTO AUTO AUTO AUTO AUTO").arg( i*1000000 );
+ parseTp( s, ds->getType(), "" );
+ }
+ if ( offset167p->isChecked() ) {
+ s = QString("T %1 8MHz AUTO AUTO AUTO AUTO AUTO AUTO").arg( (i*1000000)+167000 );
+ parseTp( s, ds->getType(), "" );
+ }
+ }
+ return true;
+ }
+
+ switch ( ds->getType() ) {
+ case FE_QPSK : s += "dvb-s/"; break;
+ case FE_QAM : s += "dvb-c/"; break;
+ case FE_OFDM : s += "dvb-t/"; break;
+ case FE_ATSC : return false;
+ }
+ s += searchComb->currentText();
+ QFile f( s );
+ if ( f.open(IO_ReadOnly) ) {
+ QTextStream tt( &f );
+ while ( !tt.eof() ) {
+ s = tt.readLine();
+ if ( s.startsWith("#") )
+ continue;
+ if ( s.length()==0 )
+ continue;
+ parseTp( s, ds->getType(), searchComb->currentText() );
+ }
+ f.close();
+ return true;
+ }
+ else
+ return false;
+}
+
+
+
+void ScanDialog::checkDuplicateName( ChannelDesc *chan )
+{
+ QString org, name;
+ int i, j=1;
+ bool loop;
+
+ org = name = chan->name;
+
+ do {
+ loop = false;
+ for ( i=0; i<(int)chandesc->count(); i++ ) {
+ if ( name==chandesc->at(i)->name ) {
+ name = org+"-"+QString().setNum(j);
+ loop = true;
+ ++j;
+ break;
+ }
+ }
+ } while ( loop );
+ chan->name = name;
+}
+
+bool ScanDialog::checkChannUpdate( ChannelDesc *chan )
+{
+ int i, j;
+ AudioPid a;
+ SubPid s;
+ ChannelDesc *desc;
+
+ for ( i=0; i<(int)chandesc->count(); i++ ) {
+ desc = chandesc->at(i);
+ if ( chan->tp.source==desc->tp.source && chan->tp.freq==desc->tp.freq && chan->sid==desc->sid ) {
+ chan->category=desc->category;
+ chan->num=desc->num;
+ chan->name=desc->name;
+ chan->fta=desc->fta;
+ for ( j=0; j<chan->napid; j++ ) {
+ if ( desc->apid[0].pid==chan->apid[j].pid ) {
+ if ( j>0 ) {
+ a = chan->apid[0];
+ chan->apid[0]=chan->apid[j];
+ chan->apid[j]=a;
+ }
+ break;
+ }
+ }
+ for ( j=0; j<chan->nsubpid; j++ ) {
+ if ( desc->subpid[0].pid==chan->subpid[j].pid ) {
+ if ( j>0 ) {
+ s = chan->subpid[0];
+ chan->subpid[0]=chan->subpid[j];
+ chan->subpid[j]=s;
+ }
+ break;
+ }
+ }
+ chandesc->replace(i,new ChannelDesc(*chan));
+ return false;
+ }
+ }
+ return true;
+}
+
+
+void ScanDialog::addSelected()
+{
+ ChannelDesc *chan;
+ DListViewItem *dit, *odit;
+ QListViewItem *it;
+
+ dit = (DListViewItem*)foundList->firstChild();
+ while( dit ) {
+ chan = 0;
+ if ( !dit->isSelected( ) ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ chan = dit->chan;
+ if ( !chan ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if(checkChannUpdate(chan)){
+ checkDuplicateName( chan );
+
+ chan->num = chandesc->count()+1;
+ chandesc->append( new ChannelDesc( *chan ) );
+ it = new QListViewItem( channelsList, chan->name );
+ if ( chan->type==1 ) {
+ if ( chan->fta )
+ it->setPixmap( 0, tvcPix );
+ else
+ it->setPixmap( 0, tvPix );
+ }
+ else {
+ if ( chan->fta )
+ it->setPixmap( 0, racPix );
+ else
+ it->setPixmap( 0, raPix );
+ }
+ }
+ odit = dit;
+ dit = (DListViewItem*)dit->nextSibling();
+ delete odit;
+ dvbsi->channels.remove( chan );
+ }
+}
+
+
+
+void ScanDialog::working( bool b )
+{
+ offsetGroup->setEnabled( !b );
+ addfilteredBtn->setEnabled( !b );
+ addselectedBtn->setEnabled( !b );
+ //if ( !isTuned ) searchGroup->setEnabled( !b );
+ newBtn->setEnabled( !b );
+ delBtn->setEnabled( !b );
+}
+
+
+
+void ScanDialog::addFiltered()
+{
+ ChannelDesc *chan;
+ QListViewItem *it;
+ DListViewItem *dit, *odit;
+ int m = dvbsi->channels.count();
+ int t=0;
+
+ working( true );
+ startBtn->setEnabled( false );
+ progress->setProgress(0);
+ qApp->processEvents();
+
+ dit = (DListViewItem*)foundList->firstChild();
+ while( dit ) {
+ t++;
+ progress->setProgress( t*100/m );
+ chan = dit->chan;
+ if ( !chan->completed ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( chan->name.isEmpty() ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( chan->type<1 ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( chan->type>2 ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( chan->type==1 && chan->vpid==0 ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( chan->type==1 && chan->napid==0 ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( chan->type==2 && chan->napid==0 ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( chan->type==2 && chan->vpid!=0 ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( ftaCb->isChecked() && chan->fta ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( !tvCb->isChecked() && chan->type==1 ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( !radioCb->isChecked() && chan->type==2 ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if ( providerCb->isChecked() && chan->provider!=providerComb->currentText() ) {
+ dit = (DListViewItem*)dit->nextSibling();
+ continue;
+ }
+ if(checkChannUpdate(chan)){
+ checkDuplicateName( chan );
+
+ chan->num = chandesc->count()+1;
+ chandesc->append( new ChannelDesc( *chan ) );
+ it = new QListViewItem( channelsList, chan->name );
+ if ( chan->type==1 ) {
+ if ( chan->fta )
+ it->setPixmap( 0, tvcPix );
+ else
+ it->setPixmap( 0, tvPix );
+ }
+ else {
+ if ( chan->fta )
+ it->setPixmap( 0, racPix );
+ else
+ it->setPixmap( 0, raPix );
+ }
+ }
+ odit = dit;
+ dit = (DListViewItem*)dit->nextSibling();
+ delete odit;
+ dvbsi->channels.remove( chan );
+ }
+
+ progress->setProgress(0);
+ startBtn->setEnabled( true );
+ working( false );
+}
+
+
+
+void ScanDialog::siEnded( bool b )
+{
+ checkTimer.stop();
+ progressTimer.stop();
+ checkNewChannel();
+ snr->setProgress( 0 );
+ signal->setProgress( 0 );
+ setLock( false );
+ progress->setProgress( 0 );
+ startBtn->setOn( !b );
+ working( false );
+ startBtn->setText( i18n("START scan") );
+ startBtn->setPaletteForegroundColor( QColor(255,0,0) );
+}
+
+
+
+void ScanDialog::scan( bool b )
+{
+ if ( b ) {
+ if ( checkTimer.isActive() )
+ checkTimer.stop();
+ foundList->clear();
+ nChannels = 0;
+ ntv = nradio = 0;
+ if ( ds->isTuned() )
+ dvbsi->go( transponders, 2 );
+ else {
+ if ( !getTransData() )
+ return;
+ if ( searchComb->currentText().startsWith("AUTO") )
+ dvbsi->go( transponders, 0 ); // no NIT
+ else
+ dvbsi->go( transponders );
+ }
+ checkTimer.start( 100 );
+ progressTimer.start( 1000 );
+ working( true );
+ startBtn->setText( i18n("STOP scan") );
+ startBtn->setPaletteForegroundColor( QColor(0,255,0) );
+ searchComb->setEnabled( false );
+ }
+ else {
+ //setCursor(QCursor(Qt::WaitCursor));
+ startBtn->setText( i18n("Stopping...") );
+ startBtn->setEnabled( false );
+ qApp->processEvents();
+ dvbsi->stop();
+ checkTimer.stop();
+ progressTimer.stop();
+ checkNewChannel();
+ snr->setProgress( 0 );
+ signal->setProgress( 0 );
+ setLock( false );
+ progress->setProgress( 0 );
+ working( false );
+ //setCursor(QCursor(Qt::ArrowCursor));
+ startBtn->setText( i18n("START scan") );
+ startBtn->setEnabled( true );
+ startBtn->setPaletteForegroundColor( QColor(255,0,0) );
+ searchComb->setEnabled( true );
+ }
+}
+
+
+
+void ScanDialog::setProgress()
+{
+ if ( !dvbsi->transponders.count() )
+ return;
+ progress->setProgress( dvbsi->progressTransponder*100/dvbsi->transponders.count() );
+}
+
+
+
+void ScanDialog::setLock( bool on )
+{
+ if ( on )
+ lock->on();
+ else
+ lock->off();
+}
+
+
+
+void ScanDialog::checkNewChannel()
+{
+ ChannelDesc *chan;
+ int j;
+
+ for ( j=nChannels; j<(int)dvbsi->channels.count(); j++ ) {
+ chan = dvbsi->channels.at(j);
+ if ( chan->completed==0 )
+ break;
+ nChannels++;
+ if ( chan->name.isEmpty() )
+ continue;
+ if ( chan->type<1 )
+ continue;
+ if ( chan->type>2 )
+ continue;
+ if ( chan->type==1 && chan->vpid==0 )
+ continue;
+ if ( chan->type==1 && chan->napid==0 )
+ continue;
+ if ( chan->type==2 && chan->napid==0 )
+ continue;
+ if ( chan->type==2 && chan->vpid!=0 )
+ continue;
+ addFound( chan, true );
+ }
+}
+
+
+
+void ScanDialog::addFound( ChannelDesc *chan, bool scan )
+{
+ int i;
+ DListViewItem *it;
+
+ it = new DListViewItem( foundList, chan, QString( "%1").arg( chan->tp.snr ), chan->name );
+
+ if ( chan->type==1 ) {
+ if ( scan )
+ ntv++;
+ if ( chan->fta )
+ it->setPixmap( 1, tvcPix );
+ else
+ it->setPixmap( 1, tvPix );
+ }
+ else {
+ if ( scan )
+ nradio++;
+ if ( chan->fta )
+ it->setPixmap( 1, racPix );
+ else
+ it->setPixmap( 1, raPix );
+ }
+
+ if ( scan )
+ progressLab->setText( QString( i18n("Found: %1 TV - %2 radio") ).arg(ntv).arg(nradio) );
+ if ( chan->provider.isEmpty() )
+ return;
+ for ( i=0; i<providerComb->count(); i++ ) {
+ if ( chan->provider==providerComb->text(i) ) {
+ i = -1;
+ break;
+ }
+ }
+ if ( i>-1 )
+ providerComb->insertItem( chan->provider );
+}
+
+
+
+ScanDialog::~ScanDialog()
+{
+ if ( checkTimer.isActive() )
+ checkTimer.stop();
+ if ( progressTimer.isActive() )
+ progressTimer.stop();
+ dvbsi->stop();
+ delete dvbsi;
+
+ ds->setScanning( false );
+ transponders.clear();
+}
+
+#include "scandialog.moc"
diff --git a/kaffeine/src/input/dvb/scandialog.h b/kaffeine/src/input/dvb/scandialog.h
new file mode 100644
index 0000000..b73e6d2
--- /dev/null
+++ b/kaffeine/src/input/dvb/scandialog.h
@@ -0,0 +1,106 @@
+/*
+ * scandialog.h
+ *
+ * Copyright (C) 2004-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SCANDIALOG_H
+#define SCANDIALOG_H
+
+#include <qtimer.h>
+#include <qprogressbar.h>
+#include <qlabel.h>
+
+#include <kled.h>
+
+#include "kgradprogress.h"
+#include "scandialogui.h"
+#include "channeldesc.h"
+
+class DVBsi;
+class DvbStream;
+
+
+
+class DListViewItem : public QListViewItem
+{
+
+public:
+
+ DListViewItem( QListView *parent, ChannelDesc *desc, QString label1, QString label2 );
+
+ ChannelDesc *chan;
+};
+
+
+
+class ScanDialog : public ScanDialogUI
+{
+ Q_OBJECT
+
+public:
+
+ ScanDialog( QPtrList<DvbStream> *d, QPtrList<ChannelDesc> *ch, QSize size, QString src, const QString &charset );
+ ~ScanDialog();
+
+ QPtrList<Transponder> transponders;
+ QPtrList<ChannelDesc> *chandesc;
+
+private slots:
+
+ void scan( bool b );
+ void checkNewChannel();
+ void setLock( bool on );
+ void siEnded( bool b );
+ void addFiltered();
+ void addSelected();
+ void setProgress();
+ void pop( QListViewItem *it, const QPoint &pos, int col );
+ void deleteAll();
+ void selectAll();
+ void newChannel();
+ void deleteChannel( QString name );
+ void deleteChannel();
+ void setDvb(int);
+ void slotChannelChanged( QListViewItem*, const QPoint &, int );
+
+private:
+
+ bool getTransData();
+ bool edit( QString &name, QPixmap &pix );
+ void working( bool b );
+ void parseTp( QString s, fe_type_t type, QString src );
+ void addFound( ChannelDesc *chan, bool scan );
+ void checkDuplicateName( ChannelDesc *chan );
+ bool checkChannUpdate( ChannelDesc *chan );
+
+ QPtrList<DvbStream> *dvb;
+ DvbStream *ds;
+ KGradProgress *snr, *signal;
+ QProgressBar *progress;
+ KLed *lock;
+ DVBsi *dvbsi;
+ QTimer checkTimer, progressTimer;
+ int nChannels;
+ QPixmap tvPix, raPix, tvcPix, racPix;
+ int ntv, nradio;
+ QLabel *progressLab;
+ QString sourcesPath;
+ QString defaultCharset;
+};
+
+#endif /* SCANDIALOG_H */
diff --git a/kaffeine/src/input/dvb/scandialogui.ui b/kaffeine/src/input/dvb/scandialogui.ui
new file mode 100644
index 0000000..04cbdd1
--- /dev/null
+++ b/kaffeine/src/input/dvb/scandialogui.ui
@@ -0,0 +1,514 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>ScanDialogUI</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>ScanDialogUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>725</width>
+ <height>560</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Channels</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox10</cstring>
+ </property>
+ <property name="title">
+ <string>Channels</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel" row="0" column="0" rowspan="1" colspan="3">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>(Right click to edit/delete)</string>
+ </property>
+ </widget>
+ <widget class="QListView" row="1" column="0" rowspan="1" colspan="3">
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>channelsList</cstring>
+ </property>
+ <property name="rootIsDecorated">
+ <bool>false</bool>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="0">
+ <property name="name">
+ <cstring>newBtn</cstring>
+ </property>
+ <property name="text">
+ <string>New...</string>
+ </property>
+ </widget>
+ <widget class="QPushButton" row="2" column="2">
+ <property name="name">
+ <cstring>delBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Delete All</string>
+ </property>
+ </widget>
+ <spacer row="2" column="1">
+ <property name="name">
+ <cstring>spacer7</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout7</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>searchGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Search On</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QComboBox">
+ <property name="name">
+ <cstring>searchComb</cstring>
+ </property>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>offsetGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Offset (KHz)</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>offset0</cstring>
+ </property>
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>offset167p</cstring>
+ </property>
+ <property name="text">
+ <string>+167</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox">
+ <property name="name">
+ <cstring>offset167m</cstring>
+ </property>
+ <property name="text">
+ <string>-167</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>startBtn</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Start Scan</string>
+ </property>
+ <property name="toggleButton">
+ <bool>true</bool>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer15</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>statusFrame</cstring>
+ </property>
+ <property name="title">
+ <string></string>
+ </property>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer11</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>21</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout38</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>filtersGroup</cstring>
+ </property>
+ <property name="title">
+ <string>Filters</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QCheckBox" row="0" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>ftaCb</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Free to air</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="2" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>radioCb</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Radio</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="1" column="0" rowspan="1" colspan="2">
+ <property name="name">
+ <cstring>tvCb</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>4</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>TV</string>
+ </property>
+ </widget>
+ <widget class="QCheckBox" row="3" column="0">
+ <property name="name">
+ <cstring>providerCb</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>0</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Provider:</string>
+ </property>
+ </widget>
+ <widget class="QComboBox" row="3" column="1">
+ <property name="name">
+ <cstring>providerComb</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>3</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>addselectedBtn</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;&lt; Add Selected</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>addfilteredBtn</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>1</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>&lt;&lt; Add Filtered</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox11</cstring>
+ </property>
+ <property name="title">
+ <string>Found</string>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout8</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListView">
+ <column>
+ <property name="text">
+ <string>SNR</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Name</string>
+ </property>
+ <property name="clickable">
+ <bool>true</bool>
+ </property>
+ <property name="resizable">
+ <bool>true</bool>
+ </property>
+ </column>
+ <property name="name">
+ <cstring>foundList</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>7</hsizetype>
+ <vsizetype>3</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>selectallBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Select All</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="Line">
+ <property name="name">
+ <cstring>line1</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer4</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Done</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>ScanDialogUI</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>okBtn</tabstop>
+ <tabstop>searchComb</tabstop>
+ <tabstop>startBtn</tabstop>
+ <tabstop>ftaCb</tabstop>
+ <tabstop>tvCb</tabstop>
+ <tabstop>radioCb</tabstop>
+ <tabstop>providerCb</tabstop>
+ <tabstop>providerComb</tabstop>
+ <tabstop>addselectedBtn</tabstop>
+ <tabstop>addfilteredBtn</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kaffeine/src/input/dvb/sender.cpp b/kaffeine/src/input/dvb/sender.cpp
new file mode 100644
index 0000000..27e5d9d
--- /dev/null
+++ b/kaffeine/src/input/dvb/sender.cpp
@@ -0,0 +1,114 @@
+/*
+ * sender.cpp
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include "sender.h"
+
+
+
+Sender::Sender()
+{
+ isRunning = false;
+ senderSocket = 0;
+ sendList = "\n";
+}
+
+
+
+bool Sender::makeSenderSocket( const QString &addr, int m_senderPort )
+{
+ int sockopt=1;
+
+ if ( senderSocket ) return true;
+
+ if ( ( senderSocket = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
+ KMessageBox::error( 0, i18n("Can't open DVB info socket.") );
+ senderSocket = 0;
+ return false;
+ }
+
+ senderAddr.sin_family = AF_INET; // host byte order
+ senderAddr.sin_port = htons( m_senderPort ); // short, network byte order
+ senderAddr.sin_addr.s_addr = inet_addr( addr.ascii() );
+
+ memset( &( senderAddr.sin_zero ), '\0', 8 ); // zero the rest of the struct
+
+ if ( setsockopt( senderSocket, SOL_SOCKET, SO_BROADCAST, &sockopt, sizeof(sockopt) ) < 0 ) {
+ KMessageBox::error( 0, i18n("Can't open DVB info socket.") );
+ close( senderSocket );
+ senderSocket = 0;
+ return false;
+ }
+ fprintf( stderr, "Sender socket opened\n" );
+ return true;
+}
+
+
+
+Sender::~Sender()
+{
+ stop();
+}
+
+
+
+void Sender::closeSender()
+{
+ if ( senderSocket ) {
+ sendto( senderSocket, "quit\n", 5, 0, (struct sockaddr *)&senderAddr, sizeof(senderAddr) );
+ close( senderSocket );
+ senderSocket = 0;
+ fprintf( stderr, "Sender socket closed\n" );
+ }
+}
+
+
+
+void Sender::run()
+{
+ int i;
+
+ while( isRunning ) {
+ sendto( senderSocket, sendList.latin1(), sendList.length(), 0, (struct sockaddr *)&senderAddr, sizeof(senderAddr) );
+ msleep(500);
+ }
+}
+
+
+
+void Sender::go()
+{
+ isRunning = true;
+ start();
+}
+
+
+
+void Sender::stop()
+{
+ isRunning = false;
+ if ( !wait(10000) ) {
+ terminate();
+ wait();
+ }
+ closeSender();
+}
diff --git a/kaffeine/src/input/dvb/sender.h b/kaffeine/src/input/dvb/sender.h
new file mode 100644
index 0000000..22e3a08
--- /dev/null
+++ b/kaffeine/src/input/dvb/sender.h
@@ -0,0 +1,59 @@
+/*
+ * sender.h
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SENDER_H
+#define SENDER_H
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+#include <unistd.h>
+
+#include <qthread.h>
+#include <qstring.h>
+#include <qobject.h>
+
+
+
+class Sender : public QThread, public QObject
+{
+
+public:
+
+ Sender();
+ ~Sender();
+ void run();
+ void stop();
+ void go();
+
+ int senderSocket;
+ struct sockaddr_in senderAddr;
+
+protected:
+
+ bool makeSenderSocket( const QString &addr, int m_senderPort );
+ void closeSender();
+
+ bool isRunning;
+ QString sendList;
+
+};
+
+#endif /* SENDER_H */
diff --git a/kaffeine/src/input/dvb/subeditor.cpp b/kaffeine/src/input/dvb/subeditor.cpp
new file mode 100644
index 0000000..1863606
--- /dev/null
+++ b/kaffeine/src/input/dvb/subeditor.cpp
@@ -0,0 +1,182 @@
+/*
+ * subeditor.cpp
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qlistbox.h>
+#include <qspinbox.h>
+#include <qpushbutton.h>
+#include <qlineedit.h>
+#include <qcheckbox.h>
+
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include "subeditor.h"
+
+
+
+SubEditor::SubEditor( ChannelDesc *chan, QWidget *parent ) : SubEditorUI( parent )
+{
+ QString s, t;
+ int i;
+
+ channel = chan;
+ pidList->clear();
+
+ for ( i=0; i<channel->nsubpid; i++ ) insertItem( i );
+
+ if ( channel->nsubpid==channel->maxsubpid ) newBtn->setEnabled( false );
+
+ connect( pidList, SIGNAL(highlighted(int)), this, SLOT(showProp(int)) );
+ connect( upBtn, SIGNAL(clicked()), this, SLOT(itemUp()) );
+ connect( downBtn, SIGNAL(clicked()), this, SLOT(itemDown()) );
+ connect( delBtn, SIGNAL(clicked()), this, SLOT(itemDelete()) );
+ connect( updateBtn, SIGNAL(clicked()), this, SLOT(itemUpdate()) );
+ connect( newBtn, SIGNAL(clicked()), this, SLOT(itemNew()) );
+}
+
+
+
+void SubEditor::insertItem( int index, bool updt )
+{
+ QString s, t;
+
+ s = t.setNum( channel->subpid[index].pid );
+ s = s+"("+t.setNum( channel->subpid[index].page )+")";
+ s = s+"("+t.setNum( channel->subpid[index].id )+")";
+ if ( !channel->subpid[index].lang.isEmpty() ) s = s+"("+channel->subpid[index].lang+")";
+ if ( updt ) pidList->changeItem( s, index );
+ else pidList->insertItem( s, index );
+}
+
+
+
+void SubEditor::showProp( int index )
+{
+ if ( index<0 ) {
+ pidSpin->setValue( 0 );
+ pageSpin->setValue( 0 );
+ ancSpin->setValue( 0 );
+ langLe->setText( "" );
+ }
+ else {
+ pidSpin->setValue( channel->subpid[index].pid );
+ pageSpin->setValue( channel->subpid[index].page );
+ ancSpin->setValue( channel->subpid[index].id );
+ langLe->setText( channel->subpid[index].lang );
+ }
+}
+
+
+
+void SubEditor::itemUp()
+{
+ SubPid a;
+
+ int n = pidList->currentItem();
+
+ if ( n<1 ) return;
+
+ a = channel->subpid[n-1];
+ channel->subpid[n-1] = channel->subpid[n];
+ channel->subpid[n] = a;
+
+ insertItem( n, true );
+ insertItem( n-1, true );
+}
+
+
+
+void SubEditor::itemDown()
+{
+ SubPid a;
+
+ int n = pidList->currentItem();
+
+ if ( (n<0) || (n>(channel->nsubpid-2)) ) return;
+
+ a = channel->subpid[n+1];
+ channel->subpid[n+1] = channel->subpid[n];
+ channel->subpid[n] = a;
+
+ insertItem( n, true );
+ insertItem( n+1, true );
+}
+
+
+
+void SubEditor::itemDelete()
+{
+ int n = pidList->currentItem();
+
+ if ( channel->nsubpid==0 || (n<0) ) return; //for sure
+
+ for ( int i=n; i<channel->nsubpid-1; i++ ) channel->subpid[i] = channel->subpid[i+1];
+ channel->nsubpid--;
+ pidList->removeItem( n );
+
+ newBtn->setEnabled( true );
+}
+
+
+
+void SubEditor::itemUpdate()
+{
+ int n = pidList->currentItem();
+
+ if ( n<0 ) return;
+
+ channel->subpid[n].pid = pidSpin->value();
+ channel->subpid[n].page = pageSpin->value();
+ channel->subpid[n].id = ancSpin->value();
+ channel->subpid[n].lang = langLe->text().stripWhiteSpace();
+
+ insertItem( n, true );
+}
+
+
+
+void SubEditor::itemNew()
+{
+ if ( channel->nsubpid==channel->maxsubpid ) { //for sure
+ newBtn->setEnabled( false );
+ return;
+ }
+
+ if ( !pidSpin->value() ) {
+ KMessageBox::sorry( this, i18n("Pid must be non zero!") );
+ return;
+ }
+ channel->nsubpid++;
+ channel->subpid[channel->nsubpid-1].pid = pidSpin->value();
+ channel->subpid[channel->nsubpid-1].page = pageSpin->value();
+ channel->subpid[channel->nsubpid-1].id = ancSpin->value();
+ channel->subpid[channel->nsubpid-1].lang = langLe->text().stripWhiteSpace();
+ insertItem( channel->nsubpid-1 );
+ if ( channel->nsubpid==channel->maxsubpid ) newBtn->setEnabled( false );
+}
+
+
+
+SubEditor::~SubEditor()
+{
+
+}
+
+#include "subeditor.moc"
diff --git a/kaffeine/src/input/dvb/subeditor.h b/kaffeine/src/input/dvb/subeditor.h
new file mode 100644
index 0000000..0a2b332
--- /dev/null
+++ b/kaffeine/src/input/dvb/subeditor.h
@@ -0,0 +1,55 @@
+/*
+ * subeditor.h
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SUBEDITOR_H
+#define SUBEDITOR_H
+
+#include "channeldesc.h"
+#include "subeditorui.h"
+
+
+
+class SubEditor : public SubEditorUI
+{
+ Q_OBJECT
+
+public:
+
+ SubEditor( ChannelDesc *chan, QWidget *parent );
+ ~SubEditor();
+
+private slots:
+
+ void showProp( int index );
+ void itemUp();
+ void itemDown();
+ void itemDelete();
+ void itemUpdate();
+ void itemNew();
+
+private:
+
+ void insertItem( int index, bool updt=false );
+
+ ChannelDesc *channel;
+
+};
+
+#endif /* SUBEDITOR_H */
diff --git a/kaffeine/src/input/dvb/subeditorui.ui b/kaffeine/src/input/dvb/subeditorui.ui
new file mode 100644
index 0000000..790b089
--- /dev/null
+++ b/kaffeine/src/input/dvb/subeditorui.ui
@@ -0,0 +1,354 @@
+<!DOCTYPE UI><UI version="3.3" stdsetdef="1">
+<class>SubEditorUI</class>
+<widget class="QDialog">
+ <property name="name">
+ <cstring>SubEditorUI</cstring>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>558</width>
+ <height>444</height>
+ </rect>
+ </property>
+ <property name="caption">
+ <string>Subtitle PIDs Editor</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="Line" row="1" column="0">
+ <property name="name">
+ <cstring>line3</cstring>
+ </property>
+ <property name="frameShape">
+ <enum>HLine</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>Sunken</enum>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ </widget>
+ <widget class="QLayoutWidget" row="2" column="0">
+ <property name="name">
+ <cstring>layout19</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <spacer>
+ <property name="name">
+ <cstring>spacer9</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>okBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&amp;Close</string>
+ </property>
+ </widget>
+ </hbox>
+ </widget>
+ <widget class="QLayoutWidget" row="0" column="0">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox10</cstring>
+ </property>
+ <property name="title">
+ <string>Subtitle PIDs</string>
+ </property>
+ <grid>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QListBox" row="0" column="0">
+ <item>
+ <property name="text">
+ <string>New Item</string>
+ </property>
+ </item>
+ <property name="name">
+ <cstring>pidList</cstring>
+ </property>
+ </widget>
+ </grid>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout12</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout16</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout15</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>upBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Move Up</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>downBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Move Down</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>delBtn</cstring>
+ </property>
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer8</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </hbox>
+ </widget>
+ <spacer>
+ <property name="name">
+ <cstring>spacer10</cstring>
+ </property>
+ <property name="orientation">
+ <enum>Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>Expanding</enum>
+ </property>
+ <property name="sizeHint">
+ <size>
+ <width>20</width>
+ <height>180</height>
+ </size>
+ </property>
+ </spacer>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout11</cstring>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout13</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>updateBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;&lt; Update Selected</string>
+ </property>
+ </widget>
+ <widget class="QPushButton">
+ <property name="name">
+ <cstring>newBtn</cstring>
+ </property>
+ <property name="text">
+ <string>&lt;&lt; New</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QGroupBox">
+ <property name="name">
+ <cstring>groupBox9</cstring>
+ </property>
+ <property name="title">
+ <string>Properties</string>
+ </property>
+ <hbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout10</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel3</cstring>
+ </property>
+ <property name="text">
+ <string>Pid:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel1</cstring>
+ </property>
+ <property name="text">
+ <string>Page:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel2</cstring>
+ </property>
+ <property name="text">
+ <string>Sub page:</string>
+ </property>
+ </widget>
+ <widget class="QLabel">
+ <property name="name">
+ <cstring>textLabel4</cstring>
+ </property>
+ <property name="text">
+ <string>Lang:</string>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ <widget class="QLayoutWidget">
+ <property name="name">
+ <cstring>layout9</cstring>
+ </property>
+ <vbox>
+ <property name="name">
+ <cstring>unnamed</cstring>
+ </property>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>pidSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>8191</number>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>pageSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>99999</number>
+ </property>
+ </widget>
+ <widget class="QSpinBox">
+ <property name="name">
+ <cstring>ancSpin</cstring>
+ </property>
+ <property name="maxValue">
+ <number>99999</number>
+ </property>
+ </widget>
+ <widget class="QLineEdit">
+ <property name="name">
+ <cstring>langLe</cstring>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy>
+ <hsizetype>2</hsizetype>
+ <vsizetype>0</vsizetype>
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </hbox>
+ </widget>
+ </vbox>
+ </widget>
+ </hbox>
+ </widget>
+ </grid>
+</widget>
+<connections>
+ <connection>
+ <sender>okBtn</sender>
+ <signal>clicked()</signal>
+ <receiver>SubEditorUI</receiver>
+ <slot>accept()</slot>
+ </connection>
+</connections>
+<tabstops>
+ <tabstop>okBtn</tabstop>
+ <tabstop>pidList</tabstop>
+ <tabstop>upBtn</tabstop>
+ <tabstop>downBtn</tabstop>
+ <tabstop>delBtn</tabstop>
+ <tabstop>updateBtn</tabstop>
+ <tabstop>newBtn</tabstop>
+ <tabstop>pidSpin</tabstop>
+ <tabstop>pageSpin</tabstop>
+ <tabstop>ancSpin</tabstop>
+ <tabstop>langLe</tabstop>
+</tabstops>
+<layoutdefaults spacing="6" margin="11"/>
+</UI>
diff --git a/kaffeine/src/input/dvb/ts2rtp.cpp b/kaffeine/src/input/dvb/ts2rtp.cpp
new file mode 100644
index 0000000..9f87a84
--- /dev/null
+++ b/kaffeine/src/input/dvb/ts2rtp.cpp
@@ -0,0 +1,478 @@
+/*
+ * ts2rtp.cpp
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * some code from dvbstream (GPL)
+ * Copyright (C) 2001,2002 Dave Chapman
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <sys/time.h>
+
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include "ts2rtp.h"
+#include "gdvb.h"
+#include "channeldesc.h"
+
+#define TS_SIZE 188
+
+
+
+Ts2Rtp::Ts2Rtp()
+{
+ unsigned int i, j=0, k;
+
+ for( i = 0 ; i < 256 ; i++ ) {
+ k = 0;
+ for (j = (i << 24) | 0x800000 ; j != 0x80000000 ; j <<= 1) {
+ k = (k << 1) ^ (((k ^ j) & 0x80000000) ? 0x04c11db7 : 0);
+ }
+ CRC32[i] = k;
+ }
+
+ thWrite = 0;
+ rtpSocket = 0;
+ writePsi = false;
+ psiPackets = 0;
+ // fill in the MPEG-2 TS deefaults
+ // Note: MPEG-2 TS defines a timestamping base frequency of 90000 Hz.
+ hRtp.b.v=2;
+ hRtp.b.p=0;
+ hRtp.b.x=0;
+ hRtp.b.cc=0;
+ hRtp.b.m=0;
+ hRtp.b.pt=33;
+ hRtp.b.sequence=rand() & 65535;
+ hRtp.timestamp=rand();
+ hRtp.ssrc=rand();
+
+ psiBufferSize = 20*TS_SIZE;
+ psiBuffer = (unsigned char*)malloc(psiBufferSize);
+
+ connect( &psiTimer, SIGNAL(timeout()), this, SLOT(setPSI()) );
+}
+
+
+
+Ts2Rtp::~Ts2Rtp()
+{
+ stop();
+ if ( rtpSocket ) {
+ close( rtpSocket );
+ }
+ free( psiBuffer );
+}
+
+
+
+void Ts2Rtp::setSocket( const QString &addr, int m_port, int m_senderPort )
+{
+ address = addr;
+ port = m_port;
+ senderPort = m_senderPort;
+}
+
+
+
+bool Ts2Rtp::addChannels( QPtrList<ChannelDesc> *channels )
+{
+ int i, j, k, pmtpid=8191;
+ ChannelDesc *desc, *d;
+ QValueList<int> pids;
+
+ if ( !rtpSocket && !makeSocket() )
+ return false;
+
+ sendList = "";
+ for ( i=0; i<(int)channels->count(); i++ ) {
+ desc = channels->at( i );
+ sendList = sendList+desc->name+"|"+QString().setNum(desc->vpid)+"|"+QString().setNum(desc->apid[0].pid)+"|";
+ if ( desc->apid[0].ac3 ) sendList+= "y|";
+ else sendList+= "n|";
+ sendList+= QString().setNum(desc->subpid[0].pid);
+ sendList+= "|";
+ sendList+= QString().setNum(desc->subpid[0].page);
+ sendList+= "|";
+ sendList+= QString().setNum(desc->subpid[0].id);
+ sendList+= "|";
+ sendList+= QString().setNum(desc->subpid[0].type);
+ sendList+= "|";
+ sendList+= desc->subpid[0].lang+"|";
+ for ( j=i; j<(int)channels->count(); j++ ) {
+ pids.clear();
+ d = channels->at( j );
+ if ( d->vpid )
+ pids.append( d->vpid );
+ for ( k=0; k<d->napid && k<MAX_AUDIO; k++ )
+ pids.append( d->apid[k].pid );
+ for ( k=0; k<d->nsubpid && k<MAX_DVBSUB; k++ )
+ pids.append( d->subpid[k].pid );
+ while ( pmtpid==17 || pids.contains( pmtpid ) )
+ --pmtpid;
+ }
+ desc->pmtpid = pmtpid--;
+ }
+ sendList+="\n";
+ psiTables( channels );
+ writePsi = true;
+ psiTimer.start( 500 );
+ return true;
+}
+
+
+
+void Ts2Rtp::removeChannels()
+{
+ if ( !rtpSocket )
+ return;
+ stop();
+ close( rtpSocket );
+ rtpSocket = 0;
+ fprintf( stderr, "rtp socket closed\n" );
+ thWrite = 0;
+ psiPackets = 0;
+ if ( psiTimer.isActive() )
+ psiTimer.stop();
+}
+
+
+
+bool Ts2Rtp::makeSocket()
+{
+ int iRet, iLoop = 1;
+
+ if ( !makeSenderSocket( address, senderPort ) ) return false;
+
+ rtpSocket = socket( AF_INET, SOCK_DGRAM, 0 );
+
+ if ( rtpSocket < 0) {
+ KMessageBox::error( 0, i18n("Can't open DVB broadcast socket.") );
+ rtpSocket = 0;
+ closeSender();
+ return false;
+ }
+
+ rtpAddr.sin_family = AF_INET;
+ rtpAddr.sin_port = htons( port );
+ rtpAddr.sin_addr.s_addr = inet_addr( address.ascii() );
+
+ iRet = setsockopt( rtpSocket, SOL_SOCKET, SO_BROADCAST, &iLoop, sizeof(iLoop));
+ if (iRet < 0) {
+ KMessageBox::error( 0, i18n("Can't init DVB broadcast socket.") );
+ close( rtpSocket );
+ rtpSocket = 0;
+ closeSender();
+ return false;
+ }
+ go();
+ fprintf( stderr, "rtp socket opened\n" );
+ return true;
+}
+
+
+
+void Ts2Rtp::process( unsigned char *buf, int size )
+{
+ int i, n;
+ unsigned char *buffer=buf;
+
+ if ( writePsi ) {
+ i = 0;
+ while ( i<psiPackets ) {
+ n = psiPackets-i;
+ if ( n>8 )
+ n = 8;
+ sendrtp( (char*)(psiBuffer+(TS_SIZE*i)), TS_SIZE*n );
+ i+= n;
+ }
+ writePsi = false;
+ }
+
+ for ( i=0; i<size; i+=TS_SIZE ) {
+ memcpy( thBuf+thWrite, buffer, TS_SIZE );
+ thWrite+=TS_SIZE;
+ if ( thWrite==(TS_SIZE*8 ) ) {
+ sendrtp( (char*)thBuf, TS_SIZE*8 );
+ thWrite = 0;
+ }
+ buffer+=TS_SIZE;
+ }
+}
+
+
+
+/* Send a single RTP packet, converting the RTP header to network byte order. */
+void Ts2Rtp::sendrtp( char *data, int len )
+{
+ struct timeval tv;
+
+ gettimeofday( &tv, (struct timezone*) NULL );
+ hRtp.timestamp = ((tv.tv_sec%1000000)*1000 + tv.tv_usec/1000)*90;
+
+ char *buf=(char*)alloca(len+72);
+ unsigned int intP;
+ char* charP = (char*) &intP;
+ int headerSize;
+ buf[0] = 0x00;
+ buf[0] |= ((((char) hRtp.b.v)<<6)&0xc0);
+ buf[0] |= ((((char) hRtp.b.p)<<5)&0x20);
+ buf[0] |= ((((char) hRtp.b.x)<<4)&0x10);
+ buf[0] |= ((((char) hRtp.b.cc)<<0)&0x0f);
+ buf[1] = 0x00;
+ buf[1] |= ((((char) hRtp.b.m)<<7)&0x80);
+ buf[1] |= ((((char) hRtp.b.pt)<<0)&0x7f);
+ intP = htonl(hRtp.b.sequence);
+ memcpy(&buf[2],charP+2,2);
+ intP = htonl(hRtp.timestamp);
+ memcpy(&buf[4],&intP,4);
+ /* SSRC: not implemented */
+ buf[8] = 0x0f;
+ buf[9] = 0x0f;
+ buf[10] = 0x0f;
+ buf[11] = 0x0f;
+ headerSize = 12 + 4*hRtp.b.cc; /* in bytes */
+ memcpy(buf+headerSize,data,len);
+
+ hRtp.b.sequence++;
+ if ( rtpSocket ) sendto( rtpSocket, buf, len+headerSize, 0, (struct sockaddr *)&rtpAddr, sizeof(rtpAddr) );
+}
+
+
+
+void Ts2Rtp::setPSI()
+{
+ writePsi = true;
+}
+
+
+void Ts2Rtp::psiTables( QPtrList<ChannelDesc> *channels )
+{
+ unsigned char buf[15000];
+ int off, i, j, sectionOff, loopOff, descOff, max;
+ int npack=0;
+ unsigned short tsid = channels->at(0)->tp.tsid;
+ ChannelDesc *desc;
+
+ psiPackets = 0;
+
+ // SDT
+ off = 0;
+ // CRC calculation begins here
+ buf[off++] = 0x42; // service description section
+ buf[off++] = 0x80;
+ sectionOff = off;
+ buf[off++] = 0x00; // section_length (12bits)
+ buf[off++] = tsid>>8; buf[off++] = tsid&0xff;
+ buf[off++] = 0x01; // current_next_indicator
+ buf[off++] = 0x00; // section_number
+ buf[off++] = 0x00; // last_section_number
+ buf[off++] = 0x00; buf[off++] = 0x00; // network_id
+ buf[off++] = 0x00; // reserved
+
+ for ( i=0; i<(int)channels->count(); i++ ) {
+ desc = channels->at( i );
+ buf[off++] = desc->sid>>8; buf[off++] = desc->sid&0xff; // service_id
+ buf[off++] = 0x00; // reserved
+ buf[off++] = 0x80; // running_status(3bits) + free_ca(1bit) + descriptors_loop_length
+ loopOff = off;
+ buf[off++] = 0x00; // descriptors_loop_length
+
+ buf[off++] = 0x48; // descriptor_tag
+ descOff = off;
+ buf[off++] = 0x00; //descriptor_length
+ buf[off++] = desc->type; //service_type
+ buf[off++] = 0x03; // provider_name_length
+ buf[off++] = 0x4c; buf[off++] = 0x41; buf[off++] = 0x4e; // provider_name
+ buf[off++] = desc->name.length(); // service_name_length
+ memcpy( buf+off, desc->name.latin1(), desc->name.length() );
+ off+= desc->name.length();
+ buf[descOff] = off-descOff-1;
+ buf[loopOff] = off-loopOff-1;
+ }
+ buf[sectionOff-1] |= (off+1)>>8;
+ buf[sectionOff] = (off+1)&0xff;
+ calculateCRC( buf, buf+off );
+ fillPackets( 17, buf, off+4, npack );
+
+ // PAT
+ off = 0;
+ // CRC calculation begins here
+ buf[off++] = 0x00; // program association section
+ buf[off++] = 0x80;
+ sectionOff = off;
+ buf[off++] = 0x00; // section_length (12bits)
+ buf[off++] = tsid>>8; buf[off++] = tsid&0xff;
+ buf[off++] = 0x01; // current_next_indicator
+ buf[off++] = 0x00; // section_number
+ buf[off++] = 0x00; // last_section_number
+
+ for ( i=0; i<(int)channels->count(); i++ ) {
+ desc = channels->at( i );
+ buf[off++] = desc->sid>>8; buf[off++] = desc->sid&0xff; // service_id
+ buf[off++] = desc->pmtpid>>8; buf[off++] = desc->pmtpid&0xff; // program_map_PID(13bits)
+ }
+ buf[sectionOff-1] |= (off+1)>>8;
+ buf[sectionOff] = (off+1)&0xff;
+ calculateCRC( buf, buf+off );
+ fillPackets( 0, buf, off+4, npack );
+
+ // PMT
+ for ( i=0; i<(int)channels->count(); i++ ) {
+ desc = channels->at( i );
+ off = 0;
+ // CRC calculation begins here
+ buf[off++] = 0x02; // program map section
+ buf[off++] = 0x80;
+ sectionOff = off;
+ buf[off++] = 0x00; // section_length (12bits)
+ buf[off++] = desc->sid>>8; buf[off++] = desc->sid&0xff;
+ buf[off++] = 0x01; // current_next_indicator
+ buf[off++] = 0x00; // section_number
+ buf[off++] = 0x00; // last_section_number
+ buf[off++] = desc->vpid>>8; buf[off++] = desc->vpid&0xff; // PCR pid
+ buf[off++] = 0x00; buf[off++] = 0x00; // infos_length
+ if ( desc->vpid ) {
+ buf[off++] = desc->vType; // stream_type
+ buf[off++] = desc->vpid>>8; buf[off++] = desc->vpid&0xff; // pid
+ buf[off++] = 0x00; buf[off++] = 0x00; // infos_length
+ }
+
+ for ( j=0; j<desc->napid && j<MAX_AUDIO; j++ ) {
+ if ( desc->apid[j].ac3 ) {
+ buf[off++] = 0x06; // stream type
+ buf[off++] = desc->apid[j].pid>>8; buf[off++] = desc->apid[j].pid&0xff;
+ buf[off++] = 0x00; buf[off++] = 0x09; // es info length
+ buf[off++] = 0x6a; // descriptor tag
+ buf[off++] = 0x01; // descriptor length
+ buf[off++] = 0x00;
+ }
+ else {
+ buf[off++] = 0x04; // stream type = audio
+ buf[off++] = desc->apid[j].pid>>8; buf[off++] = desc->apid[j].pid&0xff;
+ buf[off++] = 0x00; buf[off++] = 0x06; // es info length
+ }
+ buf[off++] = 0x0a; // iso639 descriptor tag
+ buf[off++] = 0x04; // descriptor length
+ if ( !desc->apid[j].lang.isEmpty() ) {
+ buf[off++] = desc->apid[j].lang.constref(0);
+ buf[off++] = desc->apid[j].lang.constref(1);
+ if ( desc->apid[j].ac3 )
+ buf[off++] = '_';
+ else
+ buf[off++] = desc->apid[j].lang.constref(2);
+ }
+ else if ( desc->apid[j].ac3 ) {
+ buf[off++] = 'd';
+ buf[off++] = 'd';
+ buf[off++] = 49+j;
+ }
+ else {
+ buf[off++] = 'c';
+ buf[off++] = 'h';
+ buf[off++] = 49+j;
+ }
+ buf[off++] = 0x00; // audio type
+ }
+
+ for ( j=0; j<desc->nsubpid && j<MAX_DVBSUB; j++ ) {
+ buf[off++] = 0x06; // stream type = ISO_13818_PES_PRIVATE
+ buf[off++] = desc->subpid[j].pid>>8; buf[off++] = desc->subpid[j].pid&0xff;
+ buf[off++] = 0x00; buf[off++] = 0x0a; // es info length
+ buf[off++] = 0x59; //DVB sub tag
+ buf[off++] = 0x08; // descriptor length
+ if ( !desc->subpid[j].lang.isEmpty() ) {
+ buf[off++] = desc->subpid[j].lang.constref(0);
+ buf[off++] = desc->subpid[j].lang.constref(1);
+ buf[off++] = desc->subpid[j].lang.constref(2);
+ }
+ else {
+ buf[off++] = 'c';
+ buf[off++] = 'h';
+ buf[off++] = 49+j;
+ }
+ buf[off++] = desc->subpid[j].type; //sub type
+ buf[off++] = desc->subpid[j].page>>8; buf[off++] = desc->subpid[j].page&0xff; // comp_page_id
+ buf[off++] = desc->subpid[j].id>>8; buf[off++] = desc->subpid[j].id&0xff; // anc_page_id
+ }
+
+ buf[sectionOff-1] |= (off+1)>>8;
+ buf[sectionOff] = (off+1)&0xff;
+ calculateCRC( buf, buf+off );
+ fillPackets( desc->pmtpid, buf, off+4, npack );
+ }
+
+ psiPackets = npack;
+}
+
+
+
+void Ts2Rtp::fillPackets( unsigned short pid, unsigned char *buf, int len, int &npack )
+{
+ int i, off=npack*TS_SIZE, offbuf=0, inc;
+ bool pus=true;
+ int continuity=0;
+
+ while ( (off-(npack*TS_SIZE))<len ) {
+ if ( (off+TS_SIZE)>(psiBufferSize-(10*TS_SIZE)) ) {
+ psiBufferSize+= 10*TS_SIZE;
+ psiBuffer = (unsigned char*)realloc( psiBuffer, psiBufferSize );
+ fprintf(stderr,"psiBufferSize = %d\n",psiBufferSize);
+ }
+ psiBuffer[off++] = 0x47; // sync_byte
+ if ( pus )
+ psiBuffer[off++] = 0x40|(pid>>8);
+ else
+ psiBuffer[off++] = pid>>8;
+ psiBuffer[off++] = pid&0xff; // PID
+ psiBuffer[off++] = 0x10|continuity;
+ if ( pus ) {
+ psiBuffer[off++] = 0x00; // pointer_field
+ pus = false;
+ }
+ inc = TS_SIZE-(off%TS_SIZE);
+ if ( (len-offbuf)<inc )
+ inc = len-offbuf;
+ memcpy( psiBuffer+off, buf+offbuf, inc );
+ off+= inc;
+ offbuf+= inc;
+ ++continuity;
+ }
+ // needed stuffing bytes
+ for ( i=0 ; i<(off%TS_SIZE) ; i++)
+ psiBuffer[off++] = 0xff;
+ npack+= (off-(npack*TS_SIZE))/TS_SIZE;
+}
+
+
+
+void Ts2Rtp::calculateCRC( unsigned char *p_begin, unsigned char *p_end )
+{
+ unsigned int i_crc = 0xffffffff;
+
+ // Calculate the CRC
+ while( p_begin < p_end ) {
+ i_crc = (i_crc<<8) ^ CRC32[ (i_crc>>24) ^ ((unsigned int)*p_begin) ];
+ p_begin++;
+ }
+ // Store it after the data
+ p_end[0] = (i_crc >> 24) & 0xff;
+ p_end[1] = (i_crc >> 16) & 0xff;
+ p_end[2] = (i_crc >> 8) & 0xff;
+ p_end[3] = (i_crc >> 0) & 0xff;
+}
diff --git a/kaffeine/src/input/dvb/ts2rtp.h b/kaffeine/src/input/dvb/ts2rtp.h
new file mode 100644
index 0000000..36165e9
--- /dev/null
+++ b/kaffeine/src/input/dvb/ts2rtp.h
@@ -0,0 +1,99 @@
+/*
+ * ts2rtp.h
+ *
+ * Copyright (C) 2003-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef TS2RTP_H
+#define TS2RTP_H
+
+#include <stdlib.h>
+#include <string.h>
+#include <netinet/in.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
+#include <qptrlist.h>
+#include <qtimer.h>
+
+#include "sender.h"
+
+class ChannelDesc;
+
+
+
+struct rtpbits {
+ unsigned int v:2; /* version: 2 */
+ unsigned int p:1; /* is there padding appended: 0 */
+ unsigned int x:1; /* number of extension headers: 0 */
+ unsigned int cc:4; /* number of CSRC identifiers: 0 */
+ unsigned int m:1; /* marker: 0 */
+ unsigned int pt:7; /* payload type: 33 for MPEG2 TS - RFC 1890 */
+ unsigned int sequence:16; /* sequence number: random */
+};
+
+struct rtpheader { /* in network byte order */
+ struct rtpbits b;
+ int timestamp; /* start: random */
+ int ssrc; /* random */
+};
+
+
+
+class Ts2Rtp : public Sender
+{
+ Q_OBJECT
+public:
+
+ Ts2Rtp();
+ ~Ts2Rtp();
+ void setSocket( const QString &addr, int m_port, int m_senderPort );
+ bool addChannels( QPtrList<ChannelDesc> *channels );
+ void removeChannels();
+ void process( unsigned char *buf, int size );
+
+private:
+
+ bool makeSocket();
+ void sendrtp( char *data, int len );
+ void psiTables( QPtrList<ChannelDesc> *channels );
+ void fillPackets( unsigned short pid, unsigned char *buf, int len, int &npack );
+ void calculateCRC( unsigned char *p_begin, unsigned char *p_end );
+
+ int rtpSocket;
+ struct sockaddr_in rtpAddr;
+ struct rtpheader hRtp;
+ QString address;
+ int port, senderPort;
+ unsigned char thBuf[188*10];
+ unsigned int CRC32[256];
+ int thWrite;
+ unsigned char *psiBuffer;
+ int psiBufferSize;
+ int psiPackets;
+ QTimer psiTimer;
+ bool writePsi;
+
+private slots:
+ void setPSI();
+};
+
+#endif /* TS2RTP_H */
diff --git a/kaffeine/src/input/dvbclient/Makefile.am b/kaffeine/src/input/dvbclient/Makefile.am
new file mode 100644
index 0000000..fb4a110
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/Makefile.am
@@ -0,0 +1,23 @@
+INCLUDES = -I$(top_srcdir)/kaffeine/src/input/ \
+ $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_LTLIBRARIES = libkaffeinedvbclient.la
+
+libkaffeinedvbclient_la_SOURCES = cdchannel.cpp \
+ cdchannel.h \
+ cdwidget.cpp \
+ cdwidget.h \
+ cddump.cpp \
+ cddump.h \
+ cdlisten.cpp \
+ cdlisten.h \
+ cdcleaner.cpp \
+ cdcleaner.h
+
+libkaffeinedvbclient_la_LDFLAGS = $(KDE_RPATH) \
+ $(all_libraries) \
+ -L$(top_srcdir)/kaffeine/src/input
+
+libkaffeinedvbclient_la_LIBADD = $(top_builddir)/kaffeine/src/input/libkaffeineinput.la
diff --git a/kaffeine/src/input/dvbclient/cdchannel.cpp b/kaffeine/src/input/dvbclient/cdchannel.cpp
new file mode 100644
index 0000000..6b0fad1
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/cdchannel.cpp
@@ -0,0 +1,54 @@
+/*
+ * cdchannel.cpp
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "cdchannel.h"
+
+
+
+CdChannel::CdChannel()
+{
+ name = "";
+ vpid = apid = 0;
+ ac3 = 0;
+ subpid = page = id = 0;
+ type = 0;
+ lang = "";
+}
+
+
+
+CdChannel::CdChannel( const QString &n, int vp, int ap, int ac, int spid, int pg, int an, int tp, const QString &lg )
+{
+ name = n;
+ vpid = vp;
+ apid = ap;
+ ac3 = ac;
+ subpid = spid;
+ page = pg;
+ id = an;
+ type = tp;
+ lang = lg;
+}
+
+
+
+CdChannel::~CdChannel()
+{
+}
diff --git a/kaffeine/src/input/dvbclient/cdchannel.h b/kaffeine/src/input/dvbclient/cdchannel.h
new file mode 100644
index 0000000..880d95e
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/cdchannel.h
@@ -0,0 +1,45 @@
+/*
+ * cdchannel.h
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CDCHANNEL_H
+#define CDCHANNEL_H
+
+#include <qstring.h>
+
+
+
+class CdChannel
+{
+
+public:
+
+ CdChannel();
+ CdChannel( const QString &n, int vp, int ap, int ac, int spid, int pg, int an, int tp, const QString &lg );
+ ~CdChannel();
+
+ QString name;
+ unsigned short vpid, apid;
+ char ac3;
+ unsigned short subpid, page, id;
+ unsigned char type;
+ QString lang;
+};
+
+#endif /* CDCHANNEL_H */
diff --git a/kaffeine/src/input/dvbclient/cdcleaner.cpp b/kaffeine/src/input/dvbclient/cdcleaner.cpp
new file mode 100644
index 0000000..58445a5
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/cdcleaner.cpp
@@ -0,0 +1,69 @@
+/*
+ * cdcleaner.cpp
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qdir.h>
+#include <qstringlist.h>
+
+#include "cdcleaner.h"
+
+
+
+CdCleaner::CdCleaner( const QString &path )
+{
+ livePath = path;
+
+ connect( &timer, SIGNAL(timeout()), this, SLOT(doClean()) );
+ timer.start( 60*1000 );
+}
+
+
+
+CdCleaner::~CdCleaner()
+{
+ wait();
+}
+
+
+
+void CdCleaner::doClean()
+{
+ start( QThread::LowestPriority );
+}
+
+
+
+void CdCleaner::setPath( const QString &path )
+{
+ livePath = path;
+}
+
+
+
+void CdCleaner::run()
+{
+ QStringList list;
+ QDir d;
+
+ d.setPath( livePath );
+ list = d.entryList( "DVBClient-*.ts", QDir::Files, QDir::Name );
+ if ( list.count()>1 ) d.remove( list[0] );
+}
+
+#include "cdcleaner.moc"
diff --git a/kaffeine/src/input/dvbclient/cdcleaner.h b/kaffeine/src/input/dvbclient/cdcleaner.h
new file mode 100644
index 0000000..e4423d6
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/cdcleaner.h
@@ -0,0 +1,56 @@
+/*
+ * cdcleaner.h
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CDCLEANER_H
+#define CDCLEANER_H
+
+#include <qobject.h>
+#include <qthread.h>
+#include <qstring.h>
+#include <qtimer.h>
+
+
+
+class CdCleaner : public QObject, public QThread
+{
+
+ Q_OBJECT
+
+public:
+
+ CdCleaner( const QString &path );
+ ~CdCleaner();
+ void setPath( const QString &path );
+
+protected:
+
+ virtual void run();
+
+private slots:
+
+ void doClean();
+
+private:
+
+ QTimer timer;
+ QString livePath;
+};
+
+#endif /* CDCLEANER_H */
diff --git a/kaffeine/src/input/dvbclient/cddump.cpp b/kaffeine/src/input/dvbclient/cddump.cpp
new file mode 100644
index 0000000..075025a
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/cddump.cpp
@@ -0,0 +1,362 @@
+/*
+ * cddump.cpp
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <klocale.h>
+#include <kapplication.h>
+#include <kmessagebox.h>
+
+#include "cddump.h"
+
+
+
+CdDump::CdDump( const QString &pipe )
+{
+ unsigned int i, j, k;
+
+ for( i = 0 ; i < 256 ; i++ ) {
+ k = 0;
+ for (j = (i << 24) | 0x800000 ; j != 0x80000000 ; j <<= 1) {
+ k = (k << 1) ^ (((k ^ j) & 0x80000000) ? 0x04c11db7 : 0);
+ }
+ CRC32[i] = k;
+ }
+
+ isRunning = false;
+ fifoName = pipe;
+ connect( &timerPatPmt, SIGNAL(timeout()), this, SLOT(setPatPmt()) );
+ timerPatPmt.start( 500 );
+}
+
+
+
+void CdDump::calculateCRC( unsigned char *p_begin, unsigned char *p_end )
+{
+ unsigned int i_crc = 0xffffffff;
+
+ // Calculate the CRC
+ while( p_begin < p_end ) {
+ i_crc = (i_crc<<8) ^ CRC32[ (i_crc>>24) ^ ((unsigned int)*p_begin) ];
+ p_begin++;
+ }
+
+ // Store it after the data
+ p_end[0] = (i_crc >> 24) & 0xff;
+ p_end[1] = (i_crc >> 16) & 0xff;
+ p_end[2] = (i_crc >> 8) & 0xff;
+ p_end[3] = (i_crc >> 0) & 0xff;
+}
+
+
+
+void CdDump::writePat()
+{
+ int i;
+
+ tspat[0x00] = 0x47; // sync_byte
+ tspat[0x01] = 0x40;
+ tspat[0x02] = 0x00; // PID = 0x0000
+ tspat[0x03] = 0x10; // | (ps->pat_counter & 0x0f);
+ tspat[0x04] = 0x00; // CRC calculation begins here
+ tspat[0x05] = 0x00; // 0x00: Program association section
+ tspat[0x06] = 0xb0;
+ tspat[0x07] = 0x11; // section_length = 0x011
+ tspat[0x08] = 0x00;
+ tspat[0x09] = 0xbb; // TS id = 0x00b0 (what the vlc calls "Stream ID")
+ tspat[0x0a] = 0xc1;
+ // section # and last section #
+ tspat[0x0b] = tspat[0x0c] = 0x00;
+ // Network PID (useless)
+ tspat[0x0d] = tspat[0x0e] = 0x00; tspat[0x0f] = 0xe0; tspat[0x10] = 0x10;
+ // Program Map PID
+ pmtpid = 0x64;
+ while ( pmtpid==chan.vpid || pmtpid==chan.apid ) pmtpid--;
+ tspat[0x11] = 0x03; tspat[0x12] = 0xe8; tspat[0x13] = 0xe0; tspat[0x14] = pmtpid;
+ // Put CRC in ts[0x15...0x18]
+ calculateCRC( tspat + 0x05, tspat + 0x15 );
+ // needed stuffing bytes
+ for (i=0x19 ; i < 188 ; i++) tspat[i]=0xff;
+}
+
+
+
+void CdDump::writePmt()
+{
+ int i, off=0;
+
+ tspmt[0x00] = 0x47; //sync_byte
+ tspmt[0x01] = 0x40;
+ tspmt[0x02] = pmtpid;
+ tspmt[0x03] = 0x10;
+ tspmt[0x04] = 0x00; // CRC calculation begins here
+ tspmt[0x05] = 0x02; // 0x02: Program map section
+ tspmt[0x06] = 0xb0;
+ tspmt[0x07] = 0x20; // section_length
+ tspmt[0x08] = 0x03;
+ tspmt[0x09] = 0xe8; // prog number
+ tspmt[0x0a] = 0xc1;
+ // section # and last section #
+ tspmt[0x0b] = tspmt[0x0c] = 0x00;
+ // PCR PID
+ tspmt[0x0d] = chan.vpid>>8; tspmt[0x0e] = chan.vpid&0xff;
+ // program_info_length == 0
+ tspmt[0x0f] = 0xf0; tspmt[0x10] = 0x00;
+ // Program Map / Video PID
+ tspmt[0x11] = 0x02; // stream type = video
+ tspmt[0x12] = chan.vpid>>8; tspmt[0x13] = chan.vpid&0xff;
+ tspmt[0x14] = 0xf0; tspmt[0x15] = 0x09; // es info length
+ // useless info
+ tspmt[0x16] = 0x07; tspmt[0x17] = 0x04; tspmt[0x18] = 0x08; tspmt[0x19] = 0x80;
+ tspmt[0x1a] = 0x24; tspmt[0x1b] = 0x02; tspmt[0x1c] = 0x11; tspmt[0x1d] = 0x01;
+ tspmt[0x1e] = 0xfe;
+ off = 0x1e;
+ // audio pid
+ if ( chan.ac3 ) {
+ tspmt[++off] = 0x81; // stream type = xine see this as ac3
+ tspmt[++off] = chan.apid>>8; tspmt[++off] = chan.apid&0xff;
+ tspmt[++off] = 0xf0; tspmt[++off] = 0x0c; // es info length
+ tspmt[++off] = 0x05; tspmt[++off] = 0x04; tspmt[++off] = 0x41;
+ tspmt[++off] = 0x43; tspmt[++off] = 0x2d; tspmt[++off] = 0x33;
+ }
+ else {
+ tspmt[++off] = 0x04; // stream type = audio
+ tspmt[++off] = chan.apid>>8; tspmt[++off] = chan.apid&0xff;
+ tspmt[++off] = 0xf0; tspmt[++off] = 0x06; // es info length
+ }
+ tspmt[++off] = 0x0a; // iso639 descriptor tag
+ tspmt[++off] = 0x04; // descriptor length
+ tspmt[++off] = '?';
+ tspmt[++off] = '?';
+ tspmt[++off] = '?';
+ tspmt[++off] = 0x00; // audio type
+ // subtitles
+ if ( chan.subpid ) {
+ tspmt[++off] = 0x06; // stream type = ISO_13818_PES_PRIVATE
+ tspmt[++off] = chan.subpid>>8; tspmt[++off] = chan.subpid&0xff;
+ tspmt[++off] = 0xf0; tspmt[++off] = 0x0a; // es info length
+ tspmt[++off] = 0x59; //DVB sub tag
+ tspmt[++off] = 0x08; // descriptor length
+ if ( !chan.lang.isEmpty() ) {
+ tspmt[++off] = chan.lang.constref(0);
+ tspmt[++off] = chan.lang.constref(1);
+ tspmt[++off] = chan.lang.constref(2);
+ }
+ else {
+ tspmt[++off] = '?';
+ tspmt[++off] = '?';
+ tspmt[++off] = '?';
+ }
+ tspmt[++off] = chan.type; //sub type
+ tspmt[++off] = chan.page>>8; tspmt[++off] = chan.page&0xff; // comp_page_id
+ tspmt[++off] = chan.id>>8; tspmt[++off] = chan.id&0xff; // anc_page_id
+ }
+ tspmt[0x07] = off-3; // update section_length
+ // Put CRC in ts[0x29...0x2c]
+ calculateCRC( tspmt+0x05, tspmt+off+1 );
+ // needed stuffing bytes
+ for (i=off+5 ; i < 188 ; i++) tspmt[i]=0xff;
+}
+
+
+
+void CdDump::setPatPmt()
+{
+ patpmt = true;
+}
+
+
+
+bool CdDump::go( const QString &ad, int port, CdChannel c )
+{
+ int sockopt=1;
+
+ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
+ KMessageBox::information( 0, i18n("Can't open socket."), i18n("DVB Client") );
+ sock = 0;
+ return false;
+ }
+
+ addr.sin_family = AF_INET; // host byte order
+ addr.sin_port = htons( port ); // short, network byte order
+ addr.sin_addr.s_addr = inet_addr( ad.ascii() );
+ memset( &( addr.sin_zero ), '\0', 8 ); // zero the rest of the struct
+
+ if( setsockopt( sock, SOL_SOCKET, SO_REUSEADDR, &sockopt, sizeof(sockopt) ) < 0 ){
+ KMessageBox::information( 0, i18n("Can't set socket option!!!"), i18n("DVB Client") );
+ close( sock );
+ sock = 0;
+ return false;
+ }
+
+ if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
+ KMessageBox::information( 0, i18n("Can't bind socket!!!"), i18n("DVB Client") );
+ close( sock );
+ sock = 0;
+ return false;
+ }
+
+ chan = c;
+ writePat();
+ writePmt();
+ patpmt = true;
+ timeShiftFileName = "";
+ timeShifting = false;
+ isRunning = true;
+ start();
+ return true;
+}
+
+
+
+void CdDump::stop()
+{
+ isRunning = false;
+ if ( !wait(1000) ) {
+ terminate();
+ wait();
+ }
+ if ( fdPipe ) {
+ close( fdPipe );
+ fdPipe = 0;
+ }
+ if ( timeShifting )
+ liveFile.close();
+ if ( sock ) {
+ close( sock );
+ sock = 0;
+ }
+}
+
+
+
+bool CdDump::running() const
+{
+ return isRunning;
+}
+
+
+
+CdDump::~CdDump()
+{
+ stop();
+}
+
+
+
+bool CdDump::doPause( const QString &name )
+{
+ if ( !timeShifting ) {
+ timeShiftFileName = name;
+ liveFile.setName( timeShiftFileName );
+ liveFile.open( IO_WriteOnly|IO_Truncate );
+ liveFile.writeBlock( (char*)tspat, 188 );
+ liveFile.writeBlock( (char*)tspmt, 188 );
+ timeShifting = true;
+ return true;
+ }
+ return false;
+}
+
+
+
+void CdDump::run()
+{
+ struct srtpheader rh;
+ int lengthData;
+ char buf[1600];
+ unsigned char *b;
+#define NTS 64
+ unsigned char tbuf[NTS*188];
+ int twrite;
+ unsigned int intP;
+ char* charP = (char*) &intP;
+ int headerSize;
+ int lengthPacket;
+ int len;
+ int pid;
+
+ if ( (fdPipe=open( fifoName.ascii(), O_WRONLY))<0 ) {
+ perror("DUMP PIPE FILE: ");
+ return;
+ }
+ fprintf(stderr,"Dump pipe opened\n");
+
+ twrite = 0;
+
+ while( isRunning ) {
+ lengthPacket = recv( sock, buf, 1590, 0 );
+ rh.b.v = (unsigned int) ((buf[0]>>6)&0x03);
+ rh.b.p = (unsigned int) ((buf[0]>>5)&0x01);
+ rh.b.x = (unsigned int) ((buf[0]>>4)&0x01);
+ rh.b.cc = (unsigned int) ((buf[0]>>0)&0x0f);
+ rh.b.m = (unsigned int) ((buf[1]>>7)&0x01);
+ rh.b.pt = (unsigned int) ((buf[1]>>0)&0x7f);
+ intP = 0;
+ memcpy( charP+2, &buf[2], 2 );
+ rh.b.sequence = ntohl( intP );
+ intP = 0;
+ memcpy( charP, &buf[4], 4 );
+ rh.timestamp = ntohl( intP );
+ headerSize = 12 + 4*rh.b.cc; /* in bytes */
+ lengthData = lengthPacket - headerSize;
+
+ b = (unsigned char*)buf+headerSize;
+ len = lengthData;
+ while ( len>0 ) {
+ pid = (((b[1] & 0x1f) << 8) | b[2]);
+ if ( pid==chan.vpid || pid==chan.apid || pid==chan.subpid ) {
+ memcpy( tbuf+twrite, b, 188 );
+ twrite+= 188;
+ if ( twrite==NTS*188 ) {
+ if ( fdPipe ) {
+ if ( patpmt ) {
+ write( fdPipe, tspat, 188 );
+ write( fdPipe, tspmt, 188 );
+ }
+ write( fdPipe, tbuf, NTS*188 );
+ if ( timeShifting ) {
+ if ( close( fdPipe )<0 )
+ perror("close out pipe: ");
+ else {
+ fprintf(stderr,"out pipe closed\n");
+ fdPipe = 0;
+ }
+ }
+ }
+ else {
+ if ( patpmt ) {
+ liveFile.writeBlock( (char*)tspat, 188 );
+ liveFile.writeBlock( (char*)tspmt, 188 );
+ }
+ liveFile.writeBlock( (char*)tbuf, 188*NTS );
+ }
+ patpmt = false;
+ twrite = 0;
+ }
+ }
+ b+=188;
+ len-=188;
+ }
+ }
+}
+
+#include "cddump.moc"
diff --git a/kaffeine/src/input/dvbclient/cddump.h b/kaffeine/src/input/dvbclient/cddump.h
new file mode 100644
index 0000000..695eb4b
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/cddump.h
@@ -0,0 +1,106 @@
+/*
+ * cddump.h
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CDDUMP_H
+#define CDDUMP_H
+
+#include <sys/poll.h>
+#include <sys/stat.h>
+#include <netinet/in.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+
+#include <qthread.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qfile.h>
+#include <qtimer.h>
+
+#include "cdchannel.h"
+
+
+
+struct srtpbits {
+ unsigned int v:2; /* version: 2 */
+ unsigned int p:1; /* is there padding appended: 0 */
+ unsigned int x:1; /* number of extension headers: 0 */
+ unsigned int cc:4; /* number of CSRC identifiers: 0 */
+ unsigned int m:1; /* marker: 0 */
+ unsigned int pt:7; /* payload type: 33 for MPEG2 TS - RFC 1890 */
+ unsigned int sequence:16; /* sequence number: random */
+};
+
+struct srtpheader { /* in network byte order */
+ struct srtpbits b;
+ int timestamp; /* start: random */
+ int ssrc; /* random */
+};
+
+
+
+class CdDump : public QObject, public QThread
+{
+ Q_OBJECT
+
+public :
+
+ CdDump( const QString &pipe );
+ ~CdDump();
+ virtual void run();
+ bool go( const QString &ad, int port, CdChannel c );
+ void stop();
+ bool doPause( const QString &name );
+ bool running() const;
+
+private slots:
+
+ void setPatPmt();
+
+private :
+
+ void writePmt();
+ void writePat();
+ void calculateCRC( unsigned char *p_begin, unsigned char *p_end );
+
+ QFile liveFile;
+ bool timeShifting;
+ QString timeShiftFileName;
+ int waitPause;
+ int fdPipe;
+ QString fifoName;
+ bool isRunning;
+ int sock;
+ struct sockaddr_in addr;
+ CdChannel chan;
+ unsigned char tspat[188];
+ unsigned char tspmt[188];
+ unsigned int CRC32[256];
+ int pmtpid;
+ QTimer timerPatPmt;
+ bool patpmt;
+
+signals:
+
+ void playDvb();
+ void shifting( bool );
+
+};
+
+#endif /* CDDUMP_H */
diff --git a/kaffeine/src/input/dvbclient/cdlisten.cpp b/kaffeine/src/input/dvbclient/cdlisten.cpp
new file mode 100644
index 0000000..89ea3c7
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/cdlisten.cpp
@@ -0,0 +1,113 @@
+/*
+ * cdlisten.cpp
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <unistd.h>
+
+#include <kmessagebox.h>
+#include <klocale.h>
+
+#include "cdlisten.h"
+
+
+
+CdListen::CdListen()
+{
+ connect( &timer, SIGNAL(timeout()), this, SLOT(updateList()) );
+}
+
+
+
+CdListen::~CdListen()
+{
+ stop();
+}
+
+
+
+void CdListen::updateList()
+{
+ if ( newList==currentList ) return;
+
+ currentList = newList;
+ emit listChanged( currentList );
+}
+
+
+
+void CdListen::stop()
+{
+ isRunning = false;
+ timer.stop();
+ if ( !wait(100) ) {
+ terminate();
+ wait();
+ }
+ close( sock );
+ sock = 0;
+}
+
+
+
+bool CdListen::go( const QString &ad, int port )
+{
+ if ((sock = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
+ KMessageBox::information( 0, i18n("Can't open info socket."), i18n("DVB Client") );
+ sock = 0;
+ return false;
+ }
+
+ addr.sin_family = AF_INET; // host byte order
+ addr.sin_port = htons( port ); // short, network byte order
+ addr.sin_addr.s_addr = inet_addr( ad.ascii() );
+ memset( &( addr.sin_zero ), '\0', 8 ); // zero the rest of the struct
+
+ if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {
+ KMessageBox::information( 0, i18n("Can't bind info socket!!!"), i18n("DVB Client") );
+ close( sock );
+ sock = 0;
+ return false;
+ }
+
+ currentList = "";
+ newList = currentList;
+ isRunning = true;
+ timer.start( 500, false );
+ start();
+ return true;
+}
+
+
+
+void CdListen::run()
+{
+ char buf[1500];
+ int n;
+ struct sockaddr_in a;
+ socklen_t len = sizeof(struct sockaddr);
+
+ while ( isRunning ) {
+ memset( buf, '\0', 1500 );
+ n = recvfrom( sock, buf, 1500, 0, (struct sockaddr *)&a, &len );
+ if ( n>0 ) newList = buf;
+ else msleep(500);
+ }
+}
+
+#include "cdlisten.moc"
diff --git a/kaffeine/src/input/dvbclient/cdlisten.h b/kaffeine/src/input/dvbclient/cdlisten.h
new file mode 100644
index 0000000..2e1bc7e
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/cdlisten.h
@@ -0,0 +1,62 @@
+/*
+ * cdlisten.h
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CDLISTEN_H
+#define CDLISTEN_H
+
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+#include <qobject.h>
+#include <qthread.h>
+#include <qtimer.h>
+#include <qstring.h>
+
+class CdListen : public QObject, public QThread
+{
+ Q_OBJECT
+
+public:
+
+ CdListen();
+ ~CdListen();
+ virtual void run();
+ bool go( const QString &ad, int port );
+ void stop();
+
+private slots:
+
+ void updateList();
+
+private:
+
+ int sock;
+ struct sockaddr_in addr;
+ bool isRunning;
+ QTimer timer;
+ QString currentList, newList;
+
+signals:
+
+ void listChanged( const QString& );
+};
+
+#endif /* CDLISTEN_H */
diff --git a/kaffeine/src/input/dvbclient/cdwidget.cpp b/kaffeine/src/input/dvbclient/cdwidget.cpp
new file mode 100644
index 0000000..f28d128
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/cdwidget.cpp
@@ -0,0 +1,371 @@
+/*
+ * cdwidget.cpp
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qapplication.h>
+#include <qlayout.h>
+#include <qdir.h>
+
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include "cdwidget.h"
+
+
+
+CdWidget::CdWidget( const QString &ad, int port, int info, const QString &tspath, QWidget *parent, QObject *objParent, const char *name )
+ : KaffeineInput( objParent, name )
+{
+ mainWidget = new QVBox( parent );
+ mainWidget->setSizePolicy( QSizePolicy (QSizePolicy::Preferred, QSizePolicy::Preferred) );
+ split = new QSplitter( mainWidget );
+ split->setOpaqueResize( true );
+ playerBox = new QVBox( split );
+ playerBox->setMinimumWidth( 200 );
+ channelsLb = new QListBox( split );
+ split->moveToFirst( channelsLb );
+ channelsLb->setSizePolicy( QSizePolicy (QSizePolicy::Preferred, QSizePolicy::MinimumExpanding) );
+ split->setResizeMode( channelsLb, QSplitter::KeepSize );
+
+ cdAddress = ad;
+ cdPort = port;
+ cdInfo = info;
+ cdShiftDir = tspath;
+ if ( !cdShiftDir.endsWith("/") ) cdShiftDir+= "/";
+
+ cleaner = new CdCleaner( cdShiftDir );
+
+ chan.setAutoDelete( true );
+
+ KIconLoader *icon = new KIconLoader();
+
+ tvPix = icon->loadIcon( "kdvbtv", KIcon::Small );
+ raPix = icon->loadIcon( "kdvbra", KIcon::Small );
+ delete icon;
+
+ listen = new CdListen();
+ listen->go( cdAddress, cdInfo );
+
+ fifoName = QDir::homeDirPath()+"/.kaxclient.ts";
+ QFile f( fifoName );
+ if ( f.exists() ) f.remove();
+ if ( (mkfifo( fifoName.ascii(), 0644 ))<0 ) {
+ perror( fifoName.latin1() );
+ fifoName = "";
+ dump = 0;
+ }
+ else {
+ dump = new CdDump( fifoName );
+ connect( channelsLb, SIGNAL(selected(const QString &)), this, SLOT(channelSelected(const QString &)) );
+ connect( listen, SIGNAL(listChanged(const QString&)), this, SLOT(updateList(const QString&)) );
+ }
+
+ lastChannel = 0;
+ enableLive( false );
+ loadConfig( KGlobal::config() );
+}
+
+
+
+void CdWidget::togglePanel()
+{
+ if ( channelsLb->isHidden() )
+ channelsLb->show();
+ else
+ channelsLb->hide();
+}
+
+
+
+void CdWidget::getTargets( QStringList &uiNames, QStringList &iconNames, QStringList &targetNames )
+{
+ uiNames.append( i18n("DVB Client") );
+ iconNames.append( "network" );
+ targetNames.append( "DVBCLIENT" );
+}
+
+
+
+bool CdWidget::execTarget( const QString &target )
+{
+ if ( target=="DVBCLIENT" ) {
+ emit showMe( this );
+ QTimer::singleShot( 100, this, SLOT(playLastChannel()) );
+ return true;
+ }
+ return false;
+}
+
+
+
+QWidget* CdWidget::wantPlayerWindow()
+{
+ return playerBox;
+}
+
+
+
+QWidget* CdWidget::inputMainWidget()
+{
+ return mainWidget;
+}
+
+
+
+CdWidget::~CdWidget()
+{
+ if ( dump->running() )
+ emit dvbStop();
+ stopLive();
+ delete dump;
+ delete listen;
+ delete cleaner;
+}
+
+
+
+void CdWidget::loadConfig( KConfig* config )
+{
+ QValueList<int> sl;
+
+ config->setGroup("DVBClient");
+ sl = config->readIntListEntry("SplitSizes");
+ if ( !sl.count() ) {
+ sl.append( 200 );
+ sl.append( 200 );
+ }
+ split->setSizes( sl );
+}
+
+
+
+void CdWidget::saveConfig()
+{
+ KConfig* config = KGlobal::config();
+ config->setGroup("DVBClient");
+ config->writeEntry( "SplitSizes", split->sizes() );
+}
+
+
+
+void CdWidget::updateList( const QString &list )
+{
+ QString c;
+ QString s = list;
+ int pos;
+ QString name, lang;
+ int apid, vpid, ac3, subpid, page, id, type;
+
+ if ( dump->running() )
+ emit dvbStop();
+ dump->stop();
+
+ channelsLb->clear();
+ chan.clear();
+ if ( list=="quit" ) return;
+
+ while ( (pos = s.find("|"))!=-1 ) {
+ name = s.left( pos );
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ vpid = s.left( pos ).toInt();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ apid = s.left( pos ).toInt();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ if ( s.left( pos )=="n" ) ac3 = 0;
+ else ac3 = 1;
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ subpid = s.left( pos ).toInt();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ page = s.left( pos ).toInt();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ id = s.left( pos ).toInt();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ type = s.left( pos ).toInt();
+ s = s.right( s.length()-pos-1 );
+ pos = s.find("|");
+ lang = s.left( pos );
+ s = s.right( s.length()-pos-1 );
+ chan.append( new CdChannel( name, vpid, apid, ac3, subpid, page, id, type, lang ) );
+ if ( vpid ) channelsLb->insertItem( tvPix, name );
+ else channelsLb->insertItem( raPix, name );
+ }
+}
+
+
+
+bool CdWidget::nextTrack( MRL& )
+{
+ next();
+ return false;
+}
+
+
+
+bool CdWidget::previousTrack( MRL& )
+{
+ previous();
+ return false;
+}
+
+
+
+bool CdWidget::currentTrack( MRL& )
+{
+ playLastChannel();
+ return false;
+}
+
+
+
+bool CdWidget::trackNumber( int num, MRL& )
+{
+ playNumChannel( num );
+ return false;
+}
+
+
+
+bool CdWidget::playbackFinished( MRL& )
+{
+ return false;
+}
+
+
+
+void CdWidget::playLastChannel()
+{
+ if ( !channelsLb->count() )
+ return;
+ if ( !lastChannel ) {
+ lastChannel++;
+ }
+ else if ( lastChannel>(int)channelsLb->count() ) {
+ lastChannel = 1;
+ }
+ channelSelected( channelsLb->text( lastChannel-1 ) );
+}
+
+
+
+void CdWidget::playNumChannel( int num )
+{
+ if ( num>0 && num<=(int)channelsLb->count() )
+ channelSelected( channelsLb->text( num-1 ) );
+}
+
+
+
+void CdWidget::next()
+{
+ if ( !channelsLb->count() )
+ return;
+ if ( (lastChannel+1)>(int)channelsLb->count() )
+ return;
+ lastChannel++;
+ channelSelected( channelsLb->text( lastChannel-1 ) );
+}
+
+
+
+void CdWidget::previous()
+{
+ if ( !channelsLb->count() )
+ return;
+ if ( (lastChannel-1)<1 )
+ return;
+ lastChannel--;
+ channelSelected( channelsLb->text( lastChannel-1 ) );
+}
+
+
+
+void CdWidget::channelSelected( const QString &name )
+{
+ int i;
+
+ for ( i=0; i<(int)chan.count(); i++ ) {
+ if ( chan.at(i)->name==name ) {
+ emit setCurrentPlugin( this );
+ dump->stop();
+ dump->go( cdAddress, cdPort, *chan.at(i) );
+ emit dvbOpen( fifoName, chan.at(i)->name, chan.at(i)->vpid );
+ break;
+ }
+ }
+}
+
+
+
+void CdWidget::pauseLiveTV()
+{
+ if ( !dump )
+ return;
+ if ( dump->running() ) {
+ timeShiftFileName = cdShiftDir+"DVBClient-"+QDateTime::currentDateTime().toString( Qt::ISODate )+".ts";
+ if ( dump->doPause( timeShiftFileName ) ) emit setTimeShiftFilename( timeShiftFileName );
+ }
+}
+
+
+
+void CdWidget::stopLive()
+{
+ if ( !dump )
+ return;
+ dump->stop();
+ emit setTimeShiftFilename( "" );
+}
+
+
+
+void CdWidget::enableLive( bool b )
+{
+ channelsLb->setEnabled( b );
+}
+
+
+
+void CdWidget::setParam( const QString &ad, int port, int info, const QString &tspath )
+{
+ cdAddress = ad;
+ cdPort = port;
+ cdInfo = info;
+ cdShiftDir = tspath;
+ if ( !cdShiftDir.endsWith("/") ) cdShiftDir+= "/";
+ cleaner->setPath( cdShiftDir );
+
+ channelsLb->clear();
+ chan.clear();
+ if ( dump ) {
+ if ( dump->running() )
+ emit dvbStop();
+ dump->stop();
+ }
+ listen->stop();
+ listen->go( cdAddress, cdInfo );
+}
+
+#include "cdwidget.moc"
diff --git a/kaffeine/src/input/dvbclient/cdwidget.h b/kaffeine/src/input/dvbclient/cdwidget.h
new file mode 100644
index 0000000..2862320
--- /dev/null
+++ b/kaffeine/src/input/dvbclient/cdwidget.h
@@ -0,0 +1,107 @@
+/*
+ * cdwidget.h
+ *
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef CDWIDGET_H
+#define CDWIDGET_H
+
+#include <qlistbox.h>
+#include <qpixmap.h>
+#include <qptrlist.h>
+#include <qvbox.h>
+#include <qsplitter.h>
+
+#include <kconfig.h>
+
+#include "cddump.h"
+#include "cdlisten.h"
+#include "cdcleaner.h"
+#include "kaffeineinput.h"
+
+
+
+class CdWidget : public KaffeineInput
+{
+ Q_OBJECT
+
+public:
+
+ CdWidget( const QString &ad, int port, int info, const QString &tspath, QWidget *parent, QObject *objParent, const char *name );
+ ~CdWidget();
+ void setParam( const QString &ad, int port, int info, const QString &tspath );
+ void enableLive( bool b );
+ void playNumChannel( int num );
+ void next();
+ void previous();
+
+ // Reimplemented from KaffeineInput
+ QWidget *wantPlayerWindow();
+ QWidget *inputMainWidget();
+ bool nextTrack( MRL& );
+ bool previousTrack( MRL& );
+ bool currentTrack( MRL& );
+ bool trackNumber( int, MRL& );
+ bool playbackFinished( MRL& );
+ void getTargets( QStringList &uiNames, QStringList &iconNames, QStringList &targetNames );
+ void togglePanel();
+ bool execTarget( const QString& );
+ void saveConfig();
+ //***************************************
+
+ QListBox *channelsLb;
+ QVBox *mainWidget;
+ QVBox *playerBox;
+
+public slots:
+
+ void playLastChannel();
+ void stopLive();
+ void pauseLiveTV();
+
+private:
+ void loadConfig( KConfig* config );
+ void saveConfig( KConfig* config );
+
+ QSplitter *split;
+ CdDump *dump;
+ CdListen *listen;
+ QString cdAddress;
+ int cdPort;
+ int cdInfo;
+ QString cdShiftDir;
+ QPixmap tvPix, raPix;
+ QPtrList<CdChannel> chan;
+ QString fifoName;
+ QString timeShiftFileName;
+ CdCleaner *cleaner;
+ int lastChannel;
+
+private slots:
+
+ void updateList( const QString &list );
+ void channelSelected( const QString &name );
+
+signals:
+
+ void dvbOpen(const QString&, const QString&, int);
+ void dvbStop();
+ void setTimeShiftFilename( const QString& );
+};
+
+#endif /* CDWIDGET_H */
diff --git a/kaffeine/src/input/kaffeineinput.cpp b/kaffeine/src/input/kaffeineinput.cpp
new file mode 100644
index 0000000..74d4a8b
--- /dev/null
+++ b/kaffeine/src/input/kaffeineinput.cpp
@@ -0,0 +1,31 @@
+/*
+ * kaffeineinput.cpp
+ *
+ * Copyright (C) 2005-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "kaffeineinput.h"
+
+KaffeineInput::KaffeineInput(QObject* parent, const char* name) : QObject( parent, name )
+{
+}
+
+KaffeineInput::~KaffeineInput()
+{
+}
+
+#include "kaffeineinput.moc"
diff --git a/kaffeine/src/input/kaffeineinput.h b/kaffeine/src/input/kaffeineinput.h
new file mode 100644
index 0000000..0670178
--- /dev/null
+++ b/kaffeine/src/input/kaffeineinput.h
@@ -0,0 +1,115 @@
+/*
+ * kaffeineinput.h
+ *
+ * Copyright (C) 2005-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KAFFEINEINPUT_H
+#define KAFFEINEINPUT_H
+
+#include <qstring.h>
+#include <qwidget.h>
+
+#include <kxmlguiclient.h>
+
+class MRL;
+
+class KaffeineInput : public QObject, public KXMLGUIClient
+{
+ Q_OBJECT
+public:
+ KaffeineInput(QObject* parent, const char* name);
+ virtual ~KaffeineInput();
+
+ // if you want the player window to be displayed on one of your widgets, return a pointer to that one.
+ virtual QWidget *wantPlayerWindow() {return NULL;}
+
+ // you MUST return your main widget (the one containing all your gui).
+ virtual QWidget *inputMainWidget() {return NULL;}
+
+ // called when the user want next track and you are the current input.
+ // fill the MRL and return true to play your next track.
+ virtual bool nextTrack( MRL& ) {return false;}
+
+ // called when the user want previous track and you are the current input.
+ // fill the MRL and return true to play your previous track.
+ virtual bool previousTrack( MRL& ) {return false;}
+
+ // called when the user starts playing and you are the current input.
+ // fill the MRL and return true to play your current track.
+ virtual bool currentTrack( MRL& ) {return false;}
+
+ // called when the user enters a track number and you are the current input.
+ // fill the MRL and return true to play that track.
+ virtual bool trackNumber( int, MRL& ) {return false;}
+
+ // called when the player has reached the end of current track and you are the current input.
+ // fill the MRL and return true to play your next track.
+ virtual bool playbackFinished( MRL& ) {return false;}
+
+ // called when the player is paused and you are the current input.
+ virtual void playerPaused() {}
+
+ // called when the player is stopped and you are the current input.
+ virtual void playerStopped() {}
+
+ // called when playing failed and you are the current input.
+ virtual void playbackFailed() {}
+
+ // called when the player finds metadata(tags) and you are the current input.
+ virtual void mergeMeta(const MRL&) {}
+
+ // shortcuts buttons to be displayed in the start window.
+ virtual void getTargets( QStringList&/*uiNames*/, QStringList&/*iconNames*/, QStringList&/*targetNames*/ ) {}
+
+ // play shortcut, return false if the target is not yours;
+ virtual bool execTarget( const QString&/*target*/ ) {return false;}
+
+ // toggle your panel (show / hide) if any
+ virtual void togglePanel() {}
+
+ // called when kaffeine is about to quit. Here, you could ask the user to confirm if you have pending
+ // operations. Return accordingly.
+ virtual bool close() {return true;}
+
+ // called when kaffeine is about to quit. Save your settings now.
+ virtual void saveConfig() {}
+
+ // called when a video is to be played, return false to not automatically switch to player window.
+ virtual bool showPlayer() {return true;}
+
+signals:
+ // emit that to play your mrl (you'll become the current input, if not yet).
+ void play(const MRL&, KaffeineInput*/*this*/);
+
+ // emit that if you want a message to be displayed in statusbar. (do that only if you are the current input, e.g. after play())
+ void statusBarMessage(const QString&);
+
+ // emit that if you want to stop the player. Be aware that it'll end with a call to playerStopped().
+ // you usually don't need that.
+ void stop();
+
+ // emit that if you want to pause the player. Be aware that it'll end with a call to playerPaused().
+ // you usually don't need that.
+ void pause();
+
+ // for special uses.
+ void setCurrentPlugin( KaffeineInput* );
+ void showMe( KaffeineInput* );
+};
+
+#endif /* KAFFEINEINPUT_H */
diff --git a/kaffeine/src/inputmanager.cpp b/kaffeine/src/inputmanager.cpp
new file mode 100644
index 0000000..75bae51
--- /dev/null
+++ b/kaffeine/src/inputmanager.cpp
@@ -0,0 +1,603 @@
+/*
+ * inputmanager.cpp
+ *
+ * Copyright (C) 2005-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kurl.h>
+#include <kdebug.h>
+#include <kurldrag.h>
+#include <kkeydialog.h>
+#include <klocale.h>
+
+#include "kmultitabbar.h"
+#include "kaffeine.h"
+#include "kaffeineinput.h"
+#include "inputmanager.h"
+#include "mrl.h"
+#include "startwindow.h"
+#include "inputmanager.moc"
+
+
+InputPlugin::InputPlugin( KaffeineInput *p, int ident, QString na )
+{
+ plug = p;
+ id = ident;
+ name = na;
+}
+
+
+
+InputPlugin::~InputPlugin()
+{
+}
+
+
+
+InputManager::InputManager( Kaffeine *parent, QWidgetStack *ws, KMultiTabBar *mt )
+ : QObject(parent)
+{
+ kaffeine = parent;
+ stack = ws;
+ mtBar = mt;
+ plugs.setAutoDelete( true );
+ playerContainer = NULL;
+ currentPlugin = NULL;
+ nextId = 3;
+}
+
+
+
+InputManager::~InputManager()
+{
+ plugs.clear();
+}
+
+
+
+QSize InputManager::stackSize()
+{
+ return stack->size();
+}
+
+
+
+QWidget* InputManager::visibleWidget() const
+{
+ return stack->visibleWidget();
+}
+
+
+
+void InputManager::play( const MRL &mrl, KaffeineInput *p )
+{
+ if ( currentPlugin!=p ) {
+ currentPlugin->playerStopped();
+ currentPlugin = p;
+ }
+ kaffeine->slotPlay( mrl );
+}
+
+
+
+void InputManager::stop()
+{
+ kaffeine->slotStop();
+ currentPlugin->playerStopped();
+}
+
+
+
+void InputManager::pause()
+{
+ kaffeine->slotPlayUnPause();
+ currentPlugin->playerPaused();
+}
+
+
+
+void InputManager::mergeMeta( const MRL &mrl )
+{
+ currentPlugin->mergeMeta( mrl );
+}
+
+
+
+void InputManager::setCurrentPlugin( KaffeineInput *p )
+{
+ if ( currentPlugin!=p ) {
+ currentPlugin->playerStopped();
+ currentPlugin = p;
+ }
+}
+
+
+
+QString InputManager::activePlugin()
+{
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it ) {
+ if ( it.current()->plug==currentPlugin )
+ return it.current()->name;
+ }
+ return QString();
+}
+
+
+
+void InputManager::showMe( KaffeineInput *p )
+{
+ int id=0;
+ int p_id=0;
+ QWidget *widg;
+
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it ) {
+ if ( it.current()->plug->inputMainWidget()==currentMainWidget )
+ id = it.current()->id;
+ if ( it.current()->plug==p ) {
+ widg = it.current()->plug->inputMainWidget();
+ p_id = it.current()->id;
+ }
+ }
+ if ( currentMainWidget==playerWidget )
+ id = 2;
+ else if ( currentMainWidget==startWindow )
+ id = 1;
+
+ if ( id && p_id && (id!=p_id) ) {
+ if ( mtBar->isHidden() )
+ currentMainWidget = widg;
+ else {
+ mtBar->setTab( id, false );
+ mtBar->setTab( p_id, true );
+ show( p_id );
+ }
+ }
+}
+
+
+
+void InputManager::setActivePlugin( QString name )
+{
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it ) {
+ if ( it.current()->name==name ) {
+ currentPlugin = it.current()->plug;
+ mtBar->setTab( 1, false );
+ mtBar->setTab( it.current()->id, true );
+ show( it.current()->id );
+ break;
+ }
+ }
+}
+
+
+
+void InputManager::showPlayer()
+{
+ int id=0;
+
+ if ( currentMainWidget==playerWidget )
+ return;
+ if ( currentMainWidget==startWindow )
+ id = 1;
+ else {
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it ) {
+ if ( it.current()->plug->inputMainWidget()==currentMainWidget ) {
+ if ( !it.current()->plug->showPlayer() )
+ return;
+ id = it.current()->id;
+ break;
+ }
+ }
+ }
+ mtBar->setTab( id, false );
+ mtBar->setTab( 2, true );
+ show( 2 );
+}
+
+
+
+void InputManager::togglePlaylist()
+{
+ int currentPluginId=0, playlistPluginId=0;
+
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it ) {
+ if ( it.current()->name == i18n("Playlist") ) {
+ playlistPluginId = it.current()->id;
+ break;
+ }
+ }
+ for ( QPtrListIterator<InputPlugin> it2(plugs); it2.current(); ++it2 ) {
+ if ( it2.current()->plug->inputMainWidget() == currentMainWidget ) {
+ currentPluginId = it2.current()->id;
+ break;
+ }
+ }
+
+ if ( currentMainWidget == playerWidget ) {
+ mtBar->setTab( 2, false );
+ mtBar->setTab( playlistPluginId, true );
+ show( playlistPluginId );
+ }
+ else if ( currentMainWidget == startWindow ) {
+ mtBar->setTab( 1, false );
+ mtBar->setTab( playlistPluginId, true );
+ show( playlistPluginId );
+ }
+ else if ( currentPluginId == playlistPluginId ) {
+ showPlayer();
+ }
+ else {
+ mtBar->setTab( currentPluginId, false );
+ mtBar->setTab( playlistPluginId, true );
+ show( playlistPluginId );
+ }
+}
+
+
+
+void InputManager::addConfigKeys( KKeyDialog* kd )
+{
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it )
+ kd->insert( it.current()->plug->actionCollection(), it.current()->plug->name());
+}
+
+
+
+bool InputManager::isPlaylistCurrent()
+{
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it ) {
+ if ( it.current()->name == i18n("Playlist") ) {
+ if ( it.current()->plug==currentPlugin )
+ return true;
+ }
+ }
+ return false;
+}
+
+
+
+void InputManager::playCurrentTrack()
+{
+ MRL mrl;
+
+ if ( currentPlugin->currentTrack( mrl ) )
+ kaffeine->slotPlay( mrl );
+}
+
+
+
+void InputManager::playNextTrack()
+{
+ MRL mrl;
+
+ if ( currentPlugin->nextTrack( mrl ) )
+ kaffeine->slotPlay( mrl );
+}
+
+
+
+void InputManager::playPreviousTrack()
+{
+ MRL mrl;
+
+ if ( currentPlugin->previousTrack( mrl ) )
+ kaffeine->slotPlay( mrl );
+}
+
+
+
+void InputManager::playTrackNumber( int num )
+{
+ MRL mrl;
+
+ if ( currentPlugin->trackNumber( num, mrl ) )
+ kaffeine->slotPlay( mrl );
+}
+
+
+
+bool InputManager::playbackFinished( MRL &mrl )
+{
+ return currentPlugin->playbackFinished( mrl );
+}
+
+
+
+void InputManager::statusBarMessage( const QString &msg )
+{
+ kaffeine->slotChangePlaylistStatus( msg );
+}
+
+
+
+void InputManager::saveConfig()
+{
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it )
+ it.current()->plug->saveConfig();
+}
+
+
+
+bool InputManager::close()
+{
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it ) {
+ if ( !it.current()->plug->close() )
+ return false;
+ }
+ return true;
+}
+
+
+
+void InputManager::add( KaffeineInput *p, const QPixmap &icon, const QString &name )
+{
+ mtBar->appendTab( icon, nextId, name );
+ connect( mtBar->tab( nextId ), SIGNAL(clicked(int)), this, SLOT(show(int)) );
+ stack->addWidget( p->inputMainWidget(), nextId );
+ plugs.append( new InputPlugin( p, nextId, name ) );
+ connect( p, SIGNAL(play(const MRL&,KaffeineInput*)), this, SLOT(play(const MRL&,KaffeineInput*)));
+ connect( p, SIGNAL(setCurrentPlugin(KaffeineInput*)), this, SLOT(setCurrentPlugin(KaffeineInput*)));
+ connect( p, SIGNAL(statusBarMessage(const QString&)), this, SLOT(statusBarMessage(const QString&)));
+ connect( p, SIGNAL(stop()), this, SLOT(stop()));
+ connect( p, SIGNAL(pause()), this, SLOT(pause()));
+ connect( p, SIGNAL(showMe(KaffeineInput*)), this, SLOT(showMe(KaffeineInput*)));
+ if ( !currentPlugin )
+ currentPlugin = plugs.current()->plug;
+ ++nextId;
+ makeTargets( p, true );
+}
+
+
+
+void InputManager::addPlayerWidget( QWidget *w, const QPixmap &icon, const QString &name )
+{
+ playerWidget = w;
+ mtBar->appendTab( icon, 2, name );
+ connect( mtBar->tab(2), SIGNAL(clicked(int)), this, SLOT(show(int)) );
+ stack->addWidget( playerWidget, 2 );
+}
+
+
+
+void InputManager::addStartWindow( QWidget *w, const QPixmap &icon, const QString &name )
+{
+ startWindow = w;
+ mtBar->appendTab( icon, 1, name );
+ connect( mtBar->tab(1), SIGNAL(clicked(int)), this, SLOT(show(int)) );
+ stack->addWidget( startWindow, 1 );
+ mtBar->setTab( 1, true );
+ stack->raiseWidget( 1 );
+ oldMainWidget = currentMainWidget = startWindow;
+ connect( (StartWindow*)w, SIGNAL(execTarget(const QString&)), this, SLOT(execTarget(const QString&)) );
+}
+
+
+
+void InputManager::execTarget( const QString &target )
+{
+ QPtrListIterator<InputPlugin> it(plugs);
+ for ( it.toFirst(); it.current(); ++it ) {
+ if ( it.current()->plug->execTarget( target ) )
+ return;
+ }
+}
+
+
+
+void InputManager::makeTargets( KaffeineInput *p, bool make )
+{
+ int i;
+ QStringList uiNames, iconNames, targetNames;
+ StartWindow *sw = (StartWindow*)(startWindow);
+
+ p->getTargets( uiNames, iconNames, targetNames );
+ for ( i=0; i<(int)uiNames.count(); i++ ) {
+ if ( make )
+ sw->registerTarget( uiNames[i], iconNames[i], targetNames[i] );
+ else
+ sw->unregisterTarget( targetNames[i] );
+ }
+}
+
+
+
+void InputManager::remove( KaffeineInput *p )
+{
+ InputPlugin *i=NULL;
+ QPtrListIterator<InputPlugin> it(plugs);
+
+ for ( it.toFirst(); it.current(); ++it ) {
+ if ( it.current()->plug==p ) {
+ i = it.current();
+ break;
+ }
+ }
+
+ if ( i ) {
+ if ( i->plug==currentPlugin ) {
+ if ( i->plug->inputMainWidget()==currentMainWidget ) {
+ mtBar->setTab( 1, true );
+ show( 1 );
+ currentPlugin = plugs.getFirst()->plug;
+ }
+ else {
+ for ( it.toFirst(); it.current(); ++it ) {
+ if ( it.current()->plug->inputMainWidget()==currentMainWidget ) {
+ currentPlugin = it.current()->plug;
+ break;
+ }
+ }
+ }
+ }
+ else {
+ if ( i->plug->inputMainWidget()==currentMainWidget ) {
+ for ( it.toFirst(); it.current(); ++it ) {
+ if ( it.current()->plug==currentPlugin ) {
+ show( it.current()->id );
+ break;
+ }
+ }
+ }
+ }
+ mtBar->removeTab( i->id );
+ stack->removeWidget( i->plug->inputMainWidget() );
+ makeTargets( i->plug, false );
+ delete i->plug;
+ plugs.remove( i );
+ }
+}
+
+
+
+void InputManager::setPlayerContainer( PlayerContainer *pc )
+{
+ playerContainer = pc;
+ if ( playerContainer ) {
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it ) {
+ if ( it.current()->plug->inputMainWidget()==currentMainWidget ) {
+ playerContainer->reparent( it.current()->plug->wantPlayerWindow(), QPoint(0,0), true);
+ playerContainer->show();
+ break;
+ }
+ }
+ }
+}
+
+
+
+void InputManager::show( int id )
+{
+ QWidget *widg = NULL;
+ QWidget *main = NULL;
+
+ if ( id==2 ) {
+ if ( currentMainWidget==playerWidget )
+ return;
+ if ( playerContainer ) {
+ playerContainer->reparent(playerWidget, QPoint(0,0), true);
+ currentMainWidget = playerWidget;
+ }
+ currentMainWidget = playerWidget;
+ }
+ else if ( id==1 ) {
+ if ( currentMainWidget==startWindow )
+ return;
+ currentMainWidget = startWindow;
+ }
+ else {
+ for ( QPtrListIterator<InputPlugin> it(plugs); it.current(); ++it ) {
+ if ( it.current()->id==id ) {
+ main = it.current()->plug->inputMainWidget();
+ if ( main==currentMainWidget ) {
+ it.current()->plug->togglePanel();
+ return;
+ }
+ currentMainWidget = main;
+ widg = it.current()->plug->wantPlayerWindow();
+ if ( widg && playerContainer )
+ playerContainer->reparent(widg, QPoint(0,0), true);
+ break;
+ }
+ }
+ }
+
+ stack->raiseWidget( id );
+}
+
+
+
+void InputManager::fullscreen( bool b )
+{
+ QPtrListIterator<InputPlugin> it(plugs);
+ int id=0;
+
+ if ( b ) {
+ stack->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
+ oldMainWidget = currentMainWidget;
+ show( 2 );
+ mtBar->hide();
+ }
+ else {
+ stack->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+ mtBar->show();
+ if ( oldMainWidget==startWindow )
+ id = 1;
+ else {
+ for ( it.toFirst(); it.current(); ++it ) {
+ if ( it.current()->plug->inputMainWidget()==oldMainWidget ) {
+ id = it.current()->id;
+ break;
+ }
+ }
+ }
+ show( id );
+ }
+}
+
+
+
+/********/
+PlayerContainer::PlayerContainer(QWidget* parent, const char* name) : QVBox(parent, name)
+{
+ setAcceptDrops(true);
+ setMouseTracking( true );
+}
+
+
+void PlayerContainer::dragEnterEvent (QDragEnterEvent* dev)
+{
+ kdDebug() << "PlayerContainer: drag enter event" << endl;
+ dev->accept(QUriDrag::canDecode(dev) || QTextDrag::canDecode(dev));
+}
+
+void PlayerContainer::dropEvent(QDropEvent* dev)
+{
+ QStringList urls,newurls;
+
+ if (QUriDrag::decodeLocalFiles(dev, urls))
+ {
+ if (urls.count())
+ {
+ for (uint i=0; i < urls.count() ;i++)
+ {
+ //KURL url(QUriDrag::unicodeUriToUri(urls[i]));
+ //newurls << url.path(-1);
+ //kdDebug() << "Kaffeine: Dropped " << url.path() << endl;
+ newurls << urls[i];
+ kdDebug() << "Kaffeine: Dropped " << urls[i] << endl;
+ }
+ emit signalURLDropEvent(newurls);
+ }
+ else
+ {
+ QUriDrag::decodeToUnicodeUris(dev, urls);
+ if (urls.count())
+ emit signalURLDropEvent(urls);
+ }
+ }
+ else
+ if (strcmp(dev->format(), "text/x-moz-url") == 0) // for mozilla drops
+ {
+ QByteArray data = dev->encodedData("text/plain");
+ QString md(data);
+ emit signalURLDropEvent(md);
+ }
+}
diff --git a/kaffeine/src/inputmanager.h b/kaffeine/src/inputmanager.h
new file mode 100644
index 0000000..06055d7
--- /dev/null
+++ b/kaffeine/src/inputmanager.h
@@ -0,0 +1,131 @@
+/*
+ * inputmanager.h
+ *
+ * Copyright (C) 2005-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef INPUTMANAGER_H
+#define INPUTMANAGER_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qptrlist.h>
+#include <qwidgetstack.h>
+#include <qvbox.h>
+#include <qstring.h>
+
+class KaffeineInput;
+class KMultiTabBar;
+class Kaffeine;
+class KKeyDialog;
+class MRL;
+
+
+
+class PlayerContainer : public QVBox
+{
+ Q_OBJECT
+
+public:
+ PlayerContainer(QWidget* parent = 0, const char* name = 0);
+ virtual ~PlayerContainer() {}
+
+signals:
+ void signalURLDropEvent(const QStringList&);
+
+protected:
+ void dragEnterEvent (QDragEnterEvent*);
+ void dropEvent(QDropEvent*);
+
+};
+
+
+
+class InputPlugin
+{
+public:
+ InputPlugin( KaffeineInput *p, int ident, QString na );
+ ~InputPlugin();
+
+ KaffeineInput *plug;
+ int id;
+ QString name;
+};
+
+
+
+class InputManager : public QObject
+{
+ Q_OBJECT
+public:
+ InputManager( Kaffeine *parent, QWidgetStack *ws, KMultiTabBar *mt );
+ ~InputManager();
+
+ void add( KaffeineInput *p, const QPixmap &icon, const QString &name );
+ void addPlayerWidget( QWidget *w, const QPixmap &icon, const QString &name );
+ void addStartWindow( QWidget *w, const QPixmap &icon, const QString &name );
+ void remove( KaffeineInput *p );
+ void setPlayerContainer( PlayerContainer *pc );
+ void fullscreen( bool b );
+ QString activePlugin();
+ void setActivePlugin( QString name );
+ void addConfigKeys( KKeyDialog* kd );
+ void showPlayer();
+ void togglePlaylist();
+ void saveConfig();
+
+ void playCurrentTrack();
+ void playNextTrack();
+ void playPreviousTrack();
+ void playTrackNumber( int num );
+ bool playbackFinished( MRL &mrl );
+ void mergeMeta(const MRL&);
+ bool close();
+ QSize stackSize();
+ QWidget* visibleWidget() const;
+ bool isPlaylistCurrent();
+
+public slots:
+ void execTarget( const QString& );
+
+private slots:
+ void show( int id );
+ void play( const MRL&, KaffeineInput* );
+ void statusBarMessage( const QString& );
+ void setCurrentPlugin( KaffeineInput* );
+ void stop();
+ void pause();
+ void showMe( KaffeineInput* );
+
+private:
+ void makeTargets( KaffeineInput*, bool );
+
+ QWidgetStack *stack;
+ KMultiTabBar *mtBar;
+ QPtrList<InputPlugin> plugs;
+ QWidget *playerWidget, *startWindow;
+ QWidget *currentMainWidget;
+ PlayerContainer *playerContainer;
+ QWidget *oldMainWidget;
+ KaffeineInput *currentPlugin;
+ int nextId;
+ Kaffeine *kaffeine;
+};
+
+#endif /* INPUTMANAGER_H */
diff --git a/kaffeine/src/instwizard.cpp b/kaffeine/src/instwizard.cpp
new file mode 100644
index 0000000..eec6fa4
--- /dev/null
+++ b/kaffeine/src/instwizard.cpp
@@ -0,0 +1,278 @@
+/*
+ * instwizard.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kprocess.h>
+#include <kglobal.h>
+#include <kstandarddirs.h>
+#include <ktextbrowser.h>
+#include <kservice.h>
+
+#include <qcheckbox.h>
+#include <qvbox.h>
+#include <qdir.h>
+#include <qfile.h>
+#include <qstringlist.h>
+#include <kdeversion.h>
+#include <kapplication.h>
+
+//#include <xine.h>
+
+#include "version.h"
+#include "instwizard.h"
+#include "instwizard.moc"
+#ifdef HAVE_DVB
+#include "dvbconfig.h"
+#endif
+
+void InstWizard::internalWizard()
+{
+ setCaption(i18n("Kaffeine %1 Installation Wizard").arg(KAFFEINE_VERSION));
+ resize(400,400);
+
+ /************** installation check ************************/
+
+ KTextBrowser* page1 = new KTextBrowser(this);
+ addPage(page1, i18n("Installation Check"));
+ setNextEnabled(page1, true);
+ setBackEnabled(page1, false);
+ setHelpEnabled(page1, false);
+ setFinishEnabled(page1, false);
+
+ QString infoString;
+ QTextStream info(&infoString, IO_WriteOnly);
+
+ //KAFFEINE-PART
+
+ info << "<b>" << i18n("Kaffeine-Xine") << "...</b><br>";
+ KService::Ptr service = KService::serviceByDesktopName("xine_part");
+ if ((service) && (service->serviceTypes().contains("KaffeinePart")))
+ info << "<font color=\"DarkGreen\">" << i18n("Ok.") << "</font>";
+ else
+ info << "<font color=\"DarkRed\">" << i18n("Part not found. Please check your installation!") << "</font>";
+
+ //KAFFEINE-PART
+ info << "<br><hr><b>" << "KDE" << "...</b><br>";
+ info << i18n("Found version") << ": " << KDE::versionString() << "<br>";
+ if (KDE::version() >= KDE_MAKE_VERSION(3,2,0))
+ info << "<font color=\"DarkGreen\">" << i18n("Ok.") << "</font>";
+ else
+ info << "<font color=\"DarkRed\">" << i18n("Kaffeine requires KDE >= %1.").arg("3.2") << "</font>";
+
+ //XINE-LIB
+ //Should engine depending stuff be here?
+ /*
+ info << "<br><hr><b>" << "xine-lib" << "...</b><br>";
+ QString xineVersion = xine_get_version_string();
+ info << i18n("Found version") << ": " << xineVersion << "<br>";
+ if (xine_check_version(1,0,0))
+ {
+ int major, minor, sub;
+ xine_get_version(&major, &minor, &sub);
+ if (xineVersion.contains("CVS", false))
+ info << "<font color=\"DarkBlue\">" << i18n("Developer version.") << "</font>";
+
+ if ((major == 1) && (minor == 0) && (sub == 0) && (xineVersion.contains("rc", false)))
+ {
+ info << "<font color=\"DarkRed\">" << i18n("Kaffeine requires xine-lib >= %1. Download the latest version here:").arg("1.0") << " <a href=\"http://www.xinehq.de\">http://www.xinehq.de</a>.</font>";
+ }
+ else
+ info << "<font color=\"DarkGreen\">" << i18n("Ok.") << "</font>";
+ }
+ else
+ info << "<font color=\"DarkRed\">" << i18n("Kaffeine requires xine-lib >= %1. Download the latest version here:").arg("1.0")
+ << " <a href=\"http://www.xinehq.de\">http://www.xinehq.de</a>.</font>";
+ */
+ //WIN32-CODECS
+ info << "<hr><b>" << i18n("WIN32 Codecs") << "...</b><br>";
+ QDir d("/usr/lib/win32");
+ QStringList entries = d.entryList("wmv*");
+ if (entries.count())
+ info << "<font color=\"DarkGreen\">" << i18n("Ok.") << "</font>";
+ else
+ info << "<font color=\"DarkRed\">" << i18n("No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media 9 files, newer Real Media files and some less common formats. Download the codecs here:")
+ << " <a href=\"http://www1.mplayerhq.hu/homepage/design7/codecs.html\">http://www.mplayerhq.hu</a>.</font>";
+
+ //LIBDVDCSS
+ info << "<br><hr><b>" << "libdvdcss" << "...</b><br>";
+ bool dvdcss = false;
+ d = QDir("/usr/lib");
+ entries = d.entryList("libdvdcss.so*");
+ if (entries.count())
+ dvdcss = true;
+ else
+ {
+ d = QDir("/usr/local/lib");
+ entries = d.entryList("libdvdcss.so*");
+ if (entries.count())
+ dvdcss = true;
+ else
+ {
+ d = QDir("/usr/lib64");
+ entries = d.entryList("libdvdcss.so*");
+ if (entries.count())
+ dvdcss = true;
+ }
+ }
+ if (!dvdcss)
+ info << "<font color=\"DarkRed\">" << i18n("libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. You can get the library here (but using it may violate copyright regulations of your country!):")
+ << " <a href=\"http://developers.videolan.org/libdvdcss/\">http://developers.videolan.org/libdvdcss</a>.</font>";
+ else
+ info << "<font color=\"DarkGreen\">" << i18n("Ok.") << "</font>";
+
+ //DVD-DRIVE
+ info << "<br><hr><b>" << i18n("DVD Drive") << "...</b><br>";
+ KProcess process;
+ process << "/sbin/hdparm" << "-d" << "/dev/dvd";
+ connect(&process, SIGNAL(receivedStdout(KProcess*,char*,int)), this, SLOT(slotStdout(KProcess*, char*, int)));
+ process.start(KProcess::Block, KProcess::Stdout);
+
+ if (stdout.contains('1'))
+ info << "<font color=\"DarkGreen\">" << i18n("Ok.") << "</font>";
+ else if (stdout.contains('0'))
+ info << "<font color=\"DarkRed\">" << i18n("DMA mode off! For smooth DVD playback run as root:") + " \"hdparm -d1 /dev/dvd\".</font>";
+ else
+ info << "<font color=\"DarkBlue\">" << i18n("Can't check DMA mode. Permission denied or no such device:")
+ << " \"/dev/dvd\".</font>";
+
+ //DVB-DEVICES
+#ifdef HAVE_DVB
+ info << "<br><hr><b>" << i18n("DVB-Device") << "...</b><br>";
+ if (DVBconfig::haveDvbDevice())
+ {
+ info << "<font color=\"DarkGreen\">" << i18n("Ok.") << "</font>";
+ }
+ else
+ {
+ info << "<font color=\"DarkBlue\">" << i18n("No DVB-Devices found. The DVB related functions will be hidden.") << "</font>";
+ }
+#endif
+
+ //DISTRIBUTION
+ info << "<br><hr><b>" << i18n("Distribution") << "...</b><br>";
+ if (QFile::exists("/etc/SuSE-release"))
+ {
+ QFile file("/etc/SuSE-release");
+ file.open(IO_ReadOnly);
+ QTextStream stream(&file);
+ info << "<font color=\"DarkBlue\">" << i18n("Found") << ": " << stream.readLine() << ". </font>"
+ << i18n("The xine-lib shipped by SuSE \"may lack certain features because of legal requirements (potential patent violation)\". You should use the packages from here:")
+ << " <a href=\"http://packman.links2linux.de/?action=124\">http://packman.links2linux.de</a>.";
+ file.close();
+ }
+ else
+ info << "<font color=\"DarkGreen\">" << i18n("Ok.") << "</font>";
+
+
+ info << "<hr><br><b>" << i18n("RESULT") << ":</b> ";
+
+ if (infoString.contains("DarkRed"))
+ {
+ info << i18n("Found some problems, but nevertheless Kaffeine may work.");
+ }
+ else
+ {
+ info << i18n("All ok!");
+ }
+
+ info << "<br><br";
+
+ page1->setText(infoString);
+
+ /************** installation options **********************/
+ QVBox* page2 = new QVBox(this);
+ page2->setSpacing(20);
+
+ QCheckBox *m_useMMSHelper = new QCheckBox(i18n("Use Kaffeine as helper application for mms:// (Microsoft Media) streams"), page2);
+ if (!locateLocal("services", "mms.protocol"))
+ m_useMMSHelper->setChecked(true);
+
+ QCheckBox *m_useRTSPHelper = new QCheckBox(i18n("Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"), page2);
+ if (!locateLocal("services", "rtsp.protocol"))
+ m_useRTSPHelper->setChecked(true);
+
+ QCheckBox *m_createDesktopIcon = new QCheckBox(i18n("Create a Kaffeine icon on desktop"), page2);
+ if (!QFile::exists( QDir::homeDirPath() + "/Desktop/kaffeine.desktop"))
+ m_createDesktopIcon->setChecked(true);
+
+ addPage(page2, i18n("Installation Options"));
+ setNextEnabled(page2, false);
+ setBackEnabled(page2, true);
+ setHelpEnabled(page2, false);
+ setFinishEnabled(page2, true);
+
+ if (exec() == QDialog::Accepted) {
+ kdDebug() << "WizardDialog: finished pressed" << endl;
+
+ KProcess process;
+
+ QStringList dirs = KGlobal::dirs()->findDirs("data", "kaffeine");
+ QString homePath = KGlobal::dirs()->localkdedir();
+ kdDebug() << "WizardDialog: KDE homedir: " << homePath << endl;
+ QString dataPath;
+ if (dirs[0].left(homePath.length()) != homePath) /* global data path */
+ dataPath = dirs[0];
+ else
+ dataPath = dirs[1];
+
+ if (m_useMMSHelper->isChecked())
+ {
+ process << "cp" << dataPath + "mms.protocol" << locateLocal("services", "mms.protocol");
+ kdDebug() << "WizardDialog: cp " << dataPath + "mms.protocol" << " " << locateLocal("services", "mms.protocol") << endl;
+ process.start(KProcess::Block);
+ process.clearArguments();
+ }
+
+ if (m_useRTSPHelper->isChecked())
+ {
+ process << "cp" << dataPath + "rtsp.protocol" << locateLocal("services", "rtsp.protocol");
+ kdDebug() << "WizardDialog: cp " << dataPath + "rtsp.protocol" << " " << locateLocal("services", "rtsp.protocol") << endl;
+ process.start(KProcess::Block);
+ process.clearArguments();
+ }
+
+ //dirs = KGlobal::dirs()->findDirs("apps", "Multimedia");
+ dirs = KGlobal::dirs()->findDirs("xdgdata-apps", "kde");
+ if (!dirs.isEmpty())
+ dataPath = dirs[0];
+ else
+ kdError() << "WizardDialog: Applications path not found!" << endl;
+
+ if (m_createDesktopIcon->isChecked())
+ {
+ process << "cp" << dataPath + "kaffeine.desktop" << QDir::homeDirPath() + "/Desktop/kaffeine.desktop";
+ kdDebug() << "WizardDialog: cp " << dataPath + "kaffeine.desktop" << " " << QDir::homeDirPath() + "/Desktop/kaffeine.desktop" << endl;
+ process.start(KProcess::Block);
+ process.clearArguments();
+ }
+ }
+}
+
+void InstWizard::slotStdout(KProcess *, char *buffer, int buflen)
+{
+ QString output = QString::fromLatin1(buffer, buflen);
+ kdDebug() << "WizardDialog: got from hdparm: " << output << "\n";
+ stdout.append(output);
+}
diff --git a/kaffeine/src/instwizard.h b/kaffeine/src/instwizard.h
new file mode 100644
index 0000000..bf44d24
--- /dev/null
+++ b/kaffeine/src/instwizard.h
@@ -0,0 +1,56 @@
+/*
+ * instwizard.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef INSTWIZARD_H
+#define INSTWIZARD_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kwizard.h>
+
+class KProcess;
+
+class InstWizard : private KWizard
+{
+ Q_OBJECT
+public:
+ static void showWizard()
+ {
+ InstWizard().internalWizard();
+ }
+
+private:
+ InstWizard() { }
+ ~InstWizard() { }
+
+ void internalWizard();
+
+ QString stdout;
+
+ InstWizard(const InstWizard &);
+ InstWizard operator=(const InstWizard &);
+
+private slots:
+ void slotStdout(KProcess *, char *, int);
+};
+
+#endif /* INSTWIZARD_H */
diff --git a/kaffeine/src/kaffeine.cpp b/kaffeine/src/kaffeine.cpp
new file mode 100644
index 0000000..1aa2d79
--- /dev/null
+++ b/kaffeine/src/kaffeine.cpp
@@ -0,0 +1,1913 @@
+/*
+ * kaffeine.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2005-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "kaffeine.h"
+
+#include <dcopref.h>
+#include <kkeydialog.h>
+#include <kfiledialog.h>
+#include <kdirselectdialog.h>
+#include <kconfig.h>
+#include <kurl.h>
+#include <kedittoolbar.h>
+#include <kaction.h>
+#include <kaccel.h>
+#include <kstdaction.h>
+#include <klibloader.h>
+#include <kparts/componentfactory.h>
+#include <kmessagebox.h>
+#include <kstatusbar.h>
+#include <kmenubar.h>
+#include <kcombobox.h>
+#include <kpopupmenu.h>
+#include <ktabbar.h>
+#include <kwin.h>
+#include <ktrader.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kprocess.h>
+#include <kstandarddirs.h>
+#include <kio/netaccess.h>
+#include <kaboutdata.h>
+#include <kiconloader.h>
+#include <kinputdialog.h>
+#include <kcmdlineargs.h>
+#include <dcopclient.h>
+#include <kapplication.h>
+#include <kdeversion.h>
+
+#include <qdir.h>
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qinputdialog.h>
+#include <kurldrag.h>
+#include <qsignalmapper.h>
+#include <qdockarea.h>
+
+#include "kaffeine.moc"
+#include "kaffeinepart.h"
+#include "playlist.h"
+#include "pref.h"
+#include "startwindow.h"
+#include "systemtray.h"
+#include "instwizard.h"
+#include "version.h"
+#include "kaffeineinput.h"
+#ifdef HAVE_DVB
+#include "dvbpanel.h"
+#endif
+#include "cdwidget.h"
+#include "inputmanager.h"
+#include "kmultitabbar.h"
+#include "disc.h"
+
+#define DEFAULT_FILTER "*.anx *.axa *.axv *.vob *.png *.y4m *.rm *.ram *.rmvb *.pva *.nsv *.ogg *.ogm *.spx *.png *.mng *.pes *.iff *.svx *.8svx *.16sv *.ilbm *.pic *.anim *.wav *.vox *.voc *.snd *.au *.ra *.nsf *.flac *.aif *.aiff *.aud *.flv *.fli *.flc *.avi *.asf *.wmv *.wma *.asx *.wvx *.wax *.mkv *.vmd *.4xm *.mjpg *.cpk *.cak *.film *.str *.iki *.ik2 *.dps *.dat *.xa *.xa1 *.xa2 *.xas *.xap *.roq *.mve *.vqa *.mve *.mv8 *.cin *.wve *.mov *.qt *.mp4 *.ts *.m2t *.trp *.mpg *.mpeg *.dv *.dif *.flac *.mp3 *.mp2 *.mpa *.mpega *.ac3 *.aac *.asc *. *.sub *.srt *.smi *.ssa *.mpv *.m4a *.m4v *.mpc *.mp+ *.iso *.ANX *.AXA *.AXV *.VOB *.PNG *.Y4M *.RM *.RAM *.RMVB *.PVA *.NSV *.OGG *.OGM *.SPX *.PNG *.MNG *.PES *.IFF *.SVX *.8SVX *.16SV *.ILBM *.PIC *.ANIM *.WAV *.VOX *.VOC *.SND *.AU *.RA *.NSF *.FLAC *.AIF *.AIFF *.AUD *.FLV *.FLI *.FLC *.AVI *.ASF *.WMV *.WMA *.ASX *.WVX *.WAX *.MKV *.VMD *.4XM *.MJPG *.CPK *.CAK *.FILM *.STR *.IKI *.IK2 *.DPS *.DAT *.XA *.XA1 *.XA2 *.XAS *.XAP *.ROQ *.MVE *.VQA *.MVE *.MV8 *.CIN *.WVE *.MOV *.QT *.MP4 *.TS *.M2T *.TRP *.MPG *.MPEG *.DV *.DIF *.FLAC *.MP3 *.MP2 *.MPA *.MPEGA *.AC3 *.AAC *.ASC *. *.SUB *.SRT *.SMI *.SSA *.MPV *.M4A *.M4V *.MPC *.MP+ *.ISO"
+
+#define DEFAULT_PLAYER_PART "xine_part"
+
+#include <X11/Xlib.h>
+
+#ifdef HAVE_DPMS
+#include <X11/extensions/dpms.h>
+#endif
+
+#ifdef HAVE_XTEST
+#include <X11/keysym.h>
+#include <X11/extensions/XTest.h>
+#endif
+
+const KCmdLineOptions cmdLineOptions[] = {
+ { "p", 0, 0 },
+ { "play", I18N_NOOP("Start playing immediately"), 0 },
+ { "f", 0, 0 },
+ { "fullscreen", I18N_NOOP("Start in fullscreen mode"), 0 },
+ { "m", 0, 0 },
+ { "minimal", I18N_NOOP("Start in minimal mode"), 0 },
+ { "a", 0, 0 },
+ { "audiodriver <argument>", I18N_NOOP("Set audio driver"), "default" },
+ { "x", 0, 0 },
+ { "videodriver <argument>", I18N_NOOP("Set video driver"), "default" },
+ { "d", 0, 0 },
+ { "device <argument>", I18N_NOOP("Set Audio-CD/VCD/DVD device path."), "default" },
+ { "verbose", I18N_NOOP("Output xine debug messages"), 0 },
+ { "w", 0, 0 },
+ { "wizard", I18N_NOOP("Run installation wizard"), 0 },
+ { "tempfile", I18N_NOOP("tempfile to delete after use"), 0 },
+ { "+[file]", I18N_NOOP("File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', 'AudioCD', 'DVB'."), 0 },
+ KCmdLineLastOption
+};
+
+
+Kaffeine::Kaffeine() : DCOPObject("KaffeineIface"),
+ m_mediaPart(NULL), m_playerContainer(NULL),
+ m_systemTray(NULL), m_videoSize(0,0), m_noResize(false), m_autoPaused(false)
+{
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ if (args->getOption("audiodriver") != "default")
+ m_engineParameters.append("audioDriver=\"" + args->getOption("audiodriver") + "\"");
+ if (args->getOption("videodriver") != "default")
+ m_engineParameters.append("videoDriver=\"" + args->getOption("videodriver") + "\"");
+ if (args->isSet("verbose"))
+ m_engineParameters.append("verbose=\"True\"");
+
+ setAcceptDrops(true);
+
+#ifdef HAVE_DVB
+ // dvb
+ if ( DVBconfig::haveDvbDevice() )
+ {
+ kdDebug() << "Found DVB device." << endl;
+ dvbPanel = new DvbPanel( 0, this, "dvbpanel" );
+ }
+ else
+ {
+ kdDebug() << "No DVB device found." << endl;
+ dvbPanel = 0;
+ }
+#endif
+
+ setupActions();
+ setStandardToolBarMenuEnabled(true);
+ //createStandardStatusBarAction();
+ createGUI("kaffeineui.rc");
+
+ //statusBar()->insertItem(i18n("Entries: %1, Playtime: %2 (Total: %3, %4)").arg("0").arg("00:00:00").arg("0").arg("00:00:00"), 9, 0, true);
+ //statusBar()->insertItem(i18n("Entries: %1, Playtime: %2").arg("0").arg("0:00:00"), 9, 0, true);
+ //statusBar()->insertItem(i18n("No player"), 10, 0, true);
+
+ QString stamp = locate("appdata", "wizard_stamp_v0.7.1");
+ QString localStamp = locateLocal("appdata", "wizard_stamp_v0.7.1");
+ if ((!QFile::exists(stamp)) || args->isSet("wizard"))
+ {
+ InstWizard::showWizard();
+
+ KProcess process;
+ process << "touch" << localStamp;
+ process.start(KProcess::Block, KProcess::Stderr);
+ process.clearArguments();
+ }
+
+ mainbox = new QHBox( this );
+ mainbox->setMouseTracking( true );
+ setCentralWidget(mainbox);
+ KMultiTabBar *mtBar = new KMultiTabBar( KMultiTabBar::Vertical, mainbox );
+ mtBar->setPosition( KMultiTabBar::Left );
+ mtBar->setStyle( KMultiTabBar::VSNET );
+ QWidgetStack *stack = new QWidgetStack( mainbox );
+ stack->setMouseTracking( true );
+ inplug = new InputManager( this, stack, mtBar );
+
+ m_startWindow = new StartWindow( stack );
+ inplug->addStartWindow( m_startWindow, KGlobal::iconLoader()->loadIcon("kmenu", KIcon::Small), i18n("Start") );
+
+ playerWidget = new QVBox( stack );
+ playerWidget->setMouseTracking( true );
+ inplug->addPlayerWidget( playerWidget, KGlobal::iconLoader()->loadIcon("kaffeine", KIcon::Small), i18n("Player Window") );
+
+ // playlist
+ m_playlist = new PlayList( stack, this );
+ inplug->add( m_playlist, KGlobal::iconLoader()->loadIcon("view_text", KIcon::Small), i18n( "Playlist") );
+ m_playlist->setFileFilter(DEFAULT_FILTER);
+ guiFactory()->addClient( m_playlist );
+
+ cddisc = new Disc( stack, this );
+ inplug->add( cddisc, KGlobal::iconLoader()->loadIcon("cdrom_unmount", KIcon::Small), i18n( "Audio CD") );
+ guiFactory()->addClient( cddisc );
+
+ connect(m_playlist, SIGNAL(signalRequestForDVD(const QString&)), cddisc, SLOT(startDVD(const QString&)));
+ connect(m_playlist, SIGNAL(signalRequestForVCD(const QString&)), cddisc, SLOT(startVCD(const QString&)));
+ connect(m_playlist, SIGNAL(signalRequestForAudioCD(const QString&)), cddisc, SLOT(startCD(const QString&)));
+
+#ifdef HAVE_DVB
+ if ( dvbPanel )
+ {
+ inplug->add( dvbPanel, KGlobal::iconLoader()->loadIcon("tv", KIcon::Small), i18n( "Digital TV") );
+ guiFactory()->addClient( dvbPanel );
+ dvbPanel->checkFirstRun();
+ }
+#endif
+
+ QTextStream ts(&m_filter, IO_WriteOnly);
+ ts << "|" << i18n("Supported Media Formats") << "\n"
+ << "*.mp3 *.mpa *mpega *.m4a *.mpc *.mp+ *.MP3 *.MPA *.MPEGA *.M4A *.MPC *.MP+|" << i18n("MPEG Audio Files") << "\n"
+ << "*.mjpeg *.mpg *.mpeg *.mp2 *.mpv *.vob *.MJPEG *.MPG *.MPEG *.MP2 *.MPV *.VOB|" << i18n("MPEG Video Files") << "\n"
+ << "*.ogg *.ogm *.OGG *.OGM|" << i18n("Ogg Vorbis Files") << "\n"
+ << "*.avi *.AVI|" << i18n("AVI Files") << "\n"
+ << "*.mov *.qt *.MOV *.QT|" << i18n("Quicktime Files") << "\n"
+ << "*.rm *.ram *.ra *.rmvb *.RM *.RAM *.RA *.RMVB|" << i18n("Real Media Files") << "\n"
+ << "*.mkv *.mka *.MKV *.MKA|" << i18n("Matroska Files") << "\n"
+ << "*.flac *.flc *.FLAC *.FLC|" << i18n("FLAC Files") << "\n"
+ << "*.wmv *.wma *.asf *.asx *.wvx *.wax *.WMV *.WMA *.ASF *.ASX *.WVX *.WAX|" << i18n("Windows Media Files") << "\n"
+ << "*.wav *.WAV|" << i18n("WAV Files") << "\n"
+ << "*.m3u *.M3U *.m4u *.M4U|" << i18n("M3U Playlists") << "\n"
+ << "*.pls *.PLS|" << i18n("PLS Playlists") << "\n"
+ << "*.kaffeine *.KAFFEINE|" << i18n("Kaffeine Playlists") << "\n"
+ << "*.iso *.ISO|" << i18n("DVD ISO IMAGE") << "\n"
+ << "*.*|" << i18n("All Files");
+
+#ifdef HAVE_XTEST
+ haveXTest = false;
+
+ int dummy_event, dummy_error, dummy_major, dummy_minor;
+ if (XTestQueryExtension(x11Display(), &dummy_event, &dummy_error, &dummy_major, &dummy_minor)) {
+ fakeKeycode = XKeysymToKeycode(x11Display(), XK_Shift_L);
+ if (fakeKeycode != 0)
+ haveXTest = true;
+ }
+#endif
+
+ /** KWin are you there? **/
+
+ m_haveKWin = KApplication::dcopClient()->isApplicationRegistered("kwin");
+ if (m_haveKWin)
+ kdDebug() << "Window manager: KWin found" << endl;
+ else
+ kdDebug() << "Window manager: not KWin - using save fullscreen mode" << endl;
+
+ connect(&m_screensaverTimer, SIGNAL(timeout()), this, SLOT(slotFakeKeyEvent()));
+ m_screensaverTimer.start( 55000 );
+
+ connect( &m_numKeyHideTimer, SIGNAL(timeout()), this, SLOT(slotRequestForTrackNumber()) );
+
+ KAccel* accel = new KAccel(this);
+ accel->insert("Escape Fullscreen", Key_Escape, this, SLOT(slotEscapeFullscreen()));
+
+ loadConfig();
+ //slotChangeStatusbar(i18n("Kaffeine Player") + " " + KAFFEINE_VERSION);
+
+ updateArgs();
+}
+
+Kaffeine::~Kaffeine()
+{
+ kdDebug() << "Kaffeine: destructor" << endl;
+ delete m_playlist;
+}
+
+void Kaffeine::updateArgs()
+{
+ KCmdLineArgs *args = KCmdLineArgs::parsedArgs();
+
+ QString device = args->getOption("device");
+ if (device != "default") {
+ if (device.startsWith("system:/media/"))
+ device = device.right(14).prepend("media:/");
+ KURL devicePath(device);
+ DCOPRef mediamanager("kded", "mediamanager");
+ DCOPReply reply = mediamanager.call("properties(QString)", devicePath.path(-1).right(1));
+ if (reply.isValid()) {
+ QStringList properties = reply;
+ device = properties[5];
+ kdDebug() << "DEVICE: " << device << "\n";
+ } else
+ device = QString();
+ } else
+ device = QString();
+ m_device = device;
+
+ QStringList urls;
+ for (int i = 0; i < args->count(); i++ ) {
+ QDir path;
+ QString url = QFile::decodeName(args->arg(i));
+ if ((url.left(1) != "/") && (!url.contains("://")) && (url.lower() != "dvd") && (url.lower() != "vcd")
+ && (url.lower() != "audiocd") && (url.lower() != "cdda") && (url.lower() != "dvb")) {
+#if KDE_IS_VERSION(3,5,0)
+ KURL u = KIO::NetAccess::mostLocalURL(args->url(i), 0);
+ if (u.isLocalFile())
+ url = path.absFilePath(u.path());
+ else
+ url = u.url();
+#else
+ url = path.absFilePath(url);
+#endif
+ }
+ urls.append(KURL::fromPathOrURL(url).url());
+ }
+ loadTMP(urls);
+
+ if (args->isSet("fullscreen"))
+ fullscreen();
+
+ if (args->isSet("minimal"))
+ minimal();
+
+ if (args->isSet("play") && urls.empty())
+ slotPlaylistPlay();
+ if (args->isSet("tempfile") )
+ fprintf(stderr,"TEMPFILE OPTION PASSED: %s\n", urls[0].ascii() );
+
+ show();
+ KWin::activateWindow(winId());
+}
+
+void Kaffeine::unloadCurrentPart()
+{
+#ifdef HAVE_DVB
+ if ( dvbPanel )
+ {
+ dvbPanel->stopLive();
+ dvbPanel->enableLiveDvb( false );
+ }
+#endif
+ if ( dvbClient )
+ {
+ dvbClient->stopLive();
+ dvbClient->enableLive( false );
+ }
+
+ if (!m_currentPartService.isNull())
+ {
+ kdDebug() << "Kaffeine: Unloading player part: " << m_currentPartService << endl;
+ if (m_mediaPart) {
+ saveMainWindowSettings(kapp->config(), "Main Window"); // save toolbar state etc.
+ guiFactory()->removeClient(m_mediaPart);
+ }
+ KService::Ptr service = KService::serviceByDesktopName(m_currentPartService);
+ KLibLoader::self()->unloadLibrary(service->library().ascii());
+ m_mediaPart = NULL;
+
+ delete m_playerContainer;
+ m_playerContainer = NULL;
+ inplug->setPlayerContainer( m_playerContainer );
+ //statusBar()->changeItem(i18n("No layer"), 10);
+ }
+}
+
+void Kaffeine::slotLoadPart(const QString& desktopName)
+{
+ kdDebug() << "Kaffeine:: Try to load service: " << desktopName << endl;
+
+ if (desktopName == m_currentPartService && m_mediaPart != NULL)
+ return;
+
+ KService::Ptr service = KService::serviceByDesktopName(desktopName);
+ if (!service)
+ {
+ KMessageBox::detailedError(this, i18n("Loading of player part '%1' failed.").arg(desktopName), i18n("%1 not found in search path.").arg(QString(desktopName)+ ".desktop"));
+ return;
+ }
+
+ //save state
+ bool isPlaying = false;
+ if (m_mediaPart)
+ isPlaying = m_mediaPart->isPlaying();
+
+ unloadCurrentPart();
+
+ //player container widget, will contain the player part
+ m_playerContainer = new PlayerContainer(playerWidget);
+ connect(m_playerContainer, SIGNAL(signalURLDropEvent(const QStringList&)), this, SLOT(slotLoadURLS(const QStringList&)));
+
+ if (service->serviceTypes().contains("KaffeinePart")) {
+ kdDebug() << "This is a KaffeinePart..." << endl;
+ int error = 0;
+ m_mediaPart = KParts::ComponentFactory::createPartInstanceFromService<KaffeinePart>(service, m_playerContainer, service->name().ascii(), this, 0, m_engineParameters, &error);
+ if (error > 0) {
+ KMessageBox::detailedError(this, i18n("Loading of player part '%1' failed.").arg(service->name()), KLibLoader::self()->lastErrorMessage());
+ }
+ else {
+ connect(m_mediaPart, SIGNAL(setWindowCaption(const QString&)), this, SLOT(slotChangeCaption(const QString&)));
+ //connect(m_mediaPart, SIGNAL(setStatusBarText(const QString&)), this, SLOT(slotChangeStatusbar(const QString&)));
+ connect(m_mediaPart, SIGNAL(canceled(const QString&)), this, SLOT(slotLoadingCanceled(const QString&)));
+ connect(m_mediaPart, SIGNAL(signalPlaybackFailed()), this, SLOT(slotPlaybackFailed()));
+ connect(m_mediaPart, SIGNAL(signalTrackFinished()), this, SLOT(slotNext()));
+ connect(m_mediaPart, SIGNAL(signalNewMeta(const MRL &)), this, SLOT(slotMetaFromPlayer(const MRL &)));
+ connect(m_mediaPart, SIGNAL(signalNewFrameSize(const QSize&)), this, SLOT(slotNewFrameSize(const QSize&)));
+ connect(m_mediaPart, SIGNAL(signalRequestCurrentTrack()), this, SLOT(slotRequestForCurrentTrack()));
+ connect(m_mediaPart, SIGNAL(signalRequestNextTrack()), this, SLOT(slotRequestForNextTrack()));
+ connect(m_mediaPart, SIGNAL(signalRequestPreviousTrack()), this, SLOT(slotRequestForPreviousTrack()));
+ connect(m_mediaPart, SIGNAL(signalToggleMinimalMode()), this, SLOT(slotToggleMinimalModeFromPlayer()));
+ if ( service->library()=="libxinepart" )
+ connect( this, SIGNAL(showOSD(const QString&,int,int)), m_mediaPart, SLOT(requestForOSD(const QString&,int,int)) );
+#ifdef HAVE_DVB
+ if ( service->library()=="libxinepart" && dvbPanel ) {
+
+ connect( dvbPanel, SIGNAL(dvbPause(bool)), m_mediaPart, SLOT(slotTogglePause(bool)) );
+ connect( dvbPanel, SIGNAL(dvbOpen(const QString&,const QString&,int)), m_mediaPart, SLOT(slotDvbOpen(const QString&,const QString&,int)) );
+ connect( dvbPanel, SIGNAL(dvbStop()), m_mediaPart, SLOT(slotStop()) );
+ connect( m_mediaPart, SIGNAL(stopDvb()), dvbPanel, SLOT(stopLive()) );
+ connect( m_mediaPart, SIGNAL(playerPause()), dvbPanel, SLOT(pauseLiveTV()) );
+ connect( dvbPanel, SIGNAL(setTimeShiftFilename(const QString&)), m_mediaPart, SLOT(getTimeShiftFilename(const QString&)) );
+ connect( dvbPanel, SIGNAL(showOSD(const QString&,int,int)), m_mediaPart, SLOT(requestForOSD(const QString&,int,int)) );
+ connect( dvbPanel, SIGNAL(showDvbOSD(const QString&, const QStringList&)), m_mediaPart, SLOT(setDvbCurrentNext(const QString&, const QStringList&)) );
+ connect( m_mediaPart, SIGNAL(dvbOSDHide()), dvbPanel, SLOT(dvbOSDHide()));
+ dvbPanel->enableLiveDvb( true );
+ }
+#endif
+ if ( service->library()=="libxinepart" && dvbClient ) {
+ connect( dvbClient, SIGNAL(dvbOpen(const QString&,const QString&,int)), m_mediaPart, SLOT(slotDvbOpen(const QString&,const QString&,int)) );
+ connect( m_mediaPart, SIGNAL(stopDvb()), dvbClient, SLOT(stopLive()) );
+ connect( dvbClient, SIGNAL(dvbStop()), m_mediaPart, SLOT(slotStop()) );
+ connect( m_mediaPart, SIGNAL(playerPause()), dvbClient, SLOT(pauseLiveTV()) );
+ connect( dvbClient, SIGNAL(setTimeShiftFilename(const QString&)), m_mediaPart, SLOT(getTimeShiftFilename(const QString&)) );
+ dvbClient->enableLive( true );
+ }
+ m_currentPartService = desktopName;
+ m_playlist->setFileFilter(DEFAULT_FILTER);
+ //QString playerName = service->name();
+ QString playerName = m_mediaPart->instance()->aboutData()->programName();
+ if (playerName.length() > 20) {
+ playerName.truncate(17);
+ playerName = playerName + "...";
+ }
+ //statusBar()->changeItem(playerName, 10);
+ //slotChangeStatusbar(m_mediaPart->instance()->aboutData()->shortDescription());
+ guiFactory()->addClient(m_mediaPart);
+ applyMainWindowSettings(kapp->config(), "Main Window"); //restore toolbar state
+ stateChanged("no_media_part", StateReverse);
+ if (isPlaying)
+ slotPlaylistPlay();
+ }
+ }
+ inplug->setPlayerContainer( m_playerContainer );
+ m_playerContainer->show();
+}
+
+void Kaffeine::slotLoadingCanceled(const QString& message)
+{
+ QString name;
+ if (m_mediaPart)
+ {
+ name = m_mediaPart->name();
+ delete m_mediaPart;
+ m_mediaPart = NULL;
+ }
+ KMessageBox::detailedError(this, i18n("Loading of player part '%1' failed.").arg(name), message);
+}
+
+void Kaffeine::slotPlaybackFailed()
+{
+ /*
+ * TODO: ask user for loading another part?
+ */
+ //slotNext();
+ m_mediaPart->closeURL();
+}
+
+void Kaffeine::load(const QString& url)
+{
+ load(QStringList(url));
+}
+
+void Kaffeine::load(const QStringList& urllist)
+{
+ if (!urllist.count())
+ return;
+
+ if (urllist[0].contains(".kaffeine", false))
+ {
+ m_playlist->loadPlaylist(urllist[0]);
+ }
+ else
+ {
+ m_playlist->add(urllist, NULL);
+ QListViewItem* tmp = m_playlist->findByURL(urllist.first());
+ if (tmp)
+ {
+ m_playlist->setCurrentEntry(tmp);
+ slotPlaylistPlay();
+ }
+ }
+}
+
+void Kaffeine::slotLoadURLS(const QStringList& list)
+{
+ loadTMP(list);
+}
+
+void Kaffeine::slotPlay(const MRL& mrl)
+{
+ if (m_mediaPart)
+ {
+ m_mediaPart->openURL(mrl);
+ if ( !mrl.mime().contains("audio") )
+ QTimer::singleShot(300, this, SLOT(slotSwitchToPlayerWindow()));
+ }
+}
+
+void Kaffeine::slotPlayUnPause()
+{
+ if (m_mediaPart)
+ if (m_mediaPart->isPaused() || m_mediaPart->isPlaying())
+ m_mediaPart->slotTogglePause();
+ else
+ slotRequestForCurrentTrack();
+}
+
+void Kaffeine::slotPlaylistPlay()
+{
+ MRL mrl = m_playlist->getCurrent();
+ if (!mrl.isEmpty())
+ {
+ m_recent->addURL(mrl.kurl());
+ slotPlay(mrl);
+ }
+}
+
+void Kaffeine::slotNext()
+{
+ MRL mrl;
+ if ( inplug->playbackFinished( mrl ) ) {
+ if (m_sleepAfterPlay->isChecked())
+ {
+ stop();
+ slotSleepAfterPlay();// Shut screen off
+ return;
+ }
+ if (m_quitAfterPlay->isChecked())
+ {
+ stop();
+ slotQuitAfterPlay();
+ return;
+ }
+ m_recent->addURL(mrl.kurl());
+ slotPlay(mrl);
+ }
+ else
+ {
+ if ((m_mediaPart) && (!m_mediaPart->isPlaying())) // playback finished, nothing more to play
+ {
+ m_mediaPart->closeURL();
+ if (m_sleepAfterPlay->isChecked())
+ {
+ slotSleepAfterPlay();// Shut screen off
+ return;
+ }
+ if (m_quitAfterPlay->isChecked() || m_quitAfterPlaylist->isChecked())
+ {
+ slotQuitAfterPlay();
+ return;
+ }
+ }
+ }
+}
+
+void Kaffeine::slotRequestForCurrentTrack()
+{
+ inplug->playCurrentTrack();
+}
+
+void Kaffeine::slotRequestForNextTrack()
+{
+ inplug->playNextTrack();
+}
+
+void Kaffeine::slotRequestForPreviousTrack()
+{
+ inplug->playPreviousTrack();
+}
+
+void Kaffeine::slotNumKeyInput( int n )
+{
+ if ( inplug->visibleWidget()==m_startWindow ) {
+ m_startWindow->execTarget( n-10 );
+ return;
+ }
+
+ QString s;
+
+ if ( m_numKeyHideTimer.isActive() ) {
+ m_numKeyHideTimer.stop();
+ m_numKey*=10;
+ m_numKey+=( n-10 );
+ }
+ else {
+ if ( n==10 ) {
+#ifdef HAVE_DVB
+ if ( dvbPanel )
+ dvbPanel->recallZap();
+#endif
+ return;
+ }
+ m_captionCache = caption();
+ m_numKey = n-10;
+ }
+ if (m_numKey > (INT_MAX/10)) // Integer Overflow
+ m_numKey = n-10;
+ s = s.setNum( m_numKey )+"_";
+ emit showOSD( s, 1000, 3 );
+ setCaption(s);
+ m_numKeyHideTimer.start( 1000, true );
+}
+
+void Kaffeine::slotRequestForTrackNumber()
+{
+ setCaption(m_captionCache);
+ if (m_mediaPart != NULL && m_mediaPart->hasChapters())
+ m_mediaPart->setDVDChapter((uint)m_numKey);
+ else
+ inplug->playTrackNumber( m_numKey );
+
+ m_numKey = 0;
+}
+
+void Kaffeine::slotPlayRecent(const KURL& kurl)
+{
+ slotPlay(MRL(kurl));
+}
+
+void Kaffeine::slotMetaFromPlayer(const MRL &mrl)
+{
+ inplug->mergeMeta(mrl);
+}
+
+/*
+void Kaffeine::dragEnterEvent(QDragEnterEvent *dev)
+{
+ kdDebug() << "Kaffeine: drag enter even" << endl;
+ dev->accept(QUriDrag::canDecode(dev) || QTextDrag::canDecode(dev));
+}
+
+void Kaffeine::dropEvent(QDropEvent* dev)
+{
+ QStringList urls;
+
+ if (QUriDrag::decodeToUnicodeUris(dev, urls))
+ {
+ kdDebug() << "Kaffeine: " << urls.count() << " urls dropped..." << endl;
+ load(urls);
+ }
+ else
+ if (strcmp(dev->format(), "text/x-moz-url") == 0) // for mozilla drops
+ {
+ QByteArray data = dev->encodedData("text/plain");
+ QString md(data);
+ load(md);
+ }
+}
+*/
+
+void Kaffeine::setupActions()
+{
+ /* file menu */
+ KStdAction::open(this, SLOT(slotOpenFile()), actionCollection(), "file_open");
+ new KAction(i18n("Open &URL..."), "www", CTRL|Key_U, this, SLOT(slotOpenURL()), actionCollection(), "file_open_url");
+ new KAction(i18n("Open D&irectory..."), "folder_video", 0, this, SLOT(slotOpenDirectory()), actionCollection(), "file_open_directory");
+ m_recent = KStdAction::openRecent(this, SLOT(slotPlayRecent(const KURL&)), actionCollection(), "file_open_recent");
+ m_sleepAfterPlay = new KToggleAction(i18n("Quit && Shutoff Monitor After This Track"), 0, 0, this, SLOT(slotSleepAfterPlayMenu()), actionCollection(), "sleep_after_play");
+ m_quitAfterPlay = new KToggleAction(i18n("Quit After This Track"), 0, 0, this, SLOT(slotQuitAfterPlayMenu()), actionCollection(), "quit_after_play");
+ m_quitAfterPlaylist = new KToggleAction(i18n("Quit After Playlist"), 0, 0, this, SLOT(slotQuitAfterPlaylistMenu()), actionCollection(), "quit_after_playlist");
+ KStdAction::quit(this, SLOT(slotQuit()), actionCollection());
+
+ /*view menu */
+ m_fullscreen = KStdAction::fullScreen(this, SLOT(slotToggleFullscreen()), actionCollection(), this, "view_fullscreen");
+ m_minimal = new KToggleAction(i18n("&Minimal Mode"), 0, Key_M, this, SLOT(slotToggleMinimalMode()), actionCollection(), "view_minimal");
+ new KAction(i18n("Toggle &Playlist/Player"), 0, Key_P, this, SLOT(slotTogglePlaylist()), actionCollection(), "view_toggle_tab");
+ m_originalAspect = new KToggleAction(i18n("Keep &Original Aspect"), 0, 0, this, SLOT(slotOriginalAspect()), actionCollection(), "view_original_aspect");
+ m_autoResizeOff = new KToggleAction(i18n("Off"), 0, ALT|Key_0, this, SLOT(slotAutoresizeOff()), actionCollection(), "view_auto_resize_off");
+ m_autoResizeOriginal = new KToggleAction(i18n("Original Size"), 0, ALT|Key_1, this, SLOT(slotAutoresizeOriginal()), actionCollection(), "view_auto_resize_original");
+ m_autoResizeDouble = new KToggleAction(i18n("Double Size"), 0, ALT|Key_2, this, SLOT(slotAutoresizeDouble()), actionCollection(), "view_auto_resize_double");
+ m_autoResizeTriple = new KToggleAction(i18n("Triple Size"), 0, ALT|Key_3, this, SLOT(slotAutoresizeTriple()), actionCollection(), "view_auto_resize_triple");
+
+ m_playersMenu = new KActionMenu(i18n("&Player Engine"), actionCollection(), "options_player");
+ KStdAction::keyBindings(this, SLOT(optionsConfigureKeys()), actionCollection());
+ KStdAction::configureToolbars(this, SLOT(optionsConfigureToolbars()), actionCollection());
+ KStdAction::preferences(this, SLOT(slotPreferences()), actionCollection(), "options_preferences");
+
+ /* fill players action menu */
+ QSignalMapper* mapper = new QSignalMapper(this);
+ connect(mapper, SIGNAL(mapped(const QString&)), this, SLOT(slotLoadPart(const QString&)));
+ KAction* action = NULL;
+ QStringList mediaParts;
+
+ // check for kaffeine parts
+ KTrader::OfferList offers = KTrader::self()->query("application/x-mplayer2", "'KaffeinePart' in ServiceTypes");
+ KTrader::OfferList::Iterator end(offers.end());
+ for(KTrader::OfferList::Iterator it = offers.begin(); it != end; ++it)
+ {
+ KService::Ptr ptr = (*it);
+
+ action = new KAction(ptr->name(), ptr->icon(), 0, mapper, SLOT(map()), actionCollection());
+ if (!ptr->comment().isNull())
+ action->setToolTip(ptr->comment());
+ mapper->setMapping(action, ptr->desktopEntryName());
+ m_playersMenu->insert(action);
+ mediaParts.append(ptr->name());
+ }
+
+ QAccel *acn = new QAccel( this );
+ acn->insertItem( Key_0, 10 );
+ acn->insertItem( Key_1, 11 );
+ acn->insertItem( Key_2, 12 );
+ acn->insertItem( Key_3, 13 );
+ acn->insertItem( Key_4, 14 );
+ acn->insertItem( Key_5, 15 );
+ acn->insertItem( Key_6, 16 );
+ acn->insertItem( Key_7, 17 );
+ acn->insertItem( Key_8, 18 );
+ acn->insertItem( Key_9, 19 );
+ connect( acn, SIGNAL(activated(int)), this, SLOT(slotNumKeyInput(int)) );
+}
+
+void Kaffeine::slotDVBNextBack(int dir)
+{
+#ifdef HAVE_DVB
+ if ( !dvbPanel )
+ return;
+ switch (dir) {
+ case 0:
+ dvbPanel->dvbOSDPrev();
+ break;
+ case 1:
+ dvbPanel->dvbOSDNext();
+ break;
+ case 2:
+ dvbPanel->dvbOSDZap();
+ break;
+ case 3:
+ dvbPanel->dvbOSDRetreat();
+ break;
+ case 4:
+ dvbPanel->dvbOSDAdvance();
+ break;
+ default:
+ fprintf(stderr, "Bad slotDVBNextBack param. Ignored.\n");
+ }
+#endif
+}
+
+void Kaffeine::loadConfig()
+{
+ KConfig* config = kapp->config();
+ bool b;
+
+ config->setGroup("General Options");
+
+ m_autoResizeFactor = config->readNumEntry("Autoresize Factor", 0);
+ switch (m_autoResizeFactor)
+ {
+ case 0:
+ m_autoResizeOff->setChecked(true);
+ break;
+ case 1:
+ m_autoResizeOriginal->setChecked(true);
+ break;
+ case 2:
+ m_autoResizeDouble->setChecked(true);
+ break;
+ case 3:
+ m_autoResizeTriple->setChecked(true);
+ break;
+ }
+
+ b = config->readBoolEntry("Original Aspect", false);
+ m_originalAspect->setChecked(b);
+
+ m_embedSystemTray = config->readBoolEntry("Embed in System Tray", false);
+ if (m_embedSystemTray)
+ slotSystemTray(m_embedSystemTray);
+ m_osdDuration = config->readNumEntry("OSD Duration", 5);
+
+ m_useAlternateEncoding = config->readBoolEntry("Use Alternate Encoding", false);
+ slotUseAlternateEncoding(m_useAlternateEncoding);
+
+ m_alternateEncoding = config->readEntry("Alternate Encoding Name", "ISO 8859-1");
+ slotAlternateEncoding(m_alternateEncoding);
+
+ m_pauseVideo = config->readBoolEntry("PauseHiddenVideo", true);
+ m_dvbClientEnabled = config->readBoolEntry("DvbClientEnabled", false);
+ m_dvbClientAddress = config->readEntry("DvbClientAddress", "192.168.0.255");
+ m_dvbClientPort = config->readNumEntry("DvbClientPort", 1234);
+ m_dvbClientInfo = config->readNumEntry("DvbClientInfo", 1235);
+ m_dvbClientShiftPath = config->readEntry("DvbClientShiftPath", QDir::homeDirPath() );
+
+ if ( m_dvbClientEnabled )
+ {
+ dvbClient = new CdWidget( m_dvbClientAddress, m_dvbClientPort, m_dvbClientInfo, m_dvbClientShiftPath, this, this, "cdwidget");
+ inplug->add( dvbClient, KGlobal::iconLoader()->loadIcon("network", KIcon::Small), i18n( "DVB client") );
+ }
+ else
+ dvbClient = 0;
+
+ //inplug->setActivePlugin( config->readEntry("Active Browser", "") );
+
+ config->setGroup("Player Part");
+ QString partName = config->readEntry("Last Service Desktop Name", DEFAULT_PLAYER_PART);
+ // don't load the old kaffeine_part.
+ if ( partName=="kaffeine_part" )
+ partName=DEFAULT_PLAYER_PART;
+ slotLoadPart(partName);
+
+ m_recent->loadEntries(config, "Recent Files");
+
+ applyMainWindowSettings(config, "Main Window");
+}
+
+void Kaffeine::saveConfig()
+{
+ KConfig* config = kapp->config();
+
+ if (!m_fullscreen->isChecked())
+ {
+ if (m_minimal->isChecked())
+ menuBar()->show();
+ saveMainWindowSettings(config, "Main Window");
+ }
+
+ config->setGroup("General Options");
+ config->writeEntry("Autoresize Factor", m_autoResizeFactor);
+ config->writeEntry("Original Aspect", m_originalAspect->isChecked());
+ config->writeEntry("Embed in System Tray", m_embedSystemTray);
+ config->writeEntry("OSD Duration", m_osdDuration);
+ config->writeEntry("Use Alternate Encoding", m_useAlternateEncoding);
+ config->writeEntry("Alternate Encoding Name", m_alternateEncoding);
+ config->writeEntry("Active Browser", inplug->activePlugin());
+ config->writeEntry("PauseHiddenVideo", m_pauseVideo);
+ config->writeEntry("DvbClientEnabled", m_dvbClientEnabled);
+ config->writeEntry("DvbClientAddress", m_dvbClientAddress);
+ config->writeEntry("DvbClientPort", m_dvbClientPort);
+ config->writeEntry("DvbClientInfo", m_dvbClientInfo);
+ config->writeEntry("DvbClientShiftPath", m_dvbClientShiftPath );
+
+ config->setGroup("Player Part");
+ if (m_currentPartService.isNull())
+ m_currentPartService = DEFAULT_PLAYER_PART;
+ config->writeEntry("Last Service Desktop Name", m_currentPartService);
+
+ m_recent->saveEntries(config, "Recent Files");
+
+ inplug->saveConfig();
+}
+
+void Kaffeine::showEvent(QShowEvent*)
+{
+ if (m_mediaPart)
+ {
+ // restart playback if stream contains video
+ if ( (m_mediaPart->isPlaying()) && (m_mediaPart->hasVideo()) && (m_mediaPart->isPaused()) && (m_autoPaused) )
+ m_mediaPart->slotTogglePause();
+ }
+ m_autoPaused = false;
+}
+
+void Kaffeine::hideEvent (QHideEvent*)
+{
+ if (m_mediaPart && m_pauseVideo)
+ {
+ // pause playback if stream contains video
+ if ( (m_mediaPart->isPlaying()) && (m_mediaPart->hasVideo())
+ && (!m_mediaPart->isPaused()) )
+ {
+ m_mediaPart->slotTogglePause();
+ m_autoPaused = true;
+ }
+ }
+}
+
+void Kaffeine::slotPreferences()
+{
+ KaffeinePreferences dlg;
+ dlg.setConfig(m_pauseVideo, m_embedSystemTray, m_osdDuration, m_useAlternateEncoding, m_alternateEncoding);
+ dlg.setDvbClient( m_dvbClientEnabled, m_dvbClientAddress, m_dvbClientPort, m_dvbClientInfo, m_dvbClientShiftPath );
+ connect(&dlg, SIGNAL(signalClearRecent()), this, SLOT(slotClearRecent()));
+ connect(&dlg, SIGNAL(signalEmbedSystemTray(bool)), this, SLOT(slotSystemTray(bool)));
+ connect(&dlg, SIGNAL(signalUseAlternateEncoding(bool)), this, SLOT(slotUseAlternateEncoding(bool)));
+ connect(&dlg, SIGNAL(signalAlternateEncoding(const QString&)), this, SLOT(slotAlternateEncoding(const QString&)));
+ connect(&dlg, SIGNAL(signalSetOSDTimeout(uint)), this, SLOT(slotSetOSDTimeout(uint)));
+ connect(&dlg, SIGNAL(signalPauseVideo(bool)), this, SLOT(slotPauseVideo(bool)));
+ connect(&dlg, SIGNAL(signalDvbClient(bool,const QString&,int,int,const QString&)), this, SLOT(slotDvbClient(bool,const QString&,int,int,const QString&)));
+ dlg.exec();
+}
+
+void Kaffeine::slotDvbClient( bool enabled, const QString &address, int port, int info, const QString &tspath )
+{
+ if ( enabled!=m_dvbClientEnabled )
+ {
+ if ( dvbClient )
+ {
+ inplug->remove( dvbClient );
+ dvbClient = 0;
+ }
+ else
+ {
+ dvbClient = new CdWidget(address, port, info, tspath, this, this, "cdwidget");
+ if ( m_mediaPart )
+ {
+ connect( dvbClient, SIGNAL(dvbOpen(const QString&,const QString&,int)), m_mediaPart, SLOT(slotDvbOpen(const QString&,const QString&,int)) );
+ connect( m_mediaPart, SIGNAL(stopDvb()), dvbClient, SLOT(stopLive()) );
+ connect( dvbClient, SIGNAL(dvbStop()), m_mediaPart, SLOT(slotStop()) );
+ connect( m_mediaPart, SIGNAL(playerPause()), dvbClient, SLOT(pauseLiveTV()) );
+ connect( dvbClient, SIGNAL(setTimeShiftFilename(const QString&)), m_mediaPart, SLOT(getTimeShiftFilename(const QString&)) );
+ dvbClient->enableLive( true );
+ }
+ inplug->add( dvbClient, KGlobal::iconLoader()->loadIcon("network", KIcon::Small), i18n( "DVB client") );
+ }
+ }
+ else
+ {
+ if ( dvbClient )
+ dvbClient->setParam( address, port, info, tspath );
+ }
+
+ m_dvbClientEnabled = enabled;
+ m_dvbClientAddress = address;
+ m_dvbClientPort = port;
+ m_dvbClientInfo = info;
+ m_dvbClientShiftPath = tspath;
+}
+
+void Kaffeine::slotPauseVideo(bool b)
+{
+ m_pauseVideo = b;
+}
+
+void Kaffeine::slotSetOSDTimeout(uint secs)
+{
+ m_osdDuration = secs;
+}
+
+void Kaffeine::optionsConfigureKeys()
+{
+ //KKeyDialog::configure(actionCollection(), this);
+ KKeyDialog* keyDialog = new KKeyDialog(true, 0);
+ if (m_mediaPart)
+ keyDialog->insert(m_mediaPart->actionCollection(), i18n("Player"));
+ keyDialog->insert(actionCollection(), i18n("Main Window"));
+ inplug->addConfigKeys( keyDialog );
+
+ keyDialog->configure(true);
+
+ delete keyDialog;
+}
+
+void Kaffeine::optionsConfigureToolbars()
+{
+ saveMainWindowSettings(KGlobal::config(), autoSaveGroup());
+
+ // use the standard toolbar editor
+ KEditToolbar dlg(factory());
+ connect(&dlg, SIGNAL(newToolbarConfig()),
+ this, SLOT(applyNewToolbarConfig()));
+ dlg.exec();
+}
+
+void Kaffeine::applyNewToolbarConfig()
+{
+ applyMainWindowSettings(KGlobal::config(), autoSaveGroup());
+}
+
+void Kaffeine::slotSystemTray(bool embed)
+{
+ m_embedSystemTray = embed;
+ if (embed)
+ {
+ if (!m_systemTray)
+ {
+ m_systemTray = new SystemTray(this);
+ connect(m_systemTray, SIGNAL(signalPlay()), this, SLOT(slotPlayUnPause()));
+ connect(m_systemTray, SIGNAL(signalNext()), this, SLOT(slotRequestForNextTrack()));
+ connect(m_systemTray, SIGNAL(signalPrevious()), this, SLOT(slotRequestForPreviousTrack()));
+ connect(m_systemTray, SIGNAL(signalStop()), this, SLOT(slotStop()));
+ connect(m_systemTray, SIGNAL(signalMute()), this, SLOT(slotMute()));
+ connect(m_systemTray, SIGNAL(quitSelected()), this, SLOT(slotQuit()));
+ m_systemTray->show();
+ }
+ }
+ else
+ {
+ if (m_systemTray)
+ {
+ delete m_systemTray;
+ m_systemTray = NULL;
+ }
+ }
+}
+
+void Kaffeine::slotSleepAfterPlayMenu()
+{
+ m_quitAfterPlay->setChecked(false); //Keep from checking both quits
+
+#ifdef HAVE_DPMS
+ Display *dspl = qt_xdisplay();
+ int base;
+ bool hasDPMS = DPMSQueryExtension(dspl, &base, &base);
+ if (!hasDPMS) // Check Xserver for DPMS
+ {
+ KMessageBox::error(this, i18n("DPMS Xserver extension was not found."));
+ m_sleepAfterPlay->setChecked(false);
+ }
+ else
+ {
+ if (m_sleepAfterPlay->isChecked())
+ {
+ KMessageBox::information(this, i18n("This will quit Kaffeine and shut off the monitor's power after the file/playlist has finished. Option \"dpms\" must be in your X config file for the monitor to power off."), QString::null, "sleep_info", 1);
+ }
+ }
+#endif
+}
+
+void Kaffeine::slotSleepAfterPlay()
+{
+#ifdef HAVE_DPMS
+ Display *dspl = qt_xdisplay();
+ CARD16 standby;
+ CARD16 suspend;
+ CARD16 off;
+ DPMSGetTimeouts(dspl, &standby, &suspend, &off);
+ DPMSEnable(dspl);
+ DPMSSetTimeouts(dspl, 0, 1, 2); // Arbitrarily chosen times
+ XFlush(dspl);
+ sleep(3); // Wait for DPMS to kill screen
+ DPMSSetTimeouts(dspl, standby, suspend, off); // For reseting DPMS and toggle
+ XFlush(dspl);
+#endif
+
+ if (m_systemTray)
+ {
+ hide();
+ m_sleepAfterPlay->setChecked(false);
+ m_quitAfterPlaylist->setChecked(false);
+ }
+ else
+ slotQuit();
+}
+
+void Kaffeine::slotQuitAfterPlaylistMenu()
+{
+ m_sleepAfterPlay->setChecked(false);
+ m_quitAfterPlay->setChecked(false);
+}
+
+void Kaffeine::slotQuitAfterPlayMenu()
+{
+ m_sleepAfterPlay->setChecked(false); //Keep from checking both quits
+ m_quitAfterPlaylist->setChecked(false);
+}
+
+void Kaffeine::slotQuitAfterPlay()
+{
+ if (m_systemTray)
+ {
+ hide();
+ m_quitAfterPlay->setChecked(false);
+ m_quitAfterPlaylist->setChecked(false);
+ }
+ else
+ slotQuit();
+}
+
+void Kaffeine::slotOpenFile()
+{
+ QString fileFilter = m_filter;
+ fileFilter.prepend(" *.m3u *.pls *.kaffeine *.M3U *.PLS *.KAFFEINE");
+ if (m_mediaPart)
+ {
+ QString extensions = m_mediaPart->supportedExtensions();
+ kdDebug() << extensions << endl;
+ if (extensions.isNull())
+ extensions = DEFAULT_FILTER;
+ fileFilter.prepend(extensions);
+ }
+ else
+ fileFilter.prepend(DEFAULT_FILTER);
+
+ KURL::List kurlList = KFileDialog::getOpenURLs(":kaffeine_openFile", fileFilter, 0, i18n("Open File(s)"));
+
+ for (KURL::List::Iterator it = kurlList.begin(); it != kurlList.end(); ++it)
+ if ((*it).isLocalFile() && (*it).path().endsWith(".iso", false))
+ (*it).setProtocol("dvd");
+
+ QStringList urlList = kurlList.toStringList();
+
+ if (urlList.count() > 0)
+ load(urlList);
+}
+
+void Kaffeine::slotTogglePlaylist()
+{
+ if (!m_playerContainer)
+ return;
+
+ if ( /* !m_fullscreen->isChecked() && */ !m_minimal->isChecked() )
+ inplug->togglePlaylist();
+}
+
+void Kaffeine::slotSwitchToPlayerWindow()
+{
+ if ( !m_playerContainer )
+ return;
+
+ if ( m_mediaPart ) {
+ if (m_mediaPart->isPlaying()) // only if playback
+ inplug->showPlayer();
+ }
+}
+
+void Kaffeine::slotCurrentTabChanged(QWidget*)
+{
+}
+
+void Kaffeine::slotToggleMinimalModeFromPlayer()
+{
+ m_minimal->setChecked(!m_minimal->isChecked());
+ slotToggleMinimalMode();
+}
+
+void Kaffeine::slotToggleMinimalMode()
+{
+ if (m_fullscreen->isChecked())
+ {
+ m_minimal->setChecked(!m_minimal->isChecked());
+ return;
+ }
+
+ if (m_minimal->isChecked())
+ {
+ kdDebug() << "Kaffeine: Go to minimal mode..." << endl;
+ menuBar()->hide();
+ //m_statusBarVisible = statusBar()->isVisible();
+ //statusBar()->hide();
+ hideToolbars(true);
+ inplug->fullscreen( true );
+ setMouseTracking( true );
+ }
+ else
+ {
+ menuBar()->show();
+ //if (m_statusBarVisible)
+ //statusBar()->show();
+ hideToolbars(false);
+ inplug->fullscreen( false );
+ setMouseTracking( false );
+ }
+}
+
+void Kaffeine::slotToggleFullscreen()
+{
+ if (m_fullscreen->isChecked())
+ {
+ kdDebug() << "Kaffeine: Go to fullscreen mode..." << endl;
+ if (m_mediaPart)
+ m_mediaPart->slotPrepareForFullscreen(true);
+ menuBar()->hide();
+ if (!m_minimal->isChecked()) {
+ //m_statusBarVisible = statusBar()->isVisible();
+ inplug->fullscreen( true );
+ }
+ //statusBar()->hide();
+ hideToolbars(true);
+
+ /*
+ * uuuh, ugly :-)
+ * make sure there is no frame border around the player window
+ */
+ QFrame* tabFrame = dynamic_cast<QFrame*>(m_playerContainer->parentWidget());
+ if (tabFrame)
+ {
+ tabFrame->setFrameShape(QFrame::NoFrame);
+ tabFrame->setLineWidth(0);
+ }
+
+ if (m_haveKWin)
+ {
+ KWin::activateWindow(winId());
+ KWin::setState(winId(), NET::FullScreen);
+ }
+ else
+ showFullScreen();
+ setMouseTracking( true );
+ }
+ else
+ {
+ // restore frame style
+ QFrame* tabFrame = dynamic_cast<QFrame*>(m_playerContainer->parentWidget());
+ if (tabFrame)
+ {
+ tabFrame->setFrameStyle(QFrame::TabWidgetPanel | QFrame::Raised);
+ tabFrame->setLineWidth(0);
+ }
+
+ kdDebug() << "Kaffeine: Leave fullscreen mode..." << endl;
+ if (m_mediaPart)
+ m_mediaPart->slotPrepareForFullscreen(false);
+ if (!m_minimal->isChecked())
+ {
+ menuBar()->show();
+ //if (m_statusBarVisible)
+ //statusBar()->show();
+ hideToolbars(false);
+ inplug->fullscreen( false );
+ }
+
+ if (m_haveKWin)
+ KWin::clearState(winId(), NET::FullScreen);
+ else
+ showNormal();
+ setMouseTracking( false );
+ }
+}
+
+void Kaffeine::slotEscapeFullscreen()
+{
+ if (m_fullscreen->isChecked())
+ {
+ m_fullscreen->setChecked(false);
+ slotToggleFullscreen();
+ }
+ else if (m_minimal->isChecked())
+ {
+ m_minimal->setChecked(false);
+ slotToggleMinimalMode();
+ }
+}
+
+void Kaffeine::hideToolbars(bool hide)
+{
+ if (hide)
+ {
+ leftDock()->hide();
+ rightDock()->hide();
+ topDock()->hide();
+ bottomDock()->hide();
+ }
+ else
+ {
+ leftDock()->show();
+ rightDock()->show();
+ topDock()->show();
+ bottomDock()->show();
+ }
+}
+
+void Kaffeine::mouseDoubleClickEvent(QMouseEvent*)
+{
+ // kdDebug() << "Kaffeine: doubleclick" << endl;
+ fullscreen();
+}
+
+void Kaffeine::mousePressEvent(QMouseEvent* mev)
+{
+ kdDebug() << "Kaffeine: Mouse press event" << endl;
+ if ( m_minimal->isChecked() && !m_fullscreen->isChecked() && (mev->button() == MidButton) ) {
+ if (topDock()->isVisible()) {
+ hideToolbars(true);
+ //menuBar()->hide;
+ }
+ else {
+ hideToolbars(false);
+ //menuBar()->show();
+ }
+ }
+ mev->ignore();
+}
+
+void Kaffeine::mouseMoveEvent(QMouseEvent* mev)
+{
+ //kdDebug() << "Kaffeine: Mouse move event" << endl;
+ if ( m_fullscreen->isChecked() ) {
+ if ( mev->y()<60 || mev->y()>(height()-60) ) {
+ if ( !topDock()->isVisible() )
+ hideToolbars( false );
+ }
+ else {
+ if ( topDock()->isVisible() )
+ hideToolbars( true );
+ }
+ }
+
+ mev->ignore();
+}
+
+void Kaffeine::resizeEvent(QResizeEvent* rev)
+{
+ /* FIXME: don't really work proper... */
+ KMainWindow::resizeEvent(rev);
+ if ((!m_noResize) && (!m_fullscreen->isChecked()) && (m_originalAspect->isChecked())
+ && (m_videoSize.height() != 0) && (m_videoSize.width() != 0))
+ {
+ QSize player = inplug->stackSize();
+ double ratio = (double)m_videoSize.height() / (double)m_videoSize.width();
+ int newHeight = (int)((double)player.width() * ratio);
+ QSize newSize = size() - QSize(0, player.height() - newHeight);
+ kdDebug() << "Kaffeine: resize to orignal aspect: old size: " << size().width() << "x" << size().height()
+ << ", video size: " << m_videoSize.width() << "x" << m_videoSize.height()
+ << ", video ratio: " << ratio
+ << ", old height: " << player.height()
+ << ", new height: " << newHeight
+ << ", resize to: " << newSize.width() << "x" << newSize.height() << endl;
+ m_noResize = true;
+ resize(newSize);
+ }
+ else
+ m_noResize = false;
+}
+
+void Kaffeine::slotOriginalAspect()
+{
+ if (m_originalAspect->isChecked())
+ Kaffeine::resizeEvent(new QResizeEvent(QSize(), QSize()));
+}
+
+void Kaffeine::autoresize()
+{
+ if ((!m_fullscreen->isChecked()) && (m_autoResizeFactor)
+ && (m_videoSize.height() != 0) && (m_videoSize.width() != 0))
+ {
+ QSize player, newSize;
+ /*
+ * we do the resize twice, because after the first resize toolbars area may be much heigher
+ */
+ for (uint i = 0; i < 2; i++)
+ {
+ player = inplug->stackSize();
+ newSize = size() - QSize(player.width() - m_videoSize.width() * m_autoResizeFactor,
+ player.height() - m_videoSize.height() * m_autoResizeFactor);
+ kdDebug() << "Kaffeine: autoresize: old size: " << size().width() << "x" << size().height()
+ << ", video size: " << m_videoSize.width() << "x" << m_videoSize.height()
+ << ", player size: " << player.width() << "x" << player.height()
+ << ", resize to: " << newSize.width() << "x" << newSize.height() << endl;
+ m_noResize = true;
+ resize(newSize);
+ }
+ }
+}
+
+void Kaffeine::slotAutoresizeOff()
+{
+ m_autoResizeFactor = 0;
+ m_autoResizeOriginal->setChecked(false);
+ m_autoResizeDouble->setChecked(false);
+ m_autoResizeTriple->setChecked(false);
+}
+
+void Kaffeine::slotAutoresizeOriginal()
+{
+ m_autoResizeFactor = 1;
+ m_autoResizeOff->setChecked(false);
+ m_autoResizeDouble->setChecked(false);
+ m_autoResizeTriple->setChecked(false);
+ autoresize();
+}
+
+void Kaffeine::slotAutoresizeDouble()
+{
+ m_autoResizeFactor = 2;
+ m_autoResizeOriginal->setChecked(false);
+ m_autoResizeOff->setChecked(false);
+ m_autoResizeTriple->setChecked(false);
+ autoresize();
+}
+
+void Kaffeine::slotAutoresizeTriple()
+{
+ m_autoResizeFactor = 3;
+ m_autoResizeOriginal->setChecked(false);
+ m_autoResizeDouble->setChecked(false);
+ m_autoResizeOff->setChecked(false);
+ autoresize();
+}
+
+void Kaffeine::slotNewFrameSize(const QSize& size)
+{
+ kdDebug() << "Kaffeine: new video frame size: " << size.width() << "x" << size.height() << endl;
+ m_videoSize = size;
+ autoresize();
+}
+
+void Kaffeine::slotOpenURL()
+{
+ bool ok;
+ //QString url = QInputDialog::getText(i18n("Open URL"), i18n("Enter a URL:"), QLineEdit::Normal, "", &ok);
+ QString url = KInputDialog::getText(i18n("Open URL"), i18n("Enter a URL:"), "", &ok);
+ if (ok)
+ {
+ if ((!(url.left(1) == "/")) && (!url.contains(":/")))
+ url.prepend("http://"); // assume http protocol
+ load(url);
+ }
+}
+
+void Kaffeine::slotOpenDirectory()
+{
+ QString s;
+
+ if (m_mediaPart)
+ {
+ QString extensions = m_mediaPart->supportedExtensions();
+ if (!extensions.isNull())
+ m_playlist->setFileFilter(extensions);
+ }
+
+ KURL path = KDirSelectDialog::selectDirectory(":kaffeine_openDir", false, 0, i18n("Open Folder"));
+ QString checkSystemURL = path.prettyURL();
+ if (path.isValid())
+ {
+ if (path.protocol() == "media")
+ load("media:" + path.path());
+ else if (checkSystemURL.startsWith("system:/media/"))
+ {
+ checkSystemURL = checkSystemURL.mid(14);
+ checkSystemURL = checkSystemURL.prepend("media:/");
+ load(checkSystemURL);
+ }
+ else {
+ s = path.path();
+ if ( QDir(s).entryList().contains("VIDEO_TS") || QDir(s).entryList().contains("video_ts") )
+ s = s.prepend("dvd://");
+ load( s );
+ }
+ }
+}
+
+/*
+QString Kaffeine::askForOtherDevice(const QString& type)
+{
+ KDialogBase* dialog = new KDialogBase( 0, "askfordrive", true, i18n("Error"), KDialogBase::Ok|KDialogBase::Cancel);
+ QVBox* page = dialog->makeVBoxMainWidget();
+ page->setSpacing(5);
+ page->setMargin(5);
+ new QLabel(i18n("No %1 in drive, or wrong path to device.").arg(type), page);
+ new QLabel(QString("\n") + i18n("Please select correct drive:"), page);
+ DrivesCombo* drives = new DrivesCombo(page);
+
+ if (dialog->exec() == KDialogBase::Accepted)
+ {
+ QString newDrive = drives->currentText();
+ delete dialog;
+ return newDrive;
+ }
+ else
+ {
+ delete dialog;
+ return QString::null;
+ }
+}
+*/
+
+bool Kaffeine::loadTMP(const QStringList& list)
+{
+ QString device="";
+ QStringList sublist("smi");
+ sublist << "srt" << "sub" << "txt" << "ssa" << "asc";
+ if ( !m_device.isEmpty() ) {
+ device = m_device;
+ m_device = "";
+ }
+
+ if (!list.count())
+ return false;
+ QStringList::ConstIterator end(list.end());
+ for (QStringList::ConstIterator it = list.begin(); it != end; ++it) {
+ QString url = (*it).lower();
+ QString ext = url;
+ ext = ext.remove( 0 , ext.findRev('.')+1 ).lower();
+ if (url == "dvd") {
+ cddisc->startDVD( device );
+ return true;
+ }
+ else if (url == "vcd") {
+ cddisc->startVCD( device );
+ return true;
+ }
+ else if ((url == "audiocd") || (url == "cdda")) {
+ cddisc->startCD( device );
+ return true;
+ }
+ else if (url == "dvb") {
+ playDvb();
+ return true;
+ }
+ else if ( sublist.contains(ext)) {
+ MRL mrl = m_playlist->getCurrent();
+ if (!mrl.isEmpty()) {
+ if (!mrl.subtitleFiles().contains(url)) {
+ mrl.addSubtitleFile(*it);
+ mrl.setCurrentSubtitle(mrl.subtitleFiles().size() - 1);
+ m_mediaPart->openURL(mrl);
+ }
+ }
+ return true;
+ }
+ }
+
+ m_playlist->setPlaylist(i18n("NEW"), true);
+ m_playlist->add(list, NULL);
+ if (!m_playlist->isQueueMode())
+ slotPlaylistPlay();
+ return false;
+}
+
+void Kaffeine::slotQuit()
+{
+ if ( !inplug->close() )
+ return;
+
+ saveConfig();
+
+ /*if (m_systemTray)
+ {
+ delete m_systemTray;
+ m_systemTray = NULL;
+ }*/
+
+ KApplication::exit(0);
+}
+
+void Kaffeine::closeEvent(QCloseEvent* e)
+{
+ if (m_systemTray && !kapp->sessionSaving())
+ {
+ //KMessageBox::information(this, i18n("Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."), QString::null, "system_tray_info");
+ hide();
+ e->ignore();
+ }
+ else
+ {
+ slotQuit();
+ if (kapp->sessionSaving())
+ e->accept();
+ else
+ e->ignore();
+ }
+}
+
+void Kaffeine::slotClearRecent()
+{
+ m_recent->clear();
+ m_recent->setItems(QStringList());
+}
+
+void Kaffeine::slotChangeStatusbar(const QString& )
+{
+ // display the text on the statusbar
+ //statusBar()->message(text, 5000); /* show for 5 seconds */
+}
+
+
+void Kaffeine::slotChangePlaylistStatus(const QString& )
+{
+ //statusBar()->changeItem(text, 9);
+}
+
+void Kaffeine::slotChangeCaption(const QString& text)
+{
+ // display the text on the caption
+ setCaption(text);
+
+ if ((m_systemTray) && (!m_fullscreen->isChecked()))
+ m_systemTray->showTitle(text, m_osdDuration);
+}
+
+void Kaffeine::slotFakeKeyEvent()
+{
+ if ( m_mediaPart && m_mediaPart->isPlaying() && !m_mediaPart->isPaused() && haveXTest)
+ if ( m_fullscreen->isChecked() || m_mediaPart->hasVideo() ) {
+ if (m_haveKWin) {
+ // use a better method if we're in a kde environment
+ kdDebug() << "Kaffeine: Fake mouse movement\n";
+ XWarpPointer(x11Display(), None, None, 0, 0, 0, 0, 0, 0);
+ XFlush(x11Display());
+ } else {
+#ifdef HAVE_XTEST
+ kdDebug() << "Kaffeine: Fake key press\n";
+ XTestFakeKeyEvent(x11Display(), fakeKeycode, true, 0);
+ XTestFakeKeyEvent(x11Display(), fakeKeycode, false, 0);
+ XFlush(x11Display());
+#endif
+ }
+ }
+}
+
+/** slots for meta to unicode encoding **/
+
+void Kaffeine::slotUseAlternateEncoding(bool useEncoding)
+{
+ m_useAlternateEncoding = useEncoding;
+ m_playlist->useAlternateEncoding(useEncoding);
+}
+
+void Kaffeine::slotAlternateEncoding(const QString& encoding)
+{
+ m_alternateEncoding = encoding;
+ m_playlist->setAlternateEncoding(encoding);
+}
+
+/** slots for system tray **/
+
+void Kaffeine::slotStop()
+{
+ stop();
+}
+
+void Kaffeine::slotMute()
+{
+ mute();
+}
+
+/********* DCOP INTERFACE *********/
+
+void Kaffeine::openURL(QString url)
+{
+ loadTMP(QStringList(url));
+}
+
+void Kaffeine::appendURL(QString url)
+{
+ if (!m_playlist) return;
+ m_playlist->add
+ (url, m_playlist->getLast());
+}
+
+void Kaffeine::play()
+{
+ slotRequestForCurrentTrack();
+}
+
+void Kaffeine::playAudioCD()
+{
+ cddisc->startCD();
+}
+
+void Kaffeine::playVCD()
+{
+ cddisc->startVCD();
+}
+
+void Kaffeine::playDVD()
+{
+ cddisc->startDVD();
+}
+
+void Kaffeine::pause()
+{
+ if (m_mediaPart)
+ m_mediaPart->slotTogglePause();
+}
+
+void Kaffeine::stop()
+{
+ if (m_mediaPart)
+ m_mediaPart->slotStop();
+}
+
+void Kaffeine::next()
+{
+ if ((m_mediaPart) && (m_mediaPart->hasChapters()))
+ m_mediaPart->playNextChapter();
+ else
+ slotRequestForNextTrack();
+}
+
+void Kaffeine::previous()
+{
+ if ((m_mediaPart) && (m_mediaPart->hasChapters()))
+ m_mediaPart->playPreviousChapter();
+ else
+ slotRequestForPreviousTrack();
+}
+
+void Kaffeine::changePlaylist()
+{
+ if (!m_playlist) return;
+ m_playlist->nextPlaylist();
+}
+
+bool Kaffeine::isPlaying()
+{
+ if (m_mediaPart)
+ return m_mediaPart->isPlaying();
+ else
+ return false;
+}
+
+bool Kaffeine::isVideo()
+{
+ if (m_mediaPart)
+ {
+ if (m_mediaPart->isPlaying())
+ return m_playlist->getCurrent().mime().contains("video");
+ else
+ return false;
+ }
+ else
+ return m_playlist->getCurrent().mime().contains("video");
+}
+
+QString Kaffeine::title()
+{
+ if (!m_playlist)
+ return QString();
+ return m_playlist->getCurrent().title();
+}
+
+QString Kaffeine::artist()
+{
+ if (!m_playlist)
+ return QString();
+ return m_playlist->getCurrent().artist();
+}
+
+QString Kaffeine::album()
+{
+ if (!m_playlist)
+ return QString();
+ return m_playlist->getCurrent().album();
+}
+
+QString Kaffeine::track()
+{
+ if (!m_playlist)
+ return QString();
+ return m_playlist->getCurrent().track();
+}
+
+QString Kaffeine::getFileName()
+{
+ if (!m_playlist)
+ return QString();
+ return m_playlist->getCurrent().url();
+}
+
+void Kaffeine::random()
+{
+ m_playlist->slotToggleShuffle();
+}
+
+void Kaffeine::fullscreen()
+{
+ m_fullscreen->setChecked(!m_fullscreen->isChecked());
+ slotToggleFullscreen();
+}
+
+void Kaffeine::minimal()
+{
+ m_minimal->setChecked(!m_minimal->isChecked());
+ slotToggleMinimalMode();
+}
+
+int Kaffeine::getLength()
+{
+ if (!m_playlist)
+ return 0;
+ QTime length = m_playlist->getCurrent().length();
+ return length.hour() * 3600 + length.minute() * 60 + length.second();
+}
+
+int Kaffeine::getTimePos()
+{
+ if (m_mediaPart)
+ return m_mediaPart->position();
+ else
+ return 0;
+}
+
+void Kaffeine::posPlus()
+{
+ if (m_mediaPart)
+ m_mediaPart->slotPosPlusSmall();
+}
+
+void Kaffeine::posMinus()
+{
+ if (m_mediaPart)
+ m_mediaPart->slotPosMinusSmall();
+}
+
+void Kaffeine::volUp()
+{
+ if (m_mediaPart)
+ {
+ int newVol = m_mediaPart->volume() + 5;
+ if (newVol >100)
+ newVol = 100;
+ m_mediaPart->slotSetVolume(newVol);
+ }
+}
+
+void Kaffeine::volDown()
+{
+ if (m_mediaPart)
+ {
+ int newVol = m_mediaPart->volume() - 5;
+ if (newVol <0)
+ newVol = 0;
+ m_mediaPart-> slotSetVolume(newVol);
+ }
+}
+
+void Kaffeine::mute()
+{
+ if (m_mediaPart)
+ m_mediaPart->slotMute();
+}
+
+void Kaffeine::quit()
+{
+ slotQuit();
+}
+
+void Kaffeine::setNumber( int num )
+{
+ slotNumKeyInput( num+10 );
+}
+
+void Kaffeine::dvbOSD()
+{
+#ifdef HAVE_DVB
+ if ( dvbPanel )
+ dvbPanel->dvbOSD();
+#endif
+}
+
+void Kaffeine::dvbOSDNextChannel()
+{
+#ifdef HAVE_DVB
+ if ( dvbPanel )
+ dvbPanel->dvbOSDNext();
+#endif
+}
+
+void Kaffeine::dvbOSDPreviousChannel()
+{
+#ifdef HAVE_DVB
+ if ( dvbPanel )
+ dvbPanel->dvbOSDPrev();
+#endif
+}
+
+void Kaffeine::dvbOSDNextProgram()
+{
+#ifdef HAVE_DVB
+ if ( dvbPanel )
+ dvbPanel->dvbOSDAdvance();
+#endif
+}
+
+void Kaffeine::dvbOSDPreviousProgram()
+{
+#ifdef HAVE_DVB
+ if ( dvbPanel )
+ dvbPanel->dvbOSDRetreat();
+#endif
+}
+
+void Kaffeine::dvbOSDZap()
+{
+#ifdef HAVE_DVB
+ if ( dvbPanel )
+ dvbPanel->dvbOSDZap();
+#endif
+}
+
+void Kaffeine::playDvb()
+{
+#ifdef HAVE_DVB
+ if ( dvbPanel ) {
+ dvbPanel->recallZap();
+ }
+#endif
+}
+
+void Kaffeine::dvbNewTimer( QString name, QString channel, QString datetime, QString duration )
+{
+#ifdef HAVE_DVB
+ if ( dvbPanel ) {
+ dvbPanel->dvbNewTimer( name, channel, datetime, duration );
+ }
+#endif
+}
+
+int Kaffeine::dvbSNR( int device )
+{
+#ifdef HAVE_DVB
+ if ( dvbPanel ) {
+ return dvbPanel->getSNR( device );
+ }
+#endif
+ return -1;
+}
+
+void Kaffeine::reloadEngine()
+{
+ bool isPlaying = m_mediaPart ? m_mediaPart->isPlaying() : false;
+
+ unloadCurrentPart();
+ kapp->config()->setGroup("Player Part");
+ slotLoadPart(kapp->config()->readEntry("Last Service Desktop Name", DEFAULT_PLAYER_PART));
+
+ if (isPlaying)
+ slotPlaylistPlay();
+}
diff --git a/kaffeine/src/kaffeine.desktop b/kaffeine/src/kaffeine.desktop
new file mode 100644
index 0000000..59ba9fc
--- /dev/null
+++ b/kaffeine/src/kaffeine.desktop
@@ -0,0 +1,59 @@
+[Desktop Entry]
+Categories=Qt;KDE;Application;AudioVideo;Player;
+X-KDE-Protocols=file,http,audiocd,smb
+DocPath=kaffeine/index.html
+Encoding=UTF-8
+Exec=kaffeine %U
+GenericName=Media Player
+GenericName[af]=Media Speler
+GenericName[ar]=قارء الوسائط
+GenericName[be]=Медыяпрайгравальнік
+GenericName[bg]=Медия плеър
+GenericName[bn]=মিডিয়া প্লেয়ার
+GenericName[br]=Soner liesvedia
+GenericName[ca]=Reproductor de medis
+GenericName[cs]=Přehrávač médií
+GenericName[da]=Medieafspiller
+GenericName[de]=Medienwiedergabe
+GenericName[el]=Αναπαραγωγέας πολυμέσων
+GenericName[es]=Reproductor de medios
+GenericName[et]=Multimeedia mängija
+GenericName[fi]=Mediasoitin
+GenericName[fr]=Lecteur de média
+GenericName[ga]=Seinnteoir Meán
+GenericName[gl]=Reprodutor Multimédia
+GenericName[he]=נגן מדיה
+GenericName[hu]=Médialejátszó
+GenericName[is]=Margmiðlunarspilari
+GenericName[it]=Lettore multimediale
+GenericName[ja]=メディアプレーヤ
+GenericName[ka]=მედიადამკვრელი
+GenericName[km]=កម្មវិធី​ចាក់​មេឌៀ
+GenericName[lt]=Daugialypės terpės grotuvas
+GenericName[nb]=Mediaspiller
+GenericName[nl]=Mediaspeler
+GenericName[nn]=Mediespelar
+GenericName[pa]=ਵੀਡਿਓ ਪਲੇਅਰ
+GenericName[pl]=Odtwarzacz multimedialny
+GenericName[pt]=Leitor Multimédia
+GenericName[pt_BR]=Reprodutor Multimídia
+GenericName[se]=Mediačuojan
+GenericName[sr]=Медија плејер
+GenericName[sr@Latn]=Medija plejer
+GenericName[sv]=Mediaspelare
+GenericName[tg]=Навозишгари Медиа
+GenericName[th]=โปรแกรมเล่นสื่อ
+GenericName[tr]=Oynatıcı
+GenericName[uk]=Програвач медіа
+GenericName[xx]=xxMedia Playerxx
+GenericName[zh_CN]=媒体播放器
+GenericName[zh_TW]=媒體播放程式
+Icon=kaffeine
+MimeType=application/x-ogg;video/x-matroska;audio/x-matroska;video/mpeg;video/msvideo;video/quicktime;video/vnd.rn-realvideo;video/x-avi;video/x-fli;video/x-flic;video/x-ms-asf;video/x-ms-wmv;video/x-msvideo;application/x-mplayer2;application/smil;application/x-kaffeine;audio/x-musepack;
+Name=Kaffeine
+Name[bn]=ক্যাফিন
+Name[pa]=ਕੈਫ਼ੀਨ
+Name[xx]=xxKaffeinexx
+Terminal=false
+Type=Application
+X-KDE-HasTempFileOption=true
diff --git a/kaffeine/src/kaffeine.h b/kaffeine/src/kaffeine.h
new file mode 100644
index 0000000..2176e5b
--- /dev/null
+++ b/kaffeine/src/kaffeine.h
@@ -0,0 +1,280 @@
+/*
+ * kaffeine.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2005-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KAFFEINE_H
+#define KAFFEINE_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qtimer.h>
+#include <qvbox.h>
+
+#include <kmainwindow.h>
+#include <kparts/part.h>
+
+#include "kaffeineiface.h"
+
+class KActionMenu;
+class KCmdLineOptions;
+class KRecentFilesAction;
+class KToggleAction;
+class KToggleFullScreenAction;
+
+class CdWidget;
+class Disc;
+class DvbPanel;
+class InputManager;
+class KaffeinePart;
+class MRL;
+class PlayList;
+class PlayerContainer;
+class StartWindow;
+class SystemTray;
+
+extern const KCmdLineOptions cmdLineOptions[];
+
+class Kaffeine : public KMainWindow, private KaffeineIface
+{
+ Q_OBJECT
+public:
+ Kaffeine();
+ virtual ~Kaffeine();
+
+ void updateArgs();
+
+private:
+ /**
+ * Use this method to load whatever file/URL you have
+ */
+ void load(const QStringList&);
+ void load(const QString&);
+ /**
+ * Load urls from command line into the "NEW" playlist
+ * @returns if any url like "DVD", "VCD" was found
+ */
+ bool loadTMP(const QStringList&);
+
+ void setDevice(const QString& device)
+ {
+ m_device = device;
+ }
+
+ /*
+ * DCOP functions...
+ */
+ void openURL(QString url);
+ void appendURL(QString url);
+ void play();
+ void playAudioCD();
+ void playVCD();
+ void playDVD();
+ void pause();
+ void stop();
+ void next();
+ void previous();
+ void changePlaylist();
+ bool isPlaying();
+ bool isVideo();
+ QString title();
+ QString artist();
+ QString album();
+ QString track();
+ QString getFileName();
+ void random();
+ void fullscreen();
+ void minimal();
+ int getLength();
+ int getTimePos();
+ void posPlus();
+ void posMinus();
+ void volUp();
+ void volDown();
+ void mute();
+ void quit();
+ void setNumber( int num );
+ void dvbNewTimer( QString name, QString channel, QString datetime, QString duration );
+ int dvbSNR( int device );
+ void dvbOSD();
+ void dvbOSDNextChannel();
+ void dvbOSDPreviousChannel();
+ void dvbOSDNextProgram();
+ void dvbOSDPreviousProgram();
+ void dvbOSDZap();
+ void playDvb();
+ void reloadEngine();
+
+public slots:
+ void slotPlay(const MRL&);
+ void slotLoadURLS(const QStringList&);
+ void slotSwitchToPlayerWindow();
+ void slotChangeStatusbar(const QString&);
+ void slotChangePlaylistStatus(const QString&);
+ void slotStop();
+ void slotPlayUnPause();
+
+private:
+ void showEvent(QShowEvent*);
+ void hideEvent(QHideEvent*);
+
+ void closeEvent(QCloseEvent*);
+ // void dragEnterEvent(QDragEnterEvent*);
+ // void dropEvent(QDropEvent*);
+ void mouseDoubleClickEvent(QMouseEvent*);
+ void mouseMoveEvent(QMouseEvent*);
+ void mousePressEvent(QMouseEvent*);
+ void resizeEvent(QResizeEvent*);
+
+private slots:
+ void slotOpenFile();
+ void slotQuit();
+ void optionsConfigureKeys();
+ void optionsConfigureToolbars();
+ void applyNewToolbarConfig();
+ void slotFakeKeyEvent();
+ void slotChangeCaption(const QString&);
+ void slotOpenURL();
+ void slotOpenDirectory();
+ void slotPlaylistPlay();
+ void slotNext();
+ void slotRequestForCurrentTrack();
+ void slotRequestForNextTrack();
+ void slotRequestForPreviousTrack();
+ void slotRequestForTrackNumber();
+ void slotPlayRecent(const KURL&);
+ void slotMetaFromPlayer(const MRL &mrl);
+ void slotToggleFullscreen();
+ void slotEscapeFullscreen();
+ void slotToggleMinimalMode();
+ void slotToggleMinimalModeFromPlayer();
+ void slotTogglePlaylist();
+ void slotPreferences();
+ void slotOriginalAspect();
+ void slotAutoresizeOff();
+ void slotAutoresizeOriginal();
+ void slotAutoresizeDouble();
+ void slotAutoresizeTriple();
+ void slotNewFrameSize(const QSize&);
+ void slotCurrentTabChanged(QWidget*);
+ void slotClearRecent();
+ void slotLoadPart(const QString&);
+ void slotLoadingCanceled(const QString&);
+ void slotPlaybackFailed();
+ void slotSystemTray(bool);
+ void slotUseAlternateEncoding(bool);
+ void slotAlternateEncoding(const QString&);
+ void slotMute();
+ void slotSleepAfterPlay();
+ void slotSleepAfterPlayMenu();
+ void slotQuitAfterPlay();
+ void slotQuitAfterPlayMenu();
+ void slotQuitAfterPlaylistMenu();
+ void slotSetOSDTimeout(uint);
+ void slotPauseVideo(bool);
+ void slotDvbClient(bool,const QString&,int,int,const QString&);
+ void slotNumKeyInput( int );
+ void slotDVBNextBack( int );
+
+private:
+ void autoresize();
+ void setupAccel();
+ void setupActions();
+ void loadConfig();
+ void saveConfig();
+ void hideToolbars(bool);
+ QString askForOtherDevice(const QString&);
+ void unloadCurrentPart();
+
+ KaffeinePart* m_mediaPart;
+
+ InputManager *inplug;
+
+ QHBox *mainbox;
+ QVBox *playerWidget;
+ PlayerContainer* m_playerContainer;
+ PlayList* m_playlist;
+ Disc *cddisc;
+#ifdef HAVE_DVB
+ DvbPanel *dvbPanel;
+#endif
+ CdWidget *dvbClient;
+ StartWindow *m_startWindow;
+
+ bool m_dvbClientEnabled;
+ QString m_dvbClientAddress;
+ int m_dvbClientPort;
+ int m_dvbClientInfo;
+ QString m_dvbClientShiftPath;
+ SystemTray* m_systemTray;
+ QSize m_videoSize;
+ bool m_noResize;
+ bool m_embedSystemTray;
+ bool m_sleepInfo;
+ uint m_osdDuration;
+ uint m_autoResizeFactor;
+
+ bool m_useAlternateEncoding;
+ QString m_alternateEncoding;
+
+ bool m_autoPaused;
+ bool m_pauseVideo;
+
+ bool m_haveKWin;
+
+ bool haveXTest;
+ int fakeKeycode;
+
+ QString m_currentPartService;
+
+ QString m_device;
+ QString m_filter;
+ QStringList m_engineParameters;
+
+ KRecentFilesAction* m_recent;
+ KToggleFullScreenAction* m_fullscreen;
+ KToggleAction* m_minimal;
+ KToggleAction* m_autoResizeOff;
+ KToggleAction* m_autoResizeOriginal;
+ KToggleAction* m_autoResizeDouble;
+ KToggleAction* m_autoResizeTriple;
+ KToggleAction* m_originalAspect;
+ KToggleAction* m_toggleLayout;
+ KActionMenu* m_playersMenu;
+ KToggleAction* m_sleepAfterPlay;
+ KToggleAction* m_quitAfterPlay;
+ KToggleAction* m_quitAfterPlaylist;
+ bool m_statusBarVisible;
+
+ QTimer m_screensaverTimer;
+ QTimer m_numKeyHideTimer;
+ int m_numKey;
+ QString m_captionCache;
+
+signals:
+ void showOSD( const QString &text, int duration, int priority );
+
+private:
+ Kaffeine(const Kaffeine &);
+ Kaffeine &operator=(const Kaffeine &);
+};
+
+#endif /* KAFFEINE_H */
diff --git a/kaffeine/src/kaffeine.profile.xml b/kaffeine/src/kaffeine.profile.xml
new file mode 100644
index 0000000..c95f19d
--- /dev/null
+++ b/kaffeine/src/kaffeine.profile.xml
@@ -0,0 +1,136 @@
+<?xml version="1.0" ?>
+<!DOCTYPE profile SYSTEM "profile.dtd">
+
+<profile id="kaffeine" servicename="Kaffeine">
+ <name>Kaffeine</name>
+ <author>Gav Wood,Jürgen Kofler</author>
+
+ <action objid="KaffeineIface" prototype="void openURL(QString)">
+ <name>Play URL</name>
+ <comment>Starts playback of a specific URL.</comment>
+ <argument type="QString">
+ <comment>The URL to be played.</comment>
+ </argument>
+ </action>
+ <action objid="KaffeineIface" prototype="void play()" class="play">
+ <name>Play</name>
+ <comment>Starts playback of current track.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void pause()" class="pause">
+ <name>Pause</name>
+ <comment>Toggles between Playback and Pause.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void next()" class="next">
+ <name>Next</name>
+ <comment>Skips to start on the next track.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void previous()" class="previous">
+ <name>Previous</name>
+ <comment>Skips to the start of the last track.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void stop()" class="stop">
+ <name>Stop</name>
+ <comment>Stops current playback, if any.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void changePlaylist()">
+ <name>Change Playlist</name>
+ <comment>Change to the next kaffeine playlist.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="QString title()">
+ <name>Get Title</name>
+ <comment>Returns the title of current track.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void quit()" class="power">
+ <name>Quit</name>
+ <comment>Quits Kaffeine.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void random()">
+ <name>Playback Mode</name>
+ <comment>Toggles random playback mode.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void fullscreen()">
+ <name>Fullscreen</name>
+ <comment>Switches between windowed and fullscreen mode.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void posPlus()" class="forward">
+ <name>Forward</name>
+ <comment>Skips forward in the current track.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void posMinus()" class="rewind">
+ <name>Rewind</name>
+ <comment>Skips backward in the current track.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void volUp()">
+ <name>Volume Up</name>
+ <comment>Increase the volume.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void volDown()">
+ <name>Volume Down</name>
+ <comment>Decrease the volume.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void mute()">
+ <name>Mute</name>
+ <comment>Toggles mute on/off.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void setNumber(int)">
+ <name>Jump to playlistEntry/channel</name>
+ <comment>Enter playlistEntry/channel digit.</comment>
+ <argument type="int">
+ <comment>The digit (0..9) to sent.</comment>
+ </argument>
+ </action>
+ <action objid="KaffeineIface" prototype="void dvbOSD()">
+ <name>dvbOSD</name>
+ <comment>Show DVB current/next OSD.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void dvbOSDNextChannel()">
+ <name>dvbOSDNextChannel</name>
+ <comment>OSD next channel.</comment>
+ </action>
+
+ <action objid="KaffeineIface" prototype="void dvbOSDPreviousChannel()">
+ <name>dvbOSDPreviousChannel</name>
+ <comment>OSD previous channel.</comment>
+ </action>
+
+ <action objid="KaffeineIface" prototype="void dvbOSDNextProgram()">
+ <name>dvbOSDNextProgram</name>
+ <comment>OSD next program.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void dvbOSDPreviousProgram()">
+ <name>dvbOSDPreviousProgram</name>
+ <comment>OSD previous program.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void dvbOSDZap()">
+ <name>dvbOSDZap</name>
+ <comment>OSD zap.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void playDvb()">
+ <name>Recall</name>
+ <comment>Recall last DVB channel.</comment>
+ </action>
+ <action objid="KaffeineIface" prototype="void reloadEngine()">
+ <name>reloadEngine</name>
+ <comment>Reload current engine</comment>
+ </action>
+ <action objid="XinePartIface" prototype="void dvdMenuSelect()">
+ <name>dvdMenuSelect</name>
+ <comment>Select Dvd Menu.</comment>
+ </action>
+ <action objid="XinePartIface" prototype="void dvdMenuUp()">
+ <name>dvdMenuUp</name>
+ <comment>Move Up Dvd Menu.</comment>
+ </action>
+ <action objid="XinePartIface" prototype="void dvdMenuDown()">
+ <name>dvdMenuDown</name>
+ <comment>Move Down Dvd Menu.</comment>
+ </action>
+ <action objid="XinePartIface" prototype="void dvdMenuRight()">
+ <name>dvdMenuRight</name>
+ <comment>Move Right Dvd Menu.</comment>
+ </action>
+ <action objid="XinePartIface" prototype="void dvdMenuLeft()">
+ <name>dvdMenuLeft</name>
+ <comment>Move Left Dvd Menu.</comment>
+ </action>
+</profile>
diff --git a/kaffeine/src/kaffeineiface.h b/kaffeine/src/kaffeineiface.h
new file mode 100644
index 0000000..6552a67
--- /dev/null
+++ b/kaffeine/src/kaffeineiface.h
@@ -0,0 +1,141 @@
+/*
+ * kaffeineiface.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KAFFEINEIFACE_H
+#define KAFFEINEIFACE_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <dcopobject.h>
+
+class KaffeineIface : virtual public DCOPObject
+{
+ K_DCOP
+k_dcop:
+ /* Add url to playlist and play it */
+ virtual void openURL(QString url) = 0;
+
+ /* Append url to playlist */
+ virtual void appendURL(QString url) = 0;
+
+ /* Play next in playlist */
+ virtual void play() = 0;
+
+ /* Start playing audio CD */
+ virtual void playAudioCD() = 0;
+
+ /* Start playing video CD */
+ virtual void playVCD() = 0;
+
+ /* Start playing DVD */
+ virtual void playDVD() = 0;
+
+ /* Toggle pause / play */
+ virtual void pause() = 0;
+
+ /* Stop playback */
+ virtual void stop() = 0;
+
+ /* Play next in playlist */
+ virtual void next() = 0;
+
+ /* Play previous in playlist */
+ virtual void previous() = 0;
+
+ /* Change to next playlist */
+ virtual void changePlaylist() = 0;
+
+ /* Is currently playback in progress? */
+ virtual bool isPlaying() = 0;
+
+ /* Is a video being played? */
+ virtual bool isVideo() = 0;
+
+ /* Returns current track title */
+ virtual QString title() = 0;
+
+ /* Returns current artist */
+ virtual QString artist() = 0;
+
+ /* Returns current album */
+ virtual QString album() = 0;
+
+ /* Returns current track */
+ virtual QString track() = 0;
+
+ /* Returns current track file (media) name */
+ virtual QString getFileName() = 0;
+
+ /* Toggle random play */
+ virtual void random() = 0;
+
+ /* Toggle fullscreen / windowed mode */
+ virtual void fullscreen() = 0;
+
+ /* Switch to/from minimal mode */
+ virtual void minimal() = 0;
+
+ /* Returns current track length in seconds */
+ virtual int getLength() = 0;
+
+ /* Returns current track position in seconds */
+ virtual int getTimePos() = 0;
+
+ /* Increase stream position */
+ virtual void posPlus() = 0;
+
+ /* Decrease stream position */
+ virtual void posMinus() = 0;
+
+ /* Volume up */
+ virtual void volUp() = 0;
+
+ /* Volume down */
+ virtual void volDown() = 0;
+
+ /* Toggle mute */
+ virtual void mute() = 0;
+
+ /* Quit Kaffeine */
+ virtual void quit() = 0;
+
+ /* Jump to number */
+ virtual void setNumber(int num) = 0;
+
+ /* Create new DVB timer. datetime=2006-08-28T19:45:00, duration=01:55:00 */
+ virtual void dvbNewTimer(QString name, QString channel, QString datetime, QString duration) = 0;
+
+ virtual int dvbSNR(int device) = 0;
+
+ virtual void dvbOSD() = 0;
+ virtual void dvbOSDNextChannel() = 0;
+ virtual void dvbOSDPreviousChannel() = 0;
+ virtual void dvbOSDNextProgram() = 0;
+ virtual void dvbOSDPreviousProgram() = 0;
+ virtual void dvbOSDZap() = 0;
+
+ virtual void playDvb() = 0;
+
+ virtual void reloadEngine() = 0;
+};
+
+#endif /* KAFFEINEIFACE_H */
diff --git a/kaffeine/src/kaffeineui.rc b/kaffeine/src/kaffeineui.rc
new file mode 100644
index 0000000..f65f541
--- /dev/null
+++ b/kaffeine/src/kaffeineui.rc
@@ -0,0 +1,69 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="kaffeine" version="29">
+<MenuBar>
+ <Menu noMerge="1" name="file"><text>&amp;File</text>
+ <Action name="file_open"/>
+ <Action name="file_open_url"/>
+ <Action name="file_open_directory"/>
+ <Action name="file_open_recent"/>
+ <Separator/>
+ <Merge/>
+ <Separator/>
+ <Menu name="quit_options"><text>Quit Options</text>
+ <Action name="sleep_after_play"/>
+ <Action name="quit_after_play"/>
+ <Action name="quit_after_playlist"/>
+ </Menu>
+ <Action name="file_quit"/>
+ </Menu>
+ <Menu name="player"><text>&amp;Player</text>
+ </Menu>
+ <Menu name="view"><text>&amp;View</text>
+ <Action name="view_fullscreen"/>
+ <Action name="view_minimal"/>
+ <Action name="view_toggle_tab"/>
+ <Separator/>
+ <Menu><text>Enable Auto &amp;Resize</text>
+ <Action name="view_auto_resize_off"/>
+ <Action name="view_auto_resize_original"/>
+ <Action name="view_auto_resize_double"/>
+ <Action name="view_auto_resize_triple"/>
+ </Menu>
+ <Action name="view_original_aspect"/>
+ </Menu>
+ <Merge/>
+ <Menu noMerge="1" name="settings"><text>&amp;Settings</text>
+ <Action name="options_player"/>
+ <Separator/>
+ <Merge name="StandardToolBarMenuHandler"/>
+ <Action name="options_show_statusbar"/>
+ <Separator/>
+ <Action name="options_configure_keybinding"/>
+ <Action name="options_configure_toolbars"/>
+ <Separator/>
+ <Merge/>
+ <Separator/>
+ <Action name="options_preferences"/>
+ </Menu>
+</MenuBar>
+<ToolBar noMerge="1" name="mainToolBar" hidden="true"><text>Main Toolbar</text>
+ <Action name="file_open"/>
+ <Action name="file_open_url"/>
+ <Merge/>
+</ToolBar>
+<State name="no_media_part">
+<disable>
+ <Action name="view_original_aspect"/>
+ <Action name="view_auto_resize"/>
+ <Action name="dvb_next"/>
+ <Action name="dvb_previous"/>
+ <Action name="dvb_show_osd"/>
+ <Action name="dvb_instant_record"/>
+ <Action name="dvb_browse_next" />
+ <Action name="dvb_browse_prev" />
+ <Action name="dvb_browse_zap" />
+ <Action name="dvb_browse_advance" />
+ <Action name="dvb_browse_retreat" />
+</disable>
+</State>
+</kpartgui>
diff --git a/kaffeine/src/kmultitabbar.cpp b/kaffeine/src/kmultitabbar.cpp
new file mode 100644
index 0000000..3937b3f
--- /dev/null
+++ b/kaffeine/src/kmultitabbar.cpp
@@ -0,0 +1,999 @@
+/*
+ * kmultitabbar.cpp
+ *
+ * Copyright (C) 2001,2002,2003 Joseph Wenninger <jowenn@kde.org>
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "kmultitabbar.h"
+#include "kmultitabbar.moc"
+#include "kmultitabbar_p.h"
+#include "kmultitabbar_p.moc"
+#include <qbutton.h>
+#include <qpopupmenu.h>
+#include <qlayout.h>
+#include <qpainter.h>
+#include <qtooltip.h>
+#include <qfontmetrics.h>
+#include <qstyle.h>
+
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <qapplication.h>
+#include <math.h>
+
+#define NEARBYINT(i) ((int(float(i) + 0.5)))
+
+class KMultiTabBarTabPrivate {
+public:
+ QPixmap pix;
+};
+
+
+KMultiTabBarInternal::KMultiTabBarInternal(QWidget *parent, KMultiTabBar::KMultiTabBarMode bm):QScrollView(parent)
+{
+ m_expandedTabSize=-1;
+ m_showActiveTabTexts=false;
+ m_tabs.setAutoDelete(true);
+ m_barMode=bm;
+ setHScrollBarMode(AlwaysOff);
+ setVScrollBarMode(AlwaysOff);
+ if (bm==KMultiTabBar::Vertical)
+ {
+ box=new QWidget(viewport());
+ mainLayout=new QVBoxLayout(box);
+ mainLayout->setAutoAdd(true);
+ box->setFixedWidth(24);
+ setFixedWidth(24);
+ }
+ else
+ {
+ box=new QWidget(viewport());
+ mainLayout=new QHBoxLayout(box);
+ mainLayout->setAutoAdd(true);
+ box->setFixedHeight(24);
+ setFixedHeight(24);
+ }
+ addChild(box);
+ setFrameStyle(NoFrame);
+ viewport()->setBackgroundMode(Qt::PaletteBackground);
+/* box->setPaletteBackgroundColor(Qt::red);
+ setPaletteBackgroundColor(Qt::green);*/
+}
+
+void KMultiTabBarInternal::setStyle(enum KMultiTabBar::KMultiTabBarStyle style)
+{
+ m_style=style;
+ for (uint i=0;i<m_tabs.count();i++)
+ m_tabs.at(i)->setStyle(m_style);
+
+ if ( (m_style==KMultiTabBar::KDEV3) ||
+ (m_style==KMultiTabBar::KDEV3ICON ) ) {
+ delete mainLayout;
+ mainLayout=0;
+ resizeEvent(0);
+ } else if (mainLayout==0) {
+ if (m_barMode==KMultiTabBar::Vertical)
+ {
+ box=new QWidget(viewport());
+ mainLayout=new QVBoxLayout(box);
+ box->setFixedWidth(24);
+ setFixedWidth(24);
+ }
+ else
+ {
+ box=new QWidget(viewport());
+ mainLayout=new QHBoxLayout(box);
+ box->setFixedHeight(24);
+ setFixedHeight(24);
+ }
+ addChild(box);
+ for (uint i=0;i<m_tabs.count();i++)
+ mainLayout->add(m_tabs.at(i));
+ mainLayout->setAutoAdd(true);
+
+ }
+ viewport()->repaint();
+}
+
+void KMultiTabBarInternal::drawContents ( QPainter * paint, int clipx, int clipy, int clipw, int cliph )
+{
+ QScrollView::drawContents (paint , clipx, clipy, clipw, cliph );
+
+ if (m_position==KMultiTabBar::Right)
+ {
+
+ paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,0,0,viewport()->height());
+ paint->setPen(colorGroup().background().dark(120));
+ paint->drawLine(1,0,1,viewport()->height());
+
+
+ }
+ else
+ if (m_position==KMultiTabBar::Left)
+ {
+ paint->setPen(colorGroup().light());
+ paint->drawLine(23,0,23,viewport()->height());
+ paint->drawLine(22,0,22,viewport()->height());
+
+ paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,0,0,viewport()->height());
+ }
+ else
+ if (m_position==KMultiTabBar::Bottom)
+ {
+ paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,0,viewport()->width(),0);
+ paint->setPen(colorGroup().background().dark(120));
+ paint->drawLine(0,1,viewport()->width(),1);
+ }
+ else
+ {
+ paint->setPen(colorGroup().light());
+ paint->drawLine(0,23,viewport()->width(),23);
+ paint->drawLine(0,22,viewport()->width(),22);
+
+/* paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,0,0,viewport()->height());*/
+
+ }
+
+
+}
+
+void KMultiTabBarInternal::contentsMousePressEvent(QMouseEvent *ev)
+{
+ ev->ignore();
+}
+
+void KMultiTabBarInternal::mousePressEvent(QMouseEvent *ev)
+{
+ ev->ignore();
+}
+
+
+#define CALCDIFF(m_tabs,diff,i) if (m_lines>(int)lines) {\
+ /*kdDebug()<<"i="<<i<<" tabCount="<<tabCount<<" space="<<space<<endl;*/ \
+ uint ulen=0;\
+ diff=0; \
+ for (uint i2=i;i2<tabCount;i2++) {\
+ uint l1=m_tabs.at(i2)->neededSize();\
+ if ((ulen+l1)>space){\
+ if (ulen==0) diff=0;\
+ else diff=((float)(space-ulen))/(i2-i);\
+ break;\
+ }\
+ ulen+=l1;\
+ }\
+ } else {diff=0; }
+
+
+void KMultiTabBarInternal::resizeEvent(QResizeEvent *ev) {
+/* kdDebug()<<"KMultiTabBarInternal::resizeEvent"<<endl;
+ kdDebug()<<"KMultiTabBarInternal::resizeEvent - box geometry"<<box->geometry()<<endl;
+ kdDebug()<<"KMultiTabBarInternal::resizeEvent - geometry"<<geometry()<<endl;*/
+ if (ev) QScrollView::resizeEvent(ev);
+
+ if ( (m_style==KMultiTabBar::KDEV3) ||
+ (m_style==KMultiTabBar::KDEV3ICON) ){
+ box->setGeometry(0,0,width(),height());
+ int lines=1;
+ uint space;
+ float tmp=0;
+ if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top))
+ space=width();
+ else
+ space=height();
+
+ int cnt=0;
+//CALCULATE LINES
+ const uint tabCount=m_tabs.count();
+ for (uint i=0;i<tabCount;i++) {
+ cnt++;
+ tmp+=m_tabs.at(i)->neededSize();
+ if (tmp>space) {
+ if (cnt>1)i--;
+ else if (i==(tabCount-1)) break;
+ cnt=0;
+ tmp=0;
+ lines++;
+ }
+ }
+//SET SIZE & PLACE
+ float diff=0;
+ cnt=0;
+
+ if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top)) {
+
+ setFixedHeight(lines*24);
+ box->setFixedHeight(lines*24);
+ m_lines=height()/24-1;
+ lines=0;
+ CALCDIFF(m_tabs,diff,0)
+ tmp=-diff;
+
+ //kdDebug()<<"m_lines recalculated="<<m_lines<<endl;
+ for (uint i=0;i<tabCount;i++) {
+ KMultiTabBarTab *tab=m_tabs.at(i);
+ cnt++;
+ tmp+=tab->neededSize()+diff;
+ if (tmp>space) {
+ //kdDebug()<<"about to start new line"<<endl;
+ if (cnt>1) {
+ CALCDIFF(m_tabs,diff,i)
+ i--;
+ }
+ else {
+ //kdDebug()<<"placing line on old line"<<endl;
+ kdDebug()<<"diff="<<diff<<endl;
+ tab->removeEventFilter(this);
+ tab->move(NEARBYINT(tmp-tab->neededSize()),lines*24);
+// tab->setFixedWidth(tab->neededSize()+diff);
+ tab->setFixedWidth(NEARBYINT(tmp+diff)-tab->x());;
+ tab->installEventFilter(this);
+ CALCDIFF(m_tabs,diff,(i+1))
+
+ }
+ tmp=-diff;
+ cnt=0;
+ lines++;
+ //kdDebug()<<"starting new line:"<<lines<<endl;
+
+ } else {
+ //kdDebug()<<"Placing line on line:"<<lines<<" pos: (x/y)=("<<tmp-m_tabs.at(i)->neededSize()<<"/"<<lines*24<<")"<<endl;
+ //kdDebug()<<"diff="<<diff<<endl;
+ tab->removeEventFilter(this);
+ tab->move(NEARBYINT(tmp-tab->neededSize()),lines*24);
+ tab->setFixedWidth(NEARBYINT(tmp+diff)-tab->x());;
+
+ //tab->setFixedWidth(tab->neededSize()+diff);
+ tab->installEventFilter(this);
+
+ }
+ }
+ }
+ else {
+ setFixedWidth(lines*24);
+ box->setFixedWidth(lines*24);
+ m_lines=lines=width()/24;
+ lines=0;
+ CALCDIFF(m_tabs,diff,0)
+ tmp=-diff;
+
+ for (uint i=0;i<tabCount;i++) {
+ KMultiTabBarTab *tab=m_tabs.at(i);
+ cnt++;
+ tmp+=tab->neededSize()+diff;
+ if (tmp>space) {
+ if (cnt>1) {
+ CALCDIFF(m_tabs,diff,i);
+ tmp=-diff;
+ i--;
+ }
+ else {
+ tab->removeEventFilter(this);
+ tab->move(lines*24,NEARBYINT(tmp-tab->neededSize()));
+ tab->setFixedHeight(NEARBYINT(tmp+diff)-tab->y());;
+ tab->installEventFilter(this);
+ }
+ cnt=0;
+ tmp=-diff;
+ lines++;
+ } else {
+ tab->removeEventFilter(this);
+ tab->move(lines*24,NEARBYINT(tmp-tab->neededSize()));
+ tab->setFixedHeight(NEARBYINT(tmp+diff)-tab->y());;
+ tab->installEventFilter(this);
+ }
+ }
+ }
+
+
+ //kdDebug()<<"needed lines:"<<m_lines<<endl;
+ } else {
+ int size=0; /*move the calculation into another function and call it only on add tab and tab click events*/
+ for (int i=0;i<(int)m_tabs.count();i++)
+ size+=(m_barMode==KMultiTabBar::Vertical?m_tabs.at(i)->height():m_tabs.at(i)->width());
+ if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top))
+ box->setGeometry(0,0,size,height());
+ else box->setGeometry(0,0,width(),size);
+
+ }
+}
+
+
+void KMultiTabBarInternal::showActiveTabTexts(bool show)
+{
+ m_showActiveTabTexts=show;
+}
+
+
+KMultiTabBarTab* KMultiTabBarInternal::tab(int id) const
+{
+ for (QPtrListIterator<KMultiTabBarTab> it(m_tabs);it.current();++it){
+ if (it.current()->id()==id) return it.current();
+ }
+ return 0;
+}
+
+bool KMultiTabBarInternal::eventFilter(QObject *, QEvent *e) {
+ if (e->type()==QEvent::Resize) resizeEvent(0);
+ return false;
+}
+
+int KMultiTabBarInternal::appendTab(const QPixmap &pic ,int id,const QString& text)
+{
+ KMultiTabBarTab *tab;
+ m_tabs.append(tab= new KMultiTabBarTab(pic,text,id,box,m_position,m_style));
+ tab->installEventFilter(this);
+ tab->showActiveTabText(m_showActiveTabTexts);
+
+ if (m_style==KMultiTabBar::KONQSBC)
+ {
+ if (m_expandedTabSize<tab->neededSize()) {
+ m_expandedTabSize=tab->neededSize();
+ for (uint i=0;i<m_tabs.count();i++)
+ m_tabs.at(i)->setSize(m_expandedTabSize);
+
+ } else tab->setSize(m_expandedTabSize);
+ } else tab->updateState();
+ tab->show();
+ resizeEvent(0);
+ return 0;
+}
+
+void KMultiTabBarInternal::removeTab(int id)
+{
+ for (uint pos=0;pos<m_tabs.count();pos++)
+ {
+ if (m_tabs.at(pos)->id()==id)
+ {
+ m_tabs.remove(pos);
+ resizeEvent(0);
+ break;
+ }
+ }
+}
+
+void KMultiTabBarInternal::setPosition(enum KMultiTabBar::KMultiTabBarPosition pos)
+{
+ m_position=pos;
+ for (uint i=0;i<m_tabs.count();i++)
+ m_tabs.at(i)->setTabsPosition(m_position);
+ viewport()->repaint();
+}
+
+
+KMultiTabBarButton::KMultiTabBarButton(const QPixmap& pic,const QString& text, QPopupMenu *popup,
+ int id,QWidget *parent,KMultiTabBar::KMultiTabBarPosition pos,KMultiTabBar::KMultiTabBarStyle style)
+ :QPushButton(QIconSet(),text,parent),m_style(style)
+{
+ setIconSet(pic);
+ setText(text);
+ m_position=pos;
+ if (popup) setPopup(popup);
+ setFlat(true);
+ setFixedHeight(24);
+ setFixedWidth(24);
+ m_id=id;
+ QToolTip::add(this,text);
+ connect(this,SIGNAL(clicked()),this,SLOT(slotClicked()));
+}
+
+KMultiTabBarButton::KMultiTabBarButton(const QString& text, QPopupMenu *popup,
+ int id,QWidget *parent,KMultiTabBar::KMultiTabBarPosition pos,KMultiTabBar::KMultiTabBarStyle style)
+ :QPushButton(QIconSet(),text,parent),m_style(style)
+{
+ setText(text);
+ m_position=pos;
+ if (popup) setPopup(popup);
+ setFlat(true);
+ setFixedHeight(24);
+ setFixedWidth(24);
+ m_id=id;
+ QToolTip::add(this,text);
+ connect(this,SIGNAL(clicked()),this,SLOT(slotClicked()));
+}
+
+KMultiTabBarButton::~KMultiTabBarButton() {
+}
+
+int KMultiTabBarButton::id() const{
+ return m_id;
+}
+
+void KMultiTabBarButton::setText(const QString& text)
+{
+ QPushButton::setText(text);
+ m_text=text;
+ QToolTip::add(this,text);
+}
+
+void KMultiTabBarButton::slotClicked()
+{
+ emit clicked(m_id);
+}
+
+void KMultiTabBarButton::setPosition(KMultiTabBar::KMultiTabBarPosition pos)
+{
+ m_position=pos;
+ repaint();
+}
+
+void KMultiTabBarButton::setStyle(KMultiTabBar::KMultiTabBarStyle style)
+{
+ m_style=style;
+ repaint();
+}
+
+void KMultiTabBarButton::hideEvent( QHideEvent* he) {
+ QPushButton::hideEvent(he);
+ KMultiTabBar *tb=dynamic_cast<KMultiTabBar*>(parentWidget());
+ if (tb) tb->updateSeparator();
+}
+
+void KMultiTabBarButton::showEvent( QShowEvent* he) {
+ QPushButton::showEvent(he);
+ KMultiTabBar *tb=dynamic_cast<KMultiTabBar*>(parentWidget());
+ if (tb) tb->updateSeparator();
+}
+
+
+QSize KMultiTabBarButton::sizeHint() const
+{
+ constPolish();
+
+ int w = 0, h = 0;
+
+ // calculate contents size...
+#ifndef QT_NO_ICONSET
+ if ( iconSet() && !iconSet()->isNull() ) {
+ int iw = iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).width() + 4;
+ int ih = iconSet()->pixmap( QIconSet::Small, QIconSet::Normal ).height();
+ w += iw;
+ h = QMAX( h, ih );
+ }
+#endif
+ if ( isMenuButton() )
+ w += style().pixelMetric(QStyle::PM_MenuButtonIndicator, this);
+
+ if ( pixmap() ) {
+ QPixmap *pm = (QPixmap *)pixmap();
+ w += pm->width();
+ h += pm->height();
+ } else {
+ QString s( text() );
+ bool empty = s.isEmpty();
+ if ( empty )
+ s = QString::fromLatin1("XXXX");
+ QFontMetrics fm = fontMetrics();
+ QSize sz = fm.size( ShowPrefix, s );
+ if(!empty || !w)
+ w += sz.width();
+ if(!empty || !h)
+ h = QMAX(h, sz.height());
+ }
+
+ return (style().sizeFromContents(QStyle::CT_ToolButton, this, QSize(w, h)).
+ expandedTo(QApplication::globalStrut()));
+}
+
+
+KMultiTabBarTab::KMultiTabBarTab(const QPixmap& pic, const QString& text,
+ int id,QWidget *parent,KMultiTabBar::KMultiTabBarPosition pos,
+ KMultiTabBar::KMultiTabBarStyle style)
+ :KMultiTabBarButton(text,0,id,parent,pos,style),
+ m_showActiveTabText(false)
+{
+ down = false;
+ d=new KMultiTabBarTabPrivate();
+ setIcon(pic);
+ m_expandedSize=24;
+ //setToggleButton(true);
+}
+
+KMultiTabBarTab::~KMultiTabBarTab() {
+ delete d;
+}
+
+
+void KMultiTabBarTab::setTabsPosition(KMultiTabBar::KMultiTabBarPosition pos)
+{
+ if ((pos!=m_position) && ((pos==KMultiTabBar::Left) || (pos==KMultiTabBar::Right))) {
+ if (!d->pix.isNull()) {
+ QWMatrix temp;// (1.0F, 0.0F, 0.0F, -1.0F, 0.0F, 0.0F);
+ temp.rotate(180);
+ d->pix=d->pix.xForm(temp);
+ setIconSet(d->pix);
+ }
+ }
+
+ setPosition(pos);
+// repaint();
+}
+
+void KMultiTabBarTab::setIcon(const QString& icon)
+{
+ QPixmap pic=SmallIcon(icon);
+ setIcon(pic);
+}
+
+void KMultiTabBarTab::setIcon(const QPixmap& icon)
+{
+
+ if (m_style!=KMultiTabBar::KDEV3) {
+ if ((m_position==KMultiTabBar::Left) || (m_position==KMultiTabBar::Right)) {
+ QWMatrix rotateMatrix;
+ if (m_position==KMultiTabBar::Left)
+ rotateMatrix.rotate(90);
+ else
+ rotateMatrix.rotate(-90);
+ QPixmap pic=icon.xForm(rotateMatrix); //TODO FIX THIS, THIS SHOWS WINDOW
+ d->pix=pic;
+ setIconSet(pic);
+ } else setIconSet(icon);
+ }
+}
+
+void KMultiTabBarTab::slotClicked()
+{
+ down = true;
+ updateState();
+ KMultiTabBarButton::slotClicked();
+}
+
+void KMultiTabBarTab::setState(bool b)
+{
+ down = b;
+ updateState();
+}
+
+void KMultiTabBarTab::updateState()
+{
+
+ if (m_style!=KMultiTabBar::KONQSBC) {
+ if ((m_style==KMultiTabBar::KDEV3) || (m_style==KMultiTabBar::KDEV3ICON) || (down)) {
+ QPushButton::setText(m_text);
+ } else {
+ //kdDebug()<<"KMultiTabBarTab::updateState(): setting text to an empty QString***************"<<endl;
+ QPushButton::setText(QString::null);
+ }
+
+ if ((m_position==KMultiTabBar::Right || m_position==KMultiTabBar::Left)) {
+ setFixedWidth(24);
+ if ((m_style==KMultiTabBar::KDEV3) || (m_style==KMultiTabBar::KDEV3ICON) || (down)) {
+ setFixedHeight(KMultiTabBarButton::sizeHint().width());
+ } else setFixedHeight(36);
+ } else {
+ setFixedHeight(24);
+ if ((m_style==KMultiTabBar::KDEV3) || (m_style==KMultiTabBar::KDEV3ICON) || (down)) {
+ setFixedWidth(KMultiTabBarButton::sizeHint().width());
+ } else setFixedWidth(36);
+ }
+ } else {
+ if ((!down) || (!m_showActiveTabText))
+ {
+ setFixedWidth(24);
+ setFixedHeight(24);
+ return;
+ }
+ if ((m_position==KMultiTabBar::Right || m_position==KMultiTabBar::Left))
+ setFixedHeight(m_expandedSize);
+ else
+ setFixedWidth(m_expandedSize);
+ }
+ QApplication::sendPostedEvents(0,QEvent::Paint | QEvent::Move | QEvent::Resize | QEvent::LayoutHint);
+ QApplication::flush();
+}
+
+int KMultiTabBarTab::neededSize()
+{
+ return (((m_style!=KMultiTabBar::KDEV3)?24:0)+QFontMetrics(QFont()).width(m_text)+6);
+}
+
+void KMultiTabBarTab::setSize(int size)
+{
+ m_expandedSize=size;
+ updateState();
+}
+
+void KMultiTabBarTab::showActiveTabText(bool show)
+{
+ m_showActiveTabText=show;
+}
+
+void KMultiTabBarTab::drawButtonLabel(QPainter *p) {
+ drawButton(p);
+}
+void KMultiTabBarTab::drawButton(QPainter *paint)
+{
+ if (m_style!=KMultiTabBar::KONQSBC) drawButtonStyled(paint);
+ else drawButtonClassic(paint);
+}
+
+void KMultiTabBarTab::drawButtonStyled(QPainter *paint) {
+
+ QSize sh;
+ const int width = 36; // rotated
+ const int height = 24;
+ if ((m_style==KMultiTabBar::KDEV3) || (m_style==KMultiTabBar::KDEV3ICON) || (down)) {
+ if ((m_position==KMultiTabBar::Left) || (m_position==KMultiTabBar::Right))
+ sh=QSize(this->height(),this->width());//KMultiTabBarButton::sizeHint();
+ else sh=QSize(this->width(),this->height());
+ }
+ else
+ sh=QSize(width,height);
+
+ QPixmap pixmap( sh.width(),height); ///,sh.height());
+ pixmap.fill(eraseColor());
+ QPainter painter(&pixmap);
+
+
+ QStyle::SFlags st=QStyle::Style_Default;
+
+ st|=QStyle::Style_Enabled;
+
+ if (down) st|=QStyle::Style_On;
+
+ style().drawControl(QStyle::CE_PushButton,&painter,this, QRect(0,0,pixmap.width(),pixmap.height()), colorGroup(),st);
+ style().drawControl(QStyle::CE_PushButtonLabel,&painter,this, QRect(0,0,pixmap.width(),pixmap.height()), colorGroup(),st);
+
+ switch (m_position) {
+ case KMultiTabBar::Left:
+ paint->rotate(-90);
+ paint->drawPixmap(1-pixmap.width(),0,pixmap);
+ break;
+ case KMultiTabBar::Right:
+ paint->rotate(90);
+ paint->drawPixmap(0,1-pixmap.height(),pixmap);
+ break;
+
+ default:
+ paint->drawPixmap(0,0,pixmap);
+ break;
+ }
+// style().drawControl(QStyle::CE_PushButtonLabel,painter,this, QRect(0,0,pixmap.width(),pixmap.height()),
+// colorGroup(),QStyle::Style_Enabled);
+
+
+}
+
+void KMultiTabBarTab::drawButtonClassic(QPainter *paint)
+{
+ QPixmap pixmap;
+ if ( iconSet())
+ pixmap = iconSet()->pixmap( QIconSet::Small, QIconSet::Normal );
+ paint->fillRect(0, 0, 24, 24, colorGroup().background());
+
+ if (!down)
+ {
+
+ if (m_position==KMultiTabBar::Right)
+ {
+ paint->fillRect(0,0,21,21,QBrush(colorGroup().background()));
+
+ paint->setPen(colorGroup().background().dark(150));
+ paint->drawLine(0,22,23,22);
+
+ paint->drawPixmap(12-pixmap.width()/2,12-pixmap.height()/2,pixmap);
+
+ paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,0,0,23);
+ paint->setPen(colorGroup().background().dark(120));
+ paint->drawLine(1,0,1,23);
+
+ }
+ else
+ if ((m_position==KMultiTabBar::Bottom) || (m_position==KMultiTabBar::Top))
+ {
+ paint->fillRect(0,1,23,22,QBrush(colorGroup().background()));
+
+ paint->drawPixmap(12-pixmap.width()/2,12-pixmap.height()/2,pixmap);
+
+ paint->setPen(colorGroup().background().dark(120));
+ paint->drawLine(23,0,23,23);
+
+
+ paint->setPen(colorGroup().light());
+ paint->drawLine(0,22,23,22);
+ paint->drawLine(0,23,23,23);
+ paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,0,23,0);
+ paint->setPen(colorGroup().background().dark(120));
+ paint->drawLine(0,1,23,1);
+
+ }
+ else
+ {
+ paint->setPen(colorGroup().background().dark(120));
+ paint->drawLine(0,23,23,23);
+ paint->fillRect(0,0,23,21,QBrush(colorGroup().background()));
+ paint->drawPixmap(12-pixmap.width()/2,12-pixmap.height()/2,pixmap);
+
+ paint->setPen(colorGroup().light());
+ paint->drawLine(23,0,23,23);
+ paint->drawLine(22,0,22,23);
+
+ paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,0,0,23);
+
+ }
+
+
+ }
+ else
+ {
+ if (m_position==KMultiTabBar::Right)
+ {
+ paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,height()-1,23,height()-1);
+ paint->drawLine(0,height()-2,23,height()-2);
+ paint->drawLine(23,0,23,height()-1);
+ paint->drawLine(22,0,22,height()-1);
+ paint->fillRect(0,0,21,height()-3,QBrush(colorGroup().light()));
+ paint->drawPixmap(10-pixmap.width()/2,10-pixmap.height()/2,pixmap);
+
+ if (m_showActiveTabText)
+ {
+ if (height()<25+4) return;
+
+ QPixmap tpixmap(height()-25-3, width()-2);
+ QPainter painter(&tpixmap);
+
+ painter.fillRect(0,0,tpixmap.width(),tpixmap.height(),QBrush(colorGroup().light()));
+
+ painter.setPen(colorGroup().text());
+ painter.drawText(0,+width()/2+QFontMetrics(QFont()).height()/2,m_text);
+
+ paint->rotate(90);
+ kdDebug()<<"tpixmap.width:"<<tpixmap.width()<<endl;
+ paint->drawPixmap(25,-tpixmap.height()+1,tpixmap);
+ }
+
+ }
+ else
+ if (m_position==KMultiTabBar::Top)
+ {
+ paint->fillRect(0,0,width()-1,23,QBrush(colorGroup().light()));
+ paint->drawPixmap(10-pixmap.width()/2,10-pixmap.height()/2,pixmap);
+ if (m_showActiveTabText)
+ {
+ paint->setPen(colorGroup().text());
+ paint->drawText(25,height()/2+QFontMetrics(QFont()).height()/2,m_text);
+ }
+ }
+ else
+ if (m_position==KMultiTabBar::Bottom)
+ {
+ paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,23,width()-1,23);
+ paint->drawLine(0,22,width()-1,22);
+ paint->fillRect(0,0,width()-1,21,QBrush(colorGroup().light()));
+ paint->drawPixmap(10-pixmap.width()/2,10-pixmap.height()/2,pixmap);
+ if (m_showActiveTabText)
+ {
+ paint->setPen(colorGroup().text());
+ paint->drawText(25,height()/2+QFontMetrics(QFont()).height()/2,m_text);
+ }
+
+ }
+ else
+ {
+
+
+ paint->setPen(colorGroup().shadow());
+ paint->drawLine(0,height()-1,23,height()-1);
+ paint->drawLine(0,height()-2,23,height()-2);
+ paint->fillRect(0,0,23,height()-3,QBrush(colorGroup().light()));
+ paint->drawPixmap(10-pixmap.width()/2,10-pixmap.height()/2,pixmap);
+ if (m_showActiveTabText)
+ {
+
+ if (height()<25+4) return;
+
+ QPixmap tpixmap(height()-25-3, width()-2);
+ QPainter painter(&tpixmap);
+
+ painter.fillRect(0,0,tpixmap.width(),tpixmap.height(),QBrush(colorGroup().light()));
+
+ painter.setPen(colorGroup().text());
+ painter.drawText(tpixmap.width()-QFontMetrics(QFont()).width(m_text),+width()/2+QFontMetrics(QFont()).height()/2,m_text);
+
+ paint->rotate(-90);
+ kdDebug()<<"tpixmap.width:"<<tpixmap.width()<<endl;
+
+ paint->drawPixmap(-24-tpixmap.width(),2,tpixmap);
+
+ }
+
+ }
+
+ }
+}
+
+
+
+
+
+
+
+KMultiTabBar::KMultiTabBar(KMultiTabBarMode bm, QWidget *parent,const char *name):QWidget(parent,name)
+{
+ m_buttons.setAutoDelete(false);
+ if (bm==Vertical)
+ {
+ m_l=new QVBoxLayout(this);
+ setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding, true);
+// setFixedWidth(24);
+ }
+ else
+ {
+ m_l=new QHBoxLayout(this);
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed, true);
+// setFixedHeight(24);
+ }
+ m_l->setMargin(0);
+ m_l->setAutoAdd(false);
+
+ m_internal=new KMultiTabBarInternal(this,bm);
+ setPosition((bm==KMultiTabBar::Vertical)?KMultiTabBar::Right:KMultiTabBar::Bottom);
+ setStyle(VSNET);
+ // setStyle(KDEV3);
+ //setStyle(KONQSBC);
+ m_l->insertWidget(0,m_internal);
+ m_l->insertWidget(0,m_btnTabSep=new QFrame(this));
+ m_btnTabSep->setFixedHeight(4);
+ m_btnTabSep->setFrameStyle(QFrame::Panel | QFrame::Sunken);
+ m_btnTabSep->setLineWidth(2);
+ m_btnTabSep->hide();
+
+ updateGeometry();
+}
+
+KMultiTabBar::~KMultiTabBar() {
+}
+
+/*int KMultiTabBar::insertButton(QPixmap pic,int id ,const QString&)
+{
+ (new KToolbarButton(pic,id,m_internal))->show();
+ return 0;
+}*/
+
+int KMultiTabBar::appendButton(const QPixmap &pic ,int id,QPopupMenu *popup,const QString&)
+{
+ KMultiTabBarButton *btn;
+ m_buttons.append(btn= new KMultiTabBarButton(pic,QString::null,
+ popup,id,this,m_position,m_internal->m_style));
+ m_l->insertWidget(0,btn);
+ btn->show();
+ m_btnTabSep->show();
+ return 0;
+}
+
+void KMultiTabBar::updateSeparator() {
+ bool hideSep=true;
+ for (QPtrListIterator<KMultiTabBarButton> it(m_buttons);it.current();++it){
+ if (it.current()->isVisibleTo(this)) {
+ hideSep=false;
+ break;
+ }
+ }
+ if (hideSep) m_btnTabSep->hide();
+ else m_btnTabSep->show();
+
+}
+
+int KMultiTabBar::appendTab(const QPixmap &pic ,int id ,const QString& text)
+{
+ m_internal->appendTab(pic,id,text);
+ connect( tab(id),SIGNAL(clicked(int)), this, SLOT(tabClicked(int)) );
+ return 0;
+}
+
+void KMultiTabBar::tabClicked( int id )
+{
+ for (QPtrListIterator<KMultiTabBarTab> it(m_internal->m_tabs);it.current();++it){
+ if (it.current()->id()!=id && it.current()->down )
+ it.current()->setState(false);
+ }
+}
+
+KMultiTabBarButton* KMultiTabBar::button(int id) const
+{
+ for (QPtrListIterator<KMultiTabBarButton> it(m_buttons);it.current();++it){
+ if (it.current()->id()!=id) return it.current();
+ }
+ return 0;
+}
+
+KMultiTabBarTab* KMultiTabBar::tab(int id) const
+{
+ return m_internal->tab(id);
+}
+
+
+
+void KMultiTabBar::removeButton(int id)
+{
+ for (uint pos=0;pos<m_buttons.count();pos++)
+ {
+ if (m_buttons.at(pos)->id()==id)
+ {
+ m_buttons.take(pos)->deleteLater();
+ break;
+ }
+ }
+ if (m_buttons.count()==0) m_btnTabSep->hide();
+}
+
+void KMultiTabBar::removeTab(int id)
+{
+ m_internal->removeTab(id);
+}
+
+void KMultiTabBar::setTab(int id,bool state)
+{
+ KMultiTabBarTab *ttab=tab(id);
+ if (ttab)
+ {
+ ttab->setState(state);
+ }
+}
+
+bool KMultiTabBar::isTabRaised(int id) const
+{
+ KMultiTabBarTab *ttab=tab(id);
+ if (ttab)
+ {
+ return ttab->down;
+ }
+
+ return false;
+}
+
+
+void KMultiTabBar::showActiveTabTexts(bool show)
+{
+ m_internal->showActiveTabTexts(show);
+}
+
+void KMultiTabBar::setStyle(KMultiTabBarStyle style)
+{
+ m_internal->setStyle(style);
+}
+
+void KMultiTabBar::setPosition(KMultiTabBarPosition pos)
+{
+ m_position=pos;
+ m_internal->setPosition(pos);
+ for (uint i=0;i<m_buttons.count();i++)
+ m_buttons.at(i)->setPosition(pos);
+}
+void KMultiTabBar::fontChange(const QFont& /* oldFont */)
+{
+ for (uint i=0;i<tabs()->count();i++)
+ tabs()->at(i)->resize();
+ repaint();
+}
+
+QPtrList<KMultiTabBarTab>* KMultiTabBar::tabs() {return m_internal->tabs();}
+QPtrList<KMultiTabBarButton>* KMultiTabBar::buttons() {return &m_buttons;}
diff --git a/kaffeine/src/kmultitabbar.h b/kaffeine/src/kmultitabbar.h
new file mode 100644
index 0000000..a8567ee
--- /dev/null
+++ b/kaffeine/src/kmultitabbar.h
@@ -0,0 +1,248 @@
+/*
+ * kmultitabbar.h
+ *
+ * Copyright (C) 2001,2002,2003 Joseph Wenninger <jowenn@kde.org>
+ * Copyright (C) 2005 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KMULTITABBAR_H
+#define KMULTITABBAR_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qscrollview.h>
+#include <qvbox.h>
+#include <qhbox.h>
+#include <qlayout.h>
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qpushbutton.h>
+
+class QPixmap;
+class QPainter;
+class QFrame;
+
+class KMultiTabBarPrivate;
+class KMultiTabBarTabPrivate;
+class KMultiTabBarButtonPrivate;
+class KMultiTabBarInternal;
+
+/**
+ * A Widget for horizontal and vertical tabs.
+ * It is possible to add normal buttons to the top/left
+ * The handling if only one tab at a time or multiple tabs
+ * should be raisable is left to the "user".
+ *@author Joseph Wenninger
+ */
+class /*KUTILS_EXPORT*/ KMultiTabBar: public QWidget
+{
+ Q_OBJECT
+public:
+ enum KMultiTabBarMode{Horizontal, Vertical};
+ enum KMultiTabBarPosition{Left, Right, Top, Bottom};
+
+ /**
+ * VSNET == Visual Studio .Net like (only show the text of active tabs
+ * KDEV3 == Kdevelop 3 like (always show the text)
+ * KONQSBC == konqy's classic sidebar style (unthemed), this one is disabled
+ * at the moment, but will be renabled soon too
+ */
+ enum KMultiTabBarStyle{VSNET=0, KDEV3=1, KONQSBC=2, KDEV3ICON=3,STYLELAST=0xffff};
+
+ KMultiTabBar(KMultiTabBarMode bm,QWidget *parent=0,const char *name=0);
+ virtual ~KMultiTabBar();
+
+ /**
+ * append a new button to the button area. The button can later on be accessed with button(ID)
+ * eg for connecting signals to it
+ * @param pic a pixmap for the button
+ * @param id an arbitraty ID value. It will be emitted in the clicked signal for identifying the button
+ * if more than one button is connected to a signals.
+ * @param popup A popup menu which should be displayed if the button is clicked
+ * @param not_used_yet will be used for a popup text in the future
+ */
+ int appendButton(const QPixmap &pic,int id=-1,QPopupMenu* popup=0,const QString& not_used_yet=QString::null);
+ /**
+ * remove a button with the given ID
+ */
+ void removeButton(int id);
+ /**
+ * append a new tab to the tab area. It can be accessed lateron with tabb(id);
+ * @param pic a bitmap for the tab
+ * @param id an arbitrary ID which can be used later on to identify the tab
+ * @param text if a mode with text is used it will be the tab text, otherwise a mouse over hint
+ */
+ int appendTab(const QPixmap &pic,int id=-1,const QString& text=QString::null);
+ /**
+ * remove a tab with a given ID
+ */
+ void removeTab(int id);
+ /**
+ * set a tab to "raised"
+ * @param id The ID of the tab to manipulate
+ * @param state true == activated/raised, false == not active
+ */
+ void setTab(int id ,bool state);
+ /**
+ * return the state of a tab, identified by it's ID
+ */
+ bool isTabRaised(int id) const;
+ /**
+ * get a pointer to a button within the button area identified by its ID
+ */
+ class KMultiTabBarButton *button(int id) const;
+
+ /**
+ * get a pointer to a tab within the tab area, identiifed by its ID
+ */
+ class KMultiTabBarTab *tab(int id) const;
+ /**
+ * set the real position of the widget.
+ * @param pos if the mode is horizontal, only use top, bottom, if it is vertical use left or right
+ */
+ void setPosition(KMultiTabBarPosition pos);
+ /**
+ * set the display style of the tabs
+ */
+ void setStyle(KMultiTabBarStyle style);
+ /**
+ * be carefull, don't delete tabs yourself and don't delete the list itself
+ */
+ QPtrList<KMultiTabBarTab>* tabs();
+ /**
+ * be carefull, don't delete buttons yourself and don't delete the list itself
+ */
+ QPtrList<KMultiTabBarButton>* buttons();
+
+ /**
+ * might vanish, not sure yet
+ */
+ void showActiveTabTexts(bool show=true);
+private slots:
+ void tabClicked(int id);
+protected:
+ friend class KMultiTabBarButton;
+ virtual void fontChange( const QFont& );
+ void updateSeparator();
+private:
+ class KMultiTabBarInternal *m_internal;
+ QBoxLayout *m_l;
+ QFrame *m_btnTabSep;
+ QPtrList<KMultiTabBarButton> m_buttons;
+ KMultiTabBarPosition m_position;
+ KMultiTabBarPrivate *d;
+};
+
+/**
+ * This class should never be created except with the appendButton call of KMultiTabBar
+ */
+class /*KUTILS_EXPORT*/ KMultiTabBarButton: public QPushButton
+{
+ Q_OBJECT
+public:
+ KMultiTabBarButton(const QPixmap& pic,const QString&, QPopupMenu *popup,
+ int id,QWidget *parent, KMultiTabBar::KMultiTabBarPosition pos, KMultiTabBar::KMultiTabBarStyle style);
+ KMultiTabBarButton(const QString&, QPopupMenu *popup,
+ int id,QWidget *parent, KMultiTabBar::KMultiTabBarPosition pos, KMultiTabBar::KMultiTabBarStyle style);
+ virtual ~KMultiTabBarButton();
+ int id() const;
+
+public slots:
+ /**
+ * this is used internaly, but can be used by the user, if (s)he wants to
+ * It the according call of KMultiTabBar is invoked though this modifications will be overwritten
+ */
+ void setPosition(KMultiTabBar::KMultiTabBarPosition);
+ /**
+ * this is used internaly, but can be used by the user, if (s)he wants to
+ * It the according call of KMultiTabBar is invoked though this modifications will be overwritten
+ */
+ void setStyle(KMultiTabBar::KMultiTabBarStyle);
+
+ /**
+ * modify the text of the button
+ */
+ void setText(const QString &);
+
+ QSize sizeHint() const;
+
+protected:
+ KMultiTabBar::KMultiTabBarPosition m_position;
+ KMultiTabBar::KMultiTabBarStyle m_style;
+ QString m_text;
+ virtual void hideEvent( class QHideEvent*);
+ virtual void showEvent( class QShowEvent*);
+private:
+ int m_id;
+ KMultiTabBarButtonPrivate *d;
+signals:
+ /**
+ * this is emitted if the button is clicked
+ * @param id the ID identifying the button
+ */
+ void clicked(int id);
+protected slots:
+ virtual void slotClicked();
+};
+
+/**
+ * This class should never be created except with the appendTab call of KMultiTabBar
+ */
+class /*KUTILS_EXPORT*/ KMultiTabBarTab: public KMultiTabBarButton
+{
+ Q_OBJECT
+public:
+ KMultiTabBarTab(const QPixmap& pic,const QString&,int id,QWidget *parent,
+ KMultiTabBar::KMultiTabBarPosition pos,KMultiTabBar::KMultiTabBarStyle style);
+ virtual ~KMultiTabBarTab();
+ /**
+ * set the active state of the tab
+ * @param state true==active false==not active
+ */
+ void setState(bool state);
+ bool down;
+ /**
+ * choose if the text should always be displayed
+ * this is only used in classic mode if at all
+ */
+ void showActiveTabText(bool show);
+ void resize(){ setSize( neededSize() ); }
+private:
+ bool m_showActiveTabText;
+ int m_expandedSize;
+ KMultiTabBarTabPrivate *d;
+protected:
+ friend class KMultiTabBarInternal;
+ void setSize(int);
+ int neededSize();
+ void updateState();
+ virtual void drawButton(QPainter *);
+ virtual void drawButtonLabel(QPainter *);
+ void drawButtonStyled(QPainter *);
+ void drawButtonClassic(QPainter *);
+protected slots:
+ virtual void slotClicked();
+ void setTabsPosition(KMultiTabBar::KMultiTabBarPosition);
+
+public slots:
+ virtual void setIcon(const QString&);
+ virtual void setIcon(const QPixmap&);
+};
+
+#endif /* KMULTITABBAR_H */
diff --git a/kaffeine/src/kmultitabbar_p.h b/kaffeine/src/kmultitabbar_p.h
new file mode 100644
index 0000000..d8a6cfc
--- /dev/null
+++ b/kaffeine/src/kmultitabbar_p.h
@@ -0,0 +1,68 @@
+/*
+ * kmultitabbar_p.h
+ *
+ * Copyright (C) 2003 Joseph Wenninger <jowenn@kde.org>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KMULTITABBAR_P_H
+#define KMULTITABBAR_P_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qscrollview.h>
+#include <kmultitabbar.h>
+
+class KMultiTabBarInternal: public QScrollView
+{
+ Q_OBJECT
+public:
+ KMultiTabBarInternal(QWidget *parent,KMultiTabBar::KMultiTabBarMode bm);
+ int appendTab(const QPixmap &,int=-1,const QString& =QString::null);
+ KMultiTabBarTab *tab(int) const;
+ void removeTab(int);
+ void setPosition(enum KMultiTabBar::KMultiTabBarPosition pos);
+ void setStyle(enum KMultiTabBar::KMultiTabBarStyle style);
+ void showActiveTabTexts(bool show);
+ QPtrList<KMultiTabBarTab>* tabs(){return &m_tabs;}
+private:
+ friend class KMultiTabBar;
+ QWidget *box;
+ QBoxLayout *mainLayout;
+ QPtrList<KMultiTabBarTab> m_tabs;
+ enum KMultiTabBar::KMultiTabBarPosition m_position;
+ bool m_showActiveTabTexts;
+ enum KMultiTabBar::KMultiTabBarStyle m_style;
+ int m_expandedTabSize;
+ int m_lines;
+ KMultiTabBar::KMultiTabBarMode m_barMode;
+protected:
+ virtual bool eventFilter(QObject *,QEvent*);
+ virtual void drawContents ( QPainter *, int, int, int, int);
+
+ /**
+ * [contentsM|m]ousePressEvent are reimplemented from QScrollView
+ * in order to ignore all mouseEvents on the viewport, so that the
+ * parent can handle them.
+ */
+ virtual void contentsMousePressEvent(QMouseEvent *);
+ virtual void mousePressEvent(QMouseEvent *);
+ virtual void resizeEvent(QResizeEvent *);
+};
+
+#endif /* KMULTITABBAR_P_H */
diff --git a/kaffeine/src/main.cpp b/kaffeine/src/main.cpp
new file mode 100644
index 0000000..18a248a
--- /dev/null
+++ b/kaffeine/src/main.cpp
@@ -0,0 +1,121 @@
+/*
+ * main.cpp
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kaboutdata.h>
+#include <kcmdlineargs.h>
+#include <kdebug.h>
+#include <kuniqueapplication.h>
+
+#include "kaffeine.h"
+#include "version.h"
+
+#ifndef HAVE_XCB
+/* including the Xlib header pollutes namespace too much --pfister */
+extern "C" int XInitThreads();
+#endif
+
+class KaffeineApp : public KUniqueApplication
+{
+public:
+ KaffeineApp() : kaffeine(NULL) { }
+
+ ~KaffeineApp()
+ {
+ delete kaffeine;
+ }
+
+private:
+ Kaffeine *kaffeine;
+
+ int newInstance();
+
+ KaffeineApp(const KaffeineApp &);
+ KaffeineApp &operator=(const KaffeineApp &);
+};
+
+int KaffeineApp::newInstance()
+{
+ if (kaffeine)
+ kaffeine->updateArgs();
+ else
+ kaffeine = new Kaffeine();
+
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ KAboutData aboutData("kaffeine", I18N_NOOP("Kaffeine Player"), KAFFEINE_VERSION,
+ I18N_NOOP("A media player for KDE 3. Can use multiple backends for playback, default (and recommended) is xine."),
+ KAboutData::License_GPL_V2, I18N_NOOP("Copyright (C) 2003-2007, The Kaffeine Authors"), 0,
+ "http://kaffeine.sourceforge.net");
+
+ aboutData.addAuthor("Christophe Thommeret", I18N_NOOP("Current maintainer"), "hftom@free.fr");
+ aboutData.addAuthor("Christoph Pfister", I18N_NOOP("Developer"), "christophpfister@gmail.com");
+ aboutData.addAuthor("Jürgen Kofler", I18N_NOOP("Original author"), "kaffeine@gmx.net");
+
+ /* FIXME: what about the other contributors listed in CREDITS? --pfister */
+
+ aboutData.addCredit("Eldon Tyrell", I18N_NOOP("DVB patches."), "dr.e.tyrell@gmail.com");
+ aboutData.addCredit("Michael Hoertnagl", I18N_NOOP("Various patches."), "mtron@a1.net");
+ aboutData.addCredit("Ricardo Manuel Santos Rodrigues", I18N_NOOP("Various patches."), "madinfo@cadaval.net");
+ aboutData.addCredit("Christopher Martin", I18N_NOOP("Various patches."), "christopher.martin@utoronto.ca");
+ aboutData.addCredit("Ben Jackson", I18N_NOOP("DVB OSD browsing patch."), "benj@puremourning.co.uk");
+ aboutData.addCredit("Rainer Wirtz", I18N_NOOP("DVB categories patches."), "rainer.wirtz@gmx.de");
+ aboutData.addCredit("Dieter Zander", I18N_NOOP("Logo for Kaffeine 0.8 and other artwork."), "dieter-mz@online.de");
+ aboutData.addCredit("Anders Ellenshøj Andersen", I18N_NOOP("Logo animation for Kaffeine 0.5"), "andersa@ellenshoej.dk");
+ aboutData.addCredit("Assaf Gillat", I18N_NOOP("Alternate encoding for meta tags. Many patches."), "gillata@gmail.com");
+ aboutData.addCredit("Miguel Freitas", I18N_NOOP("xine post plugin handling. Many patches."), "miguel@cetuc.puc-rio.br");
+ aboutData.addCredit("Giorgos Gousios", I18N_NOOP("Subtitle file import."), "gousiosg@cs.man.ac.uk");
+ aboutData.addCredit("Michael Rolf", I18N_NOOP("M3U import. Testing."), "mi.rolf@gmx.net");
+ aboutData.addCredit("Sergey Rudchenko", I18N_NOOP("Automatic codec installation"), "sergey.rudchenko@gmail.com");
+
+ KCmdLineArgs::init(argc, argv, &aboutData);
+ KCmdLineArgs::addCmdLineOptions(cmdLineOptions);
+
+ if (!KaffeineApp::start())
+ return 0;
+
+#ifndef HAVE_XCB
+ /*
+ * XInitThreads() should the first call to xlib in multithreaded X programs -
+ * but because of a bug in some xfree versions that can freeze at startup,
+ * we also call XInitThreads() in kxinewidget.cpp
+ *
+ * kaffeinepart & konqueror: We call XInitThreads() in kxinewidget.cpp, so the part is
+ * not stable with buggy X implementations.
+ *
+ * FIXME: deadline for this workaround is 2007-03-16 --pfister
+ */
+
+#ifndef XINIT_WKRND /* configure flag --with-xinit-workaround not set */
+ flush(kdDebug() << "if kaffeine hangs here run 'configure --with-xinit-workaround' and recompile / reinstall ...");
+ XInitThreads();
+ kdDebug() << " ok\n";
+#endif
+#endif
+
+ KaffeineApp a;
+ return a.exec();
+}
diff --git a/kaffeine/src/player-parts/Makefile.am b/kaffeine/src/player-parts/Makefile.am
new file mode 100644
index 0000000..81311d2
--- /dev/null
+++ b/kaffeine/src/player-parts/Makefile.am
@@ -0,0 +1,5 @@
+if with_gstreamer
+ GST_SUBDIR = gstreamer-part
+endif
+
+SUBDIRS = kaffeine-part xine-part $(GST_SUBDIR)
diff --git a/kaffeine/src/player-parts/README b/kaffeine/src/player-parts/README
new file mode 100644
index 0000000..53aa664
--- /dev/null
+++ b/kaffeine/src/player-parts/README
@@ -0,0 +1,17 @@
+This directory contains the player parts (aka backends) for kaffeine.
+
+It consists of the following subdirectories:
+
+- kaffeine-part
+ The base for all player parts. Every player part is derived from the
+ "KaffeinePart" class and reimplements functions. Additionally kaffeine-part
+ provides functions for embedding the player part e.g. into browsers.
+
+- dummy-part
+ An empty part which you can use to create a new player part.
+
+- xine-part
+ This is the default (and recommended) player part for kaffeine using xine-lib.
+
+- gstreamer-part
+ This is an experimental player part using GStreamer.
diff --git a/kaffeine/src/player-parts/dummy-part/Makefile.am b/kaffeine/src/player-parts/dummy-part/Makefile.am
new file mode 100644
index 0000000..106d07a
--- /dev/null
+++ b/kaffeine/src/player-parts/dummy-part/Makefile.am
@@ -0,0 +1,20 @@
+
+kde_module_LTLIBRARIES = libdummypart.la
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/player-parts/ $(all_includes)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = dummy_part.h
+
+libdummypart_la_SOURCES = dummy_part.cpp
+libdummypart_la_LIBADD = $(LIB_KPARTS) $(LIB_KFILE) ../libkaffeinepart.la
+libdummypart_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) -avoid-version -no-undefined
+
+# this is where the desktop file will go
+partdesktopdir = $(kde_servicesdir)
+partdesktop_DATA = dummy_part.desktop
+
+# this is where the part's XML-GUI resource file goes
+partrcdir = $(kde_datadir)/dummypart
+partrc_DATA = dummy_part.rc \ No newline at end of file
diff --git a/kaffeine/src/player-parts/dummy-part/README b/kaffeine/src/player-parts/dummy-part/README
new file mode 100644
index 0000000..a569c62
--- /dev/null
+++ b/kaffeine/src/player-parts/dummy-part/README
@@ -0,0 +1,6 @@
+
+**************
+* DUMMY PART *
+**************
+
+You can use this files as templates for your own player-part. \ No newline at end of file
diff --git a/kaffeine/src/player-parts/dummy-part/dummy_part.cpp b/kaffeine/src/player-parts/dummy-part/dummy_part.cpp
new file mode 100644
index 0000000..7c52cf7
--- /dev/null
+++ b/kaffeine/src/player-parts/dummy-part/dummy_part.cpp
@@ -0,0 +1,120 @@
+/*
+ * dummy_part.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <kparts/genericfactory.h>
+#include <kaction.h>
+
+#include "dummy_part.h"
+
+typedef KParts::GenericFactory<DummyPart> DummyPartFactory;
+K_EXPORT_COMPONENT_FACTORY (libdummypart, DummyPartFactory);
+
+
+DummyPart::DummyPart(QWidget* parentWidget, const char* widgetName, QObject* parent, const char* name, const QStringList& /*args*/)
+: KaffeinePart(parent, name ? name : "DummyPart")
+{
+ // we need an instance
+ setInstance(DummyPartFactory::instance());
+
+ // m_player = new Player(this);
+ // m_player->setFocusPolicy(QWidget::ClickFocus);
+ // setWidget(m_player);
+
+ setXMLFile("dummy_part.rc");
+ initActions();
+}
+
+
+DummyPart::~DummyPart()
+{
+}
+
+bool DummyPart::isPlaying()
+{
+ return false;
+}
+
+uint DummyPart::volume() const
+{
+ return 0;
+}
+
+uint DummyPart::position() const
+{
+ return 0;
+}
+
+bool DummyPart::closeURL()
+{
+ return true;
+}
+
+KAboutData *DummyPart::createAboutData()
+{
+ KAboutData* aboutData = new KAboutData( "dummypart", I18N_NOOP("DummyPart"),
+ "0.1", "Description...",
+ KAboutData::License_GPL,
+ "(c) 2004, Jürgen Kofler.", 0, "http://kaffeine.sourceforge.net");
+ aboutData->addAuthor("Jürgen Kofler.",0, "kaffeine@gmx.net");
+
+ return aboutData;
+}
+
+bool DummyPart::openURL(const MRL& mrl)
+{
+ // m_player->setLocation(mrl.url());
+}
+
+void DummyPart::slotPlay()
+{
+ // m_player->play();
+}
+
+void DummyPart::slotTogglePause()
+{
+
+}
+
+void DummyPart::slotSetVolume(uint)
+{
+
+}
+
+void DummyPart::slotSetPosition(uint)
+{
+
+}
+
+void DummyPart::slotStop()
+{
+ // m_player->stop();
+}
+
+void DummyPart::slotMute()
+{
+
+}
+
+void DummyPart::initActions()
+{
+ new KAction(i18n("Play"), "player_play", 0, this, SLOT(slotPlay()), actionCollection(), "player_play");
+ new KAction(i18n("Pause"), "player_pause", Key_Space, this, SLOT(slotTogglePause()), actionCollection(), "player_pause");
+ new KAction(i18n("Stop"), "player_stop", Key_Backspace, this, SLOT(slotStop()), actionCollection(), "player_stop");
+}
diff --git a/kaffeine/src/player-parts/dummy-part/dummy_part.desktop b/kaffeine/src/player-parts/dummy-part/dummy_part.desktop
new file mode 100644
index 0000000..de51e00
--- /dev/null
+++ b/kaffeine/src/player-parts/dummy-part/dummy_part.desktop
@@ -0,0 +1,23 @@
+[Desktop Entry]
+Encoding=UTF-8
+Icon=gear
+Name=DummyPart
+Name[bn]=ডামি-পার্ট
+Name[ca]=Part inútil
+Name[da]=Tom program-part
+Name[et]=Libakomponent
+Name[fr]=Partie factice
+Name[ja]=ダミーパート
+Name[nb]=Tullemodul
+Name[nn]=Eksempel-del
+Name[se]=Fillenoassi
+Name[sv]=Tom programdel
+Name[tg]=Қисми амсила
+Name[tr]=Kukla Kısım
+Name[uk]=Порожній компонент
+Name[xx]=xxDummyPartxx
+Name[zh_CN]=伪部件
+MimeType=audio/x-mp3
+ServiceTypes=KaffeinePart
+Type=Service
+X-KDE-Library=libdummypart
diff --git a/kaffeine/src/player-parts/dummy-part/dummy_part.h b/kaffeine/src/player-parts/dummy-part/dummy_part.h
new file mode 100644
index 0000000..8f9a568
--- /dev/null
+++ b/kaffeine/src/player-parts/dummy-part/dummy_part.h
@@ -0,0 +1,72 @@
+/*
+ * dummy_part.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DUMMYPART_H
+#define DUMMYPART_H
+
+#include <kparts/factory.h>
+
+#include "kaffeinepart.h"
+
+/**
+ * DummyPart - use this as template for own player parts
+ * @author Jürgen Kofler <kaffeine@gmx.net>
+ *
+ */
+
+
+class DummyPart : public KaffeinePart
+{
+ Q_OBJECT
+public:
+ DummyPart(QWidget*, const char*, QObject*, const char*, const QStringList&);
+ virtual ~DummyPart();
+
+ /*
+ *Reimplement from KaffeinePart
+ */
+ bool isPlaying();
+ uint volume() const; /* percent */
+ uint position() const; /* percent */
+
+ bool closeURL();
+ static KAboutData* createAboutData();
+
+public slots:
+ /*
+ * Reimplement from KaffeinePart
+ */
+ bool openURL(const MRL& mrl);
+ void slotPlay();
+ void slotTogglePause();
+ void slotSetVolume(uint); /* percent */
+ void slotSetPosition(uint); /* percent */
+ void slotStop();
+ void slotMute();
+
+private:
+ void initActions();
+
+private:
+ // Player* m_play;
+
+};
+
+#endif /* DUMMYPART_H */
diff --git a/kaffeine/src/player-parts/dummy-part/dummy_part.rc b/kaffeine/src/player-parts/dummy-part/dummy_part.rc
new file mode 100644
index 0000000..d58b2aa
--- /dev/null
+++ b/kaffeine/src/player-parts/dummy-part/dummy_part.rc
@@ -0,0 +1,10 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="dummy_part" version="1">
+<MenuBar>
+ <Menu name="player"><text>&amp;Player</text>
+ <Action name="player_play"/>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ </Menu>
+</MenuBar>
+</kpartgui> \ No newline at end of file
diff --git a/kaffeine/src/player-parts/gstreamer-part/Makefile.am b/kaffeine/src/player-parts/gstreamer-part/Makefile.am
new file mode 100644
index 0000000..3d058be
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/Makefile.am
@@ -0,0 +1,22 @@
+kde_module_LTLIBRARIES = libgstreamerpart.la
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/player-parts/kaffeine-part -I$(top_srcdir)/kaffeine/src/ $(all_includes) $(CFLAGS_GSTREAMER)
+
+METASOURCES = AUTO
+
+noinst_HEADERS = gstreamer_part.h timer.h video.h videosettings.h gstreamerconfig.h
+
+libgstreamerpart_la_SOURCES = gstreamer_part.cpp video.cpp timer.cpp videosettings.cpp gstreamerconfig.cpp
+libgstreamerpart_la_LIBADD = $(LIB_KPARTS) $(LIB_KFILE) ../kaffeine-part/libkaffeinepart.la
+libgstreamerpart_la_LDFLAGS = -module $(KDE_PLUGIN) $(LIB_GSTREAMER) -lgstinterfaces-0.10 $(all_libraries) -avoid-version -no-undefined
+
+# this is where the desktop file will go
+partdesktopdir = $(kde_servicesdir)
+partdesktop_DATA = gstreamer_part.desktop
+
+# this is where the part's XML-GUI resource file goes
+partrcdir = $(kde_datadir)/gstreamerpart
+partrc_DATA = gstreamer_part.rc
+
+icondir = $(kde_icondir)/hicolor/16x16/apps/
+icon_DATA = gstreamer.png
diff --git a/kaffeine/src/player-parts/gstreamer-part/gstreamer.png b/kaffeine/src/player-parts/gstreamer-part/gstreamer.png
new file mode 100644
index 0000000..1a73f7b
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/gstreamer.png
Binary files differ
diff --git a/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.cpp b/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.cpp
new file mode 100644
index 0000000..22e747a
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.cpp
@@ -0,0 +1,1082 @@
+/*
+ * gstreamer_part.cpp
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * based on kiss by Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+
+
+#include <kparts/genericfactory.h>
+#include <kaction.h>
+#include <kmessagebox.h>
+#include <kstandarddirs.h>
+#include <kxmlguifactory.h>
+#include <ktoolbar.h>
+#include <kio/netaccess.h>
+#include <kmimetype.h>
+#include <kpopupmenu.h>
+
+#include <qtimer.h>
+#include <qslider.h>
+#include <qfile.h>
+#include <qtooltip.h>
+
+#include "gstreamer_part.h"
+#include "gstreamer_part.moc"
+#include "playlistimport.h"
+
+#define TIMER_EVENT_PLAYBACK_FINISHED 100
+#define TIMER_EVENT_ERROR 102
+#define TIMER_EVENT_NEW_STATE 103
+#define TIMER_EVENT_FOUND_TAG 104
+
+
+
+typedef KParts::GenericFactory<GStreamerPart> GStreamerPartFactory;
+K_EXPORT_COMPONENT_FACTORY (libgstreamerpart, GStreamerPartFactory);
+
+
+GStreamerPart::GStreamerPart( QWidget* parentWidget, const char* /*widgetName*/, QObject* parent, const char* name,
+ const QStringList& /*args*/ )
+ : KaffeinePart( parent, name ? name : "GStreamerPart" ),
+ m_play(NULL), m_videosink(NULL), m_audiosink(NULL), m_visual(NULL), m_videoSettings(NULL),
+ m_gstConfig(NULL), m_mute(false), m_logoPath(QString::null), m_posToolbar(NULL)
+{
+ // we need an instance
+ setInstance( GStreamerPartFactory::instance() );
+ parentWidget->setPaletteBackgroundColor( QColor(0,0,0) ); //black
+
+ bus = NULL;
+
+ loadConfig();
+
+ if ( !initGStreamer() )
+ {
+ kdError() << "GStreamerPart: Initializing of GStreamer failed!" << endl;
+ emit canceled( i18n("GStreamer initializing failed!") );
+ return;
+ }
+
+ m_status = GST_STATE_NULL;
+
+ kdDebug() << "GStreamerPart: Creating video window" << endl;
+ m_video = new VideoWindow( parentWidget, m_videosink );
+ connect( m_video, SIGNAL(signalNewFrameSize(const QSize&)), this, SIGNAL(signalNewFrameSize(const QSize&)) );
+ m_video->setFocusPolicy( QWidget::ClickFocus );
+ setWidget( m_video );
+
+ setXMLFile( "gstreamer_part.rc" );
+ initActions();
+ stateChanged( "disable_all" );
+
+ emit setStatusBarText( i18n("Ready") );
+
+ // be careful - we may be embedded
+ m_logoPath = locate( "data", "kaffeine/logo" );
+ kdDebug() << "GStreamerPart: Found logo animation: " << m_logoPath << endl;
+
+ connect( &busTimer, SIGNAL(timeout()), this, SLOT(slotReadBus()) );
+}
+
+
+
+GStreamerPart::~GStreamerPart()
+{
+ deletePlaybin();
+ saveConfig();
+ delete m_timer;
+ kdDebug() << "GStreamerPart: destructed" << endl;
+}
+
+
+
+bool GStreamerPart::isPlaying()
+{
+ return ( (m_status==GST_STATE_PLAYING) && m_url != m_logoPath );
+}
+
+
+
+bool GStreamerPart::isPaused()
+{
+ if ( !m_play )
+ return false;
+ return ( GST_STATE(m_play)==GST_STATE_PAUSED );
+}
+
+
+
+bool GStreamerPart::hasVideo()
+{
+ //FIXME: don't work with all video codecs
+ return ( !m_videoCodec.isNull() );
+}
+
+
+
+uint GStreamerPart::position() const
+{
+ return (uint)((1.0 / m_timer->getTotalTimeMS()) * m_timer->getCurrentTimeMS() * 100);
+}
+
+
+
+bool GStreamerPart::closeURL()
+{
+ slotStop();
+ return true;
+}
+
+
+
+KAboutData *GStreamerPart::createAboutData()
+{
+ KAboutData* aboutData = new KAboutData( "gstreamerpart", I18N_NOOP("GStreamerPart"),
+ "0.1", "GStreamer based player part for Kaffeine.",
+ KAboutData::License_GPL,
+ "(c) 2005, Jürgen Kofler.", 0, "http://kaffeine.sourceforge.net");
+ aboutData->addAuthor("Jürgen Kofler.",0, "kaffeine@gmx.net");
+
+ return aboutData;
+}
+
+
+
+bool GStreamerPart::openURL(const MRL& mrl)
+{
+ kdDebug() << "GStreamerPart::openURL(): " << mrl.url() << endl;
+
+ // FIXME: thats not the right place for that
+ if ( !m_posToolbar ) {
+ m_posToolbar = (KToolBar*)factory()->container( "gstPositionToolBar", this );
+ if ( m_posToolbar ) {
+ m_posToolbar->setItemAutoSized( m_posToolbar->idAt(0), true ); //set position slider to maximum width
+ }
+ }
+
+ m_mrl = mrl;
+ m_playlist.clear();
+ m_current = 0;
+ bool playlist = false;
+
+ currentDevice = "";
+
+ QString ext = m_mrl.kurl().fileName();
+ ext = ext.remove( 0 , ext.findRev('.')+1 ).lower();
+
+ if ( m_mrl.mime().isNull() ) {
+ KMimeType::Ptr mime = KMimeType::findByURL( m_mrl.kurl().path() );
+ m_mrl.setMime( mime->name() );
+ }
+
+ /* is m_mrl a playlist? */
+ if ( (m_mrl.mime() == "text/plain") || (m_mrl.mime() == "text/xml") || (m_mrl.mime() == "application/x-kaffeine")
+ || (m_mrl.mime() == "audio/x-scpls") || (m_mrl.mime() == "audio/x-mpegurl") || (m_mrl.mime() == "audio/mpegurl")
+ || (ext == "asx") || (ext == "asf") || (ext == "wvx") || (ext == "wax") ) /* windows meta files */
+ {
+ kdDebug() << "GStreamerPart: Check for kaffeine/noatun/m3u/pls/asx playlist\n";
+ QString localFile;
+ if ( KIO::NetAccess::download(m_mrl.kurl(), localFile, widget()) ) {
+ QFile file( localFile );
+ file.open( IO_ReadOnly );
+ QTextStream stream( &file );
+ QString firstLine = stream.readLine();
+ QString secondLine = stream.readLine();
+ file.close();
+
+ if ( secondLine.contains("kaffeine", false) ) {
+ kdDebug() << "GStreamerPart: Try loading kaffeine playlist\n";
+ playlist = PlaylistImport::kaffeine( localFile, m_playlist );
+ }
+ if ( secondLine.contains("noatun", false) ) {
+ kdDebug() << "GStreamerPart: Try loading noatun playlist\n";
+ playlist = PlaylistImport::noatun( localFile, m_playlist);
+ }
+ if ( firstLine.contains("asx", false) ) {
+ kdDebug() << "GStreamerPart: Try loading asx playlist\n";
+ playlist = PlaylistImport::asx( localFile, m_playlist );
+ }
+ if ( firstLine.contains("[playlist]", false) ) {
+ kdDebug() << "GStreamerPart: Try loading pls playlist\n";
+ playlist = PlaylistImport::pls( localFile, m_playlist );
+ }
+ if (ext == "m3u") { //indentify by extension
+ kdDebug() << "GStreamerPart: Try loading m3u playlist\n";
+ playlist = PlaylistImport::m3u( localFile, m_playlist );
+ }
+ }
+ else
+ kdError() << "GStreamerPart: " << KIO::NetAccess::lastErrorString() << endl;
+ }
+ /* check for ram playlist */
+ if ( (ext == "ra") || (ext == "rm") || (ext == "ram") || (ext == "lsc") || (ext == "pl") ) {
+ kdDebug() << "GStreamerPart: Try loading ram playlist\n";
+ playlist = PlaylistImport::ram( m_mrl, m_playlist, widget() );
+ }
+
+ int pos;
+ QString s = mrl.url();
+ if ( s.startsWith("cdda://") ) {
+ s = s.remove("cdda://");
+ if ( (pos=s.findRev("/"))>-1 ) {
+ currentDevice=s.left( pos );
+ s = s.right( s.length()-pos-1 );
+ }
+ else
+ currentDevice=m_device;
+ m_mrl.setURL( "cdda://"+s );
+ }
+ else if ( s.startsWith("dvd://") ) {
+ s = s.remove("dvd://");
+ if ( s.startsWith("/") )
+ currentDevice=s;
+ else
+ currentDevice=m_device;
+ m_mrl.setURL( "dvd://" );
+ }
+ else if ( s.startsWith("vcd://") ) {
+ s = s.remove("vcd://");
+ if ( s.startsWith("/") )
+ currentDevice=s;
+ else
+ currentDevice=m_device;
+ m_mrl.setURL( "vcd://" );
+ }
+
+ if (!playlist)
+ {
+ kdDebug() << "GStreamerPart: Got single track" << endl;
+ m_playlist.append( m_mrl );
+ }
+
+ QTimer::singleShot(0, this, SLOT(slotPlay()));
+ return true;
+}
+
+
+
+void GStreamerPart::slotPlay()
+{
+ if ( (m_play) && (GST_STATE(m_play)==GST_STATE_PAUSED) ) {
+ gst_element_set_state( m_play, GST_STATE_PLAYING );
+ return;
+ }
+
+ if ( m_playlist.count() > 0 ) {
+ emit setStatusBarText( i18n("Opening...") );
+ MRL curMRL = m_playlist[m_current];
+ m_url = curMRL.url();
+ QString subUrl = QString::null;
+ if ( (!curMRL.subtitleFiles().isEmpty()) && (curMRL.currentSubtitle() > -1) )
+ subUrl = curMRL.subtitleFiles()[curMRL.currentSubtitle()];
+
+ gstPlay(m_url, subUrl);
+ }
+ else {
+ emit signalRequestCurrentTrack();
+ }
+}
+
+
+
+void GStreamerPart::slotNext()
+{
+ if ( (m_playlist.count() > 0) && (m_current < m_playlist.count()-1) )
+ {
+ m_current++;
+ slotPlay();
+ }
+ else {
+ emit signalRequestNextTrack();
+ }
+}
+
+
+
+void GStreamerPart::slotPrevious()
+{
+ if ( m_current > 0 ) {
+ m_current--;
+ slotPlay();
+ }
+ else {
+ emit signalRequestPreviousTrack();
+ }
+}
+
+
+
+void GStreamerPart::setDevice( QString device )
+{
+ if ( !m_play )
+ return;
+
+ GObject *source=NULL;
+ g_object_get( m_play, "source", &source, NULL );
+ if ( !source ) {
+ kdDebug() << "GStreamer: NO source for 'device' " << device << endl;
+ return;
+ }
+
+ GObjectClass *klass = G_OBJECT_GET_CLASS( source );
+ if ( g_object_class_find_property( klass, "device" ) ) {
+ kdDebug() << "GStreamer: Set source sink property 'device' to " << device << endl;
+ g_object_set(source, "device", device.ascii(), NULL);
+ }
+ g_object_unref (source);
+}
+
+
+
+void GStreamerPart::slotTogglePause( bool )
+{
+ if ( !m_play )
+ return;
+
+ if ( GST_STATE(m_play)==GST_STATE_PAUSED )
+ gst_element_set_state( m_play, GST_STATE_PLAYING );
+ else
+ gst_element_set_state( m_play, GST_STATE_PAUSED );
+}
+
+
+
+void GStreamerPart::slotSetPosition( uint percent )
+{
+ if ( !m_play )
+ return;
+ m_timer->seekPercent( percent );
+}
+
+
+
+void GStreamerPart::slotStop()
+{
+ if ( !m_play )
+ return;
+
+ gst_element_set_state( m_play, GST_STATE_READY );
+ if ( !m_logoPath.isNull() ) {
+ m_url = m_logoPath;
+ gstPlay( m_logoPath, QString::null );
+ }
+}
+
+
+
+void GStreamerPart::slotVolume( int vol )
+{
+ if ( !m_play )
+ return;
+
+ emit setStatusBarText(i18n("Volume") + ": " + QString::number(vol) + "%");
+ double v = vol * 0.01;
+ kdDebug() << "GStreamerPart: Set volume to " << v << endl;
+ g_object_set( G_OBJECT(m_play), "volume", v, NULL );
+}
+
+
+
+void GStreamerPart::slotSetVolume( uint vol )
+{
+ m_volume->setValue( vol );
+}
+
+
+
+uint GStreamerPart::volume() const
+{
+ if ( !m_play )
+ return m_volume->value();
+
+ double v;
+ g_object_get( G_OBJECT(m_play), "volume", &v, NULL );
+
+ return (uint)(v*100 );
+}
+
+
+
+void GStreamerPart::slotMute()
+{
+ m_mute = !m_mute;
+ if ( m_mute ) {
+ muteVolume = m_volume->value();
+ m_volume->setValue( 0 );
+ emit setStatusBarText( i18n("Mute") + ": " + i18n("On") );
+ }
+ else {
+ m_volume->setValue( muteVolume );
+ emit setStatusBarText( i18n("Mute") + ": " + i18n("Off") );
+ }
+}
+
+
+
+void GStreamerPart::slotSaturation( int sat )
+{
+ emit setStatusBarText( i18n("Saturation") + ": " + QString::number(sat) );
+ g_object_set( G_OBJECT(m_videosink), "saturation", sat, NULL );
+}
+
+
+
+void GStreamerPart::slotHue( int hue )
+{
+ emit setStatusBarText( i18n("Hue") + ": " + QString::number(hue) );
+ g_object_set( G_OBJECT(m_videosink), "hue", hue, NULL );
+}
+
+
+
+void GStreamerPart::slotContrast( int contrast )
+{
+ emit setStatusBarText( i18n("Contrast") + ": " + QString::number(contrast) );
+ g_object_set( G_OBJECT(m_videosink), "contrast", contrast, NULL );
+}
+
+
+
+void GStreamerPart::slotBrightness( int brightness )
+{
+ emit setStatusBarText( i18n("Brightness") + ": " + QString::number(brightness) );
+ g_object_set( G_OBJECT(m_videosink), "brightness", brightness, NULL );
+}
+
+
+
+void GStreamerPart::gstStateChanged()
+{
+ if ( m_status == GST_STATE_PAUSED ) {
+ kdDebug() << "GStreamerPart: New gstreamer state: PAUSE" << endl;
+ emit setStatusBarText( i18n("Pause") );
+ }
+ else if ( m_status == GST_STATE_PLAYING ) {
+ kdDebug() << "GStreamerPart: New gstreamer state: PLAYING" << endl;
+ if ( m_url != m_logoPath )
+ stateChanged("playing");
+ else
+ stateChanged("not_playing");
+ QString caption = m_mrl.title();
+ if ( !m_mrl.artist().isEmpty() )
+ caption.append( QString(" (") + m_mrl.artist() + ")" );
+ emit setWindowCaption(caption);
+ emit setStatusBarText(i18n("Playing"));
+ }
+ else if ( m_status == GST_STATE_READY ) {
+ kdDebug() << "GStreamerPart: New gstreamer state: READY" << endl;
+ if ( m_playlist.count() )
+ stateChanged( "not_playing" );
+ else
+ stateChanged( "disable_all" );
+ emit setWindowCaption("");
+ emit setStatusBarText( i18n("Stop") );
+ }
+ m_video->newState();
+}
+
+
+
+void GStreamerPart::slotVideoSettings()
+{
+ if ( !m_videoSettings ) {
+ int hue = 0, sat = 0, contr = 0, bright = 0;
+ g_object_get( G_OBJECT(m_videosink), "hue", &hue, NULL );
+ g_object_get( G_OBJECT(m_videosink), "saturation", &sat, NULL );
+ g_object_get( G_OBJECT(m_videosink), "contrast", &contr, NULL );
+ g_object_get( G_OBJECT(m_videosink), "brightness", &bright, NULL );
+
+ m_videoSettings = new VideoSettings( hue, sat, contr, bright );
+ connect( m_videoSettings, SIGNAL(signalNewBrightness(int)), this, SLOT(slotBrightness(int)) );
+ connect( m_videoSettings, SIGNAL(signalNewContrast(int)), this, SLOT(slotContrast(int)) );
+ connect( m_videoSettings, SIGNAL(signalNewHue(int)), this, SLOT(slotHue(int)) );
+ connect( m_videoSettings, SIGNAL(signalNewSaturation(int)), this, SLOT(slotSaturation(int)) );
+ }
+
+ m_videoSettings->show();
+}
+
+
+
+void GStreamerPart::slotConfigDialog()
+{
+ if ( m_gstConfig == NULL ) {
+ m_gstConfig = new GStreamerConfig( m_audioPluginList, m_videoPluginList );
+ }
+
+ m_gstConfig->setAudioDriver( m_audioSinkName );
+ m_gstConfig->setVideoDriver( m_videoSinkName );
+ m_gstConfig->setDrive( m_device );
+ if ( m_gstConfig->exec() == KDialogBase::Accepted ) {
+ kdDebug() << "GStreamerPart: Apply new configuration" << endl;
+ if ( m_audioSinkName != m_gstConfig->getAudioDriver() )
+ setAudioSink( m_gstConfig->getAudioDriver() );
+ m_videoSinkName = m_gstConfig->getVideoDriver();
+ m_device = m_gstConfig->getDrive();
+ }
+}
+
+
+
+void GStreamerPart::processMetaInfo()
+{
+ kdDebug() << "GStreamerPart: Processing meta info" << endl;
+
+ MRL mrl = m_playlist[m_current];
+
+ if ( (mrl.title().contains("/") || mrl.title().contains(".") || (mrl.title().isEmpty()))
+ && !m_title.stripWhiteSpace().isEmpty() && m_title.length() > 1 )
+ mrl.setTitle( m_title );
+ if (mrl.artist().isEmpty() && !m_artist.stripWhiteSpace().isEmpty())
+ mrl.setArtist(m_artist);
+ if (mrl.album().isEmpty() && !m_album.stripWhiteSpace().isEmpty())
+ mrl.setAlbum(m_album);
+ if (mrl.genre().isEmpty() && !m_genre.stripWhiteSpace().isEmpty())
+ mrl.setGenre(m_genre);
+ if (mrl.track().isEmpty() && !m_track.stripWhiteSpace().isEmpty())
+ mrl.setTrack(m_track);
+ if (mrl.comment().isEmpty() && !m_comment.stripWhiteSpace().isEmpty())
+ mrl.setComment(m_comment);
+ if (mrl.length().isNull()) {
+ QTime length = QTime().addMSecs(m_timer->getTotalTimeMS());
+ if (!length.isNull())
+ mrl.setLength(length);
+ }
+ m_playlist[m_current] = mrl;
+
+ QString caption = mrl.title();
+ if (!mrl.artist().isEmpty())
+ caption.append(QString(" (") + mrl.artist() + ")");
+ emit setWindowCaption(caption);
+ /* if we don't have a playlist emit signalNewMeta() */
+ if (mrl.url() == m_mrl.url()) {
+ m_mrl = mrl;
+ emit signalNewMeta(m_mrl);
+ }
+}
+
+
+
+void GStreamerPart::slotInfo()
+{
+ QString info;
+ QTextStream ts(&info, IO_WriteOnly);
+ ts << "<qt><table width=\"90%\">";
+ ts << "<tr><td colspan=\"2\"><center><b>" << m_title << "</b></center></td></tr>";
+ if (!m_artist.isNull())
+ ts << "<tr><td><b>" << i18n("Artist") << ":</b></td><td> " << m_artist << "</td></tr>";
+ if (!m_album.isNull())
+ ts << "<tr><td><b>" << i18n("Album") << ":</b></td><td> " << m_album << "</td></tr>";
+ if (!m_track.isNull())
+ ts << "<tr><td><b>" << i18n("Track") << ":</b></td><td> " << m_track << "</td></tr>";
+ if (!m_year.isNull())
+ ts << "<tr><td><b>" << i18n("Year") << ":</b></td><td> " << m_year << "</td></tr>";
+ if (!m_genre.isNull())
+ ts << "<tr><td><b>" << i18n("Genre") << ":</b></td><td> " << m_genre << "</td></tr>";
+ if (!m_comment.isNull())
+ ts << "<tr><td><b>" << i18n("Comment") << ":</b></td><td> " << m_comment << "</td></tr>";
+
+ QTime length = QTime().addMSecs(m_timer->getTotalTimeMS());
+ if (!length.isNull())
+ ts << "<tr><td><b>" << i18n("Length") << ":</b></td><td> " << length.toString("h:mm:ss") << "</td></tr>";
+
+ ts << "<br><br>";
+
+ ts << "<tr><td><b>" << i18n("Audio") << ":</b></td><td> " << m_audioCodec << "</td></tr>";
+ int width = m_video->getFrameSize().width();
+ int height = m_video->getFrameSize().height();
+ if (width > 0 && height > 0)
+ ts << "<tr><td><b>" << i18n("Video") << ":</b></td><td> " << m_videoCodec << " " << width << "x" << height << "</td></tr>";
+
+ ts << "</table></qt>";
+
+ KMessageBox::information(0, info);
+}
+
+
+
+void GStreamerPart::slotSetVisualPlugin( const QString& name )
+{
+ if ( name != "none" ) {
+ GstElement* visual = gst_element_factory_make( name.ascii(), "visualization" );
+ if ( visual ) {
+ g_object_set( G_OBJECT(m_play), "vis-plugin", visual, NULL );
+ if ( m_visual )
+ g_object_unref( m_visual );
+ m_visual = visual;
+ m_visualPluginName = name;
+ }
+ else
+ kdWarning() << "GStreamer: Initialization of visualization plugin failed (" << name << ")" << endl;
+ }
+ else {
+ if (m_visual) {
+ g_object_set(G_OBJECT (m_play), "vis-plugin", NULL, NULL);
+ g_object_unref(m_visual);
+ m_visual = NULL;
+ m_visualPluginName = "none";
+ }
+ }
+}
+
+
+
+void GStreamerPart::slotContextMenu( const QPoint& pos )
+{
+ if (factory()) {
+ KPopupMenu *pop = (KPopupMenu*)factory()->container("context_menu", this);
+ if ( pop )
+ pop->popup(pos);
+ }
+}
+
+
+
+void GStreamerPart::loadConfig()
+{
+ kdDebug() << "GStreamerPart: Load config" << endl;
+ KConfig* config = instance()->config();
+ config->setGroup("General Options");
+
+ m_audioSinkName = config->readEntry("Audio Sink", "alsasink");
+ m_videoSinkName = config->readEntry("Video Sink", "xvimagesink");
+ m_visualPluginName = config->readEntry("Visual Plugin", "goom");
+ m_savedVolume = config->readNumEntry("Volume", 25);
+ m_device = config->readEntry("CD Device", "/dev/dvd");
+}
+
+
+
+void GStreamerPart::saveConfig()
+{
+ kdDebug() << "GStreamerPart: Save config" << endl;
+
+ KConfig* config = instance()->config();
+ config->setGroup("General Options");
+
+ config->writeEntry( "Audio Sink", m_audioSinkName );
+ config->writeEntry( "Video Sink", m_videoSinkName );
+ config->writeEntry( "Visual Plugin", m_visualPluginName );
+ config->writeEntry( "Volume", m_volume->value() );
+ config->writeEntry( "CD Device", m_device );
+}
+
+
+
+void GStreamerPart::slotPrepareForFullscreen( bool fullscreen )
+{
+ if ( fullscreen )
+ m_video->startMouseHideTimer();
+ else
+ m_video->stopMouseHideTimer();
+}
+
+
+
+void GStreamerPart::initActions()
+{
+ new KAction(i18n("Toggle Minimal Mode"), 0, 0, this, SIGNAL(signalToggleMinimalMode()), actionCollection(), "player_minimal_mode");
+ new KAction(i18n("Play"), "player_play", 0, this, SLOT(slotPlay()), actionCollection(), "player_play");
+ new KAction(i18n("Pause"), "player_pause", Key_Space, this, SLOT(slotTogglePause()), actionCollection(), "player_pause");
+ new KAction(i18n("Stop"), "player_stop", Key_Backspace, this, SLOT(slotStop()), actionCollection(), "player_stop");
+ new KAction(i18n("&Next"), "player_end", Key_PageDown, this, SLOT(slotNext()), actionCollection(), "player_next");
+ new KAction(i18n("&Previous"), "player_start", Key_PageUp, this, SLOT(slotPrevious()), actionCollection(), "player_previous");
+
+ m_timer = new Timer();
+ new KWidgetAction(m_timer->getSlider(), i18n("Position"), 0, 0, 0, actionCollection(), "player_position");
+ new KWidgetAction((QWidget*)m_timer->getLabel(), i18n("Playtime"), 0, 0, 0, actionCollection(), "player_playtime");
+
+ m_audioVisual = new KSelectAction(i18n("Audio &Visualization"), 0, actionCollection(), "audio_visual");
+ connect(m_audioVisual, SIGNAL(activated(const QString&)), this, SLOT(slotSetVisualPlugin(const QString&)));
+ m_audioVisualPluginList.prepend("none");
+ m_audioVisual->setItems(m_audioVisualPluginList);
+ m_audioVisual->setCurrentItem(m_audioVisual->items().findIndex(m_visualPluginName));
+
+ new KAction(i18n("&Mute"), "player_mute", Key_U, this, SLOT(slotMute()), actionCollection(), "audio_mute");
+ new KAction(i18n("&Auto"), "viewmagfit", Key_F5, m_video, SLOT(slotAspectRatioAuto()), actionCollection(), "aspect_auto");
+ new KAction(i18n("&4:3"), "viewmagfit", Key_F6, m_video, SLOT(slotAspectRatio4_3()), actionCollection(), "aspect_43");
+ new KAction(i18n("A&namorphic"), "viewmagfit", Key_F7, m_video, SLOT(slotAspectRatioAnamorphic()), actionCollection(), "aspect_anamorphic");
+ new KAction(i18n("&DVB"), "viewmagfit", Key_F8, m_video, SLOT(slotAspectRatioDVB()), actionCollection(), "aspect_dvb");
+ new KAction(i18n("&Square"), "viewmagfit", Key_F9, m_video, SLOT(slotAspectRatioSquare()), actionCollection(), "aspect_square");
+ new KAction(i18n("&Video Settings"), "configure", Key_V, this, SLOT(slotVideoSettings()), actionCollection(), "video_settings");
+ new KAction(i18n("Track &Info"), "info", 0 , this, SLOT(slotInfo()), actionCollection(), "player_track_info");
+
+ m_volume = new QSlider(Horizontal, 0);
+ QToolTip::add(m_volume, i18n("Volume"));
+ m_volume->setRange(0, 100);
+ m_volume->setSteps(1, 5);
+ m_volume->setFixedWidth(75);
+ connect(m_volume, SIGNAL(valueChanged(int)), this, SLOT(slotVolume(int)));
+ slotSetVolume(m_savedVolume);
+ new KWidgetAction(m_volume, i18n("Volume"), 0, 0, 0, actionCollection(), "audio_volume");
+ new KAction(i18n("&GStreamer Engine Parameters"), "edit", 0, this, SLOT(slotConfigDialog()), actionCollection(), "settings_gst_parameter");
+
+ connect(m_video, SIGNAL(signalRightClick(const QPoint&)), this, SLOT(slotContextMenu(const QPoint&)));
+}
+
+
+//Change audio sink on the fly
+void GStreamerPart::setAudioSink( QString sinkName )
+{
+ GstElement* sink = gst_element_factory_make(sinkName.ascii(), "audiosink");
+ if ( !sink ) {
+ KMessageBox::error(0, i18n("Error: Can't init new Audio Driver %1 - using %2!").arg(sinkName).arg(m_audioSinkName));
+ return;
+ }
+
+ if ( m_play )
+ g_object_set( G_OBJECT(m_play), "audio-sink", sink, NULL );
+ m_audiosink = sink;
+ m_audioSinkName = sinkName;
+ kdDebug() << "GStreamerPart: Using audio driver: " << m_audioSinkName << endl;
+}
+
+/**
+ * Initialize GStreamer
+ */
+bool GStreamerPart::initGStreamer()
+{
+ if ( !gst_init_check(NULL, NULL,NULL) ) {
+ KMessageBox::error(0, i18n("GStreamer could not be initialized!"));
+ return false;
+ }
+
+ /* check GStreamer version */
+ guint maj, min, mic, nan;
+ gst_version(&maj, &min, &mic, &nan);
+ kdDebug() << "GStreamerPart: Found GStreamer version "<<maj<<"."<<min<<"."<<mic<<"."<< nan <<endl<<endl;
+
+ /* check for visualization plugins */
+ GList* factories = gst_registry_get_feature_list(gst_registry_get_default (), GST_TYPE_ELEMENT_FACTORY);
+ QString name, cat;
+ while ( factories ) {
+ name = GST_PLUGIN_FEATURE_NAME(factories->data);
+ cat = gst_element_factory_get_klass(GST_ELEMENT_FACTORY(factories->data));
+ // kdDebug() << "GStreamerPart: Found plugin: " << name << " - Category: " << cat << endl;
+ if ( cat == "Visualization" )
+ m_audioVisualPluginList.append(name);
+ else if ( cat == "Sink/Audio" )
+ m_audioPluginList.append(name);
+ else if ( cat == "Sink/Video" )
+ m_videoPluginList.append(name);
+ factories = g_list_next(factories);
+ }
+ g_list_free( factories );
+
+ /*
+ * Init audio driver
+ */
+ m_audiosink = gst_element_factory_make( m_audioSinkName.ascii(), "audiosink" );
+ if ( !m_audiosink ) {
+ KMessageBox::error(0, i18n("Can't init Audio Driver '%1' - trying another one...").arg(m_audioSinkName));
+ if ( (m_audiosink = gst_element_factory_make("alsasink", "audiosink")) != NULL )
+ kdDebug() << "GStreamerPart: Using audio-driver: alsasink" << endl;
+ else {
+ if ( (m_audiosink = gst_element_factory_make("osssink", "audiosink")) != NULL )
+ kdDebug() << "GStreamerPart: Using audio-driver: osssink" << endl;
+ else {
+ if ( (m_audiosink = gst_element_factory_make("artsdsink", "audiosink")) != NULL )
+ kdDebug() << "GStreamerPart: Using audio-driver: artsdsink" << endl;
+ else {
+ KMessageBox::error(0, i18n("No useable audio-driver found!") + " (" + m_audioSinkName + ")");
+ return false;
+ }
+ }
+ }
+ }
+ else
+ kdDebug() << "GStreamerPart: Using audio driver: " << m_audioSinkName << endl;
+ gst_element_set_state( m_audiosink, GST_STATE_READY );
+ /*
+ * Init video driver...
+ */
+ m_videosink = gst_element_factory_make( m_videoSinkName.ascii(), "videosink" );
+ if ( !m_videosink ) {
+ KMessageBox::error(0, i18n("Can't init Video Driver '%1' - trying another one...").arg(m_videoSinkName));
+ if ((m_videosink = gst_element_factory_make("xvimagesink", "videosink")) != NULL)
+ kdDebug() << "GStreamerPart: Using video-driver: xvimagesink" << endl;
+ else {
+ if ( (m_videosink = gst_element_factory_make( "ximagesink", "videosink") ) != NULL)
+ kdDebug() << "GStreamerPart: Using video-driver: ximagesink" << endl;
+ else {
+ KMessageBox::error(0, i18n("No useable video-driver found!") + " (" + m_videoSinkName + ")");
+ return false;
+ }
+ }
+ }
+ else
+ kdDebug() << "GStreamerPart: Using video driver: " << m_videoSinkName << endl;
+ gst_element_set_state( m_videosink, GST_STATE_READY );
+
+ /*
+ * Visualization
+ */
+ kdDebug() << "GStreamerPart: Using visualization plugin: " << m_visualPluginName << endl;
+ if ( m_visualPluginName != "none" ) {
+ m_visual = gst_element_factory_make( m_visualPluginName.ascii(), "visualization" );
+ if ( !m_visual )
+ kdWarning() << "GStreamer: Initialization of visualization plugin failed" << endl;
+ }
+
+ return true;
+}
+
+
+
+bool GStreamerPart::createPlaybin()
+{
+ m_play = gst_element_factory_make( "playbin", "play" );
+ if ( !m_play ) {
+ KMessageBox::error( 0, i18n("GStreamer playbin could not be initialized!") );
+ return false;
+ }
+ if ( !m_videosink || !m_audiosink ) {
+ KMessageBox::error( 0, i18n("GStreamer sink(s) missing, playbin could not be initialized!") );
+ gst_object_unref( GST_OBJECT(m_play) );
+ return false;
+ }
+
+ g_object_set( G_OBJECT(m_play), "video-sink", m_videosink, NULL );
+ g_object_set( G_OBJECT(m_play), "audio-sink", m_audiosink, NULL );
+ g_object_set( G_OBJECT(m_play), "vis-plugin", m_visual, NULL );
+ gst_element_set_state( m_play, GST_STATE_READY );
+ slotVolume( m_volume->value() );
+ m_video->setPlaybin( m_play );
+ m_timer->setPlaybin( m_play );
+
+ bus = gst_pipeline_get_bus( GST_PIPELINE(m_play) );
+ busTimer.start( 5 );
+ return true;
+}
+
+
+
+void GStreamerPart::deletePlaybin()
+{
+ if ( bus ) {
+ busTimer.stop();
+ gst_object_unref( GST_OBJECT(bus) );
+ bus = NULL;
+ }
+ if ( m_play ) {
+ m_video->setPlaybin( NULL );
+ m_timer->setPlaybin( NULL );
+ gst_element_set_state( m_play, GST_STATE_NULL );
+ gst_object_unref( GST_OBJECT(m_play) );
+ m_play = NULL;
+ }
+}
+
+
+
+void GStreamerPart::gstPlay( const QString& trackUrl, const QString& subtitleUrl )
+{
+ if ( !m_play && !createPlaybin() )
+ return;
+
+ m_title = QString::null;
+ m_artist = QString::null;
+ m_album = QString::null;
+ m_year = QString::null;
+ m_genre = QString::null;
+ m_track = QString::null;
+ m_comment = QString::null;
+ m_audioCodec = QString::null;
+ m_videoCodec = QString::null;
+ QString url = trackUrl;
+
+ if ( GST_STATE(m_play)!=GST_STATE_READY )
+ gst_element_set_state( m_play, GST_STATE_READY );
+
+ /* make sure the xoverlay know the winId */
+ m_video->refresh();
+
+ /* KDE has the habit to do "file:/location", whereas we
+ expect "file:///location" */
+ if (url.left(7).lower() == "file://") {
+ url.insert(6, "/");
+ }
+ else if (url[0] == '/') {
+ url.prepend("file://");
+ }
+ gchar *uri = g_strdup( url.local8Bit() );
+ kdDebug() << "GStreamerPart: play URL: " << uri << endl;
+ g_object_set( G_OBJECT(m_play), "uri", uri, NULL );
+ g_free( uri );
+
+ //process subtitle url
+ if ( !subtitleUrl.isNull() ) {
+ QString sub = subtitleUrl;
+ if ( sub.left(7).lower() == "file://" ) {
+ sub.insert(6, "/");
+ }
+ else if (sub[0] == '/') {
+ sub.prepend("file://");
+ }
+ // set sub font
+ g_object_set( G_OBJECT(m_play), "subtitle-font-desc", "sans bold 18", NULL );
+
+ gchar* suburi = g_strdup( sub.local8Bit() );
+ kdDebug() << "GStreamerPart: Setting subtitle URL to " << suburi << endl;
+ g_object_set( G_OBJECT(m_play), "suburi", suburi, NULL );
+ g_free( suburi );
+ }
+ else {
+ g_object_set( G_OBJECT(m_play), "suburi", NULL, NULL );
+ }
+
+ if ( !currentDevice.isEmpty() )
+ setDevice( currentDevice );
+ gst_element_set_state( m_play, GST_STATE_PLAYING );
+
+ m_timer->start();
+}
+
+
+
+void GStreamerPart::slotReadBus()
+{
+ //kdDebug() << "readBus : " << QTime::currentTime().toString("hh:mm:ss:zzz") << endl;
+ if ( !bus )
+ return;
+
+ GstMessage *msg = gst_bus_pop( bus );
+ if ( !msg )
+ return;
+
+ gchar *debug = NULL;
+ GError *error = NULL;
+ GstState old, cur, pending;
+
+ GstElement *src = (GstElement*)GST_MESSAGE_SRC( msg );
+ switch( GST_MESSAGE_TYPE( msg ) ) {
+ case GST_MESSAGE_STATE_CHANGED:
+ if ( src==m_play ) {
+ gst_message_parse_state_changed( msg, &old, &cur, &pending );
+ if ( cur==old )
+ kdDebug() << "GST_MESSAGE_STATE_UNCHANGED" << endl;
+ else {
+ kdDebug() << "GST_MESSAGE_STATE_CHANGED" << endl;
+ m_status = cur;
+ gstStateChanged();
+ }
+ }
+ break;
+ case GST_MESSAGE_ERROR:
+ gst_message_parse_error( msg, &error, &debug );
+ emit setStatusBarText(i18n("Error"));
+ if (m_url != m_logoPath) {
+ errorMessage = error->message;
+ errorDetails = debug;
+ QTimer::singleShot( 0, this, SLOT(slotEngineError()) );
+ }
+ g_error_free( error );
+ g_free( debug );
+ gst_element_set_state( m_play, GST_STATE_NULL );
+ //gst_element_set_state( m_play, GST_STATE_READY );
+ break;
+ case GST_MESSAGE_EOS:
+ if ( m_current < m_playlist.count()-1 ) {
+ m_current ++;
+ slotPlay();
+ }
+ else {
+ kdDebug() << "GStreamerPart: Playback finished" << endl;
+ m_timer->stop();
+ //m_status = GST_STATE_READY;
+ if (m_url != m_logoPath)
+ emit signalTrackFinished();
+ }
+ break;
+ case GST_MESSAGE_TAG:
+ GstTagList *tagList;
+ gst_message_parse_tag( msg, &tagList );
+ foundTag( tagList );
+ break;
+ case GST_MESSAGE_WARNING: kdDebug() << "GST_MESSAGE_WARNING" << endl; break;
+ case GST_MESSAGE_INFO: kdDebug() << "GST_MESSAGE_INFO" << endl; break;
+ case GST_MESSAGE_BUFFERING: kdDebug() << "GST_MESSAGE_BUFFERING" << endl; break;
+ case GST_MESSAGE_STATE_DIRTY: kdDebug() << "GST_MESSAGE_STATE_DIRTY" << endl; break;
+ case GST_MESSAGE_STEP_DONE: kdDebug() << "GST_MESSAGE_STEP_DONE" << endl; break;
+ case GST_MESSAGE_CLOCK_PROVIDE: kdDebug() << "GST_MESSAGE_CLOCK_PROVIDE" << endl; break;
+ case GST_MESSAGE_CLOCK_LOST: kdDebug() << "GST_MESSAGE_CLOCK_LOST" << endl; break;
+ case GST_MESSAGE_NEW_CLOCK: kdDebug() << "GST_MESSAGE_NEW_CLOCK" << endl; break;
+ case GST_MESSAGE_STRUCTURE_CHANGE: kdDebug() << "GST_MESSAGE_STRUCTURE_CHANGE" << endl; break;
+ case GST_MESSAGE_STREAM_STATUS: kdDebug() << "GST_MESSAGE_STREAM_STATUS" << endl; break;
+ case GST_MESSAGE_APPLICATION: kdDebug() << "GST_MESSAGE_APPLICATION" << endl; break;
+ case GST_MESSAGE_ELEMENT: kdDebug() << "GST_MESSAGE_ELEMENT" << endl; break;
+ case GST_MESSAGE_SEGMENT_START: kdDebug() << "GST_MESSAGE_SEGMENT_START" << endl; break;
+ case GST_MESSAGE_SEGMENT_DONE: kdDebug() << "GST_MESSAGE_SEGMENT_DONE" << endl; break;
+ case GST_MESSAGE_DURATION: kdDebug() << "GST_MESSAGE_DURATION" << endl; break;
+ default:
+ kdDebug() << "GST_MESSAGE_OTHER" << endl;
+ }
+ gst_message_unref( msg );
+}
+
+
+
+void GStreamerPart::slotEngineError()
+{
+ KMessageBox::detailedError( NULL, errorMessage, errorDetails );
+}
+
+
+
+void GStreamerPart::foundTag( GstTagList *taglist )
+{
+ kdDebug() << " Received meta tags..." << endl;
+
+ char* string;
+ guint intVal = 0;
+ bool success = false;
+
+ if ( gst_tag_list_get_string(taglist, GST_TAG_TITLE, &string) && string ) {
+ m_title = string;
+ success = true;
+ }
+ if ( gst_tag_list_get_string( taglist, GST_TAG_ARTIST, &string) && string ) {
+ m_artist = string;
+ success = true;
+ }
+ if ( gst_tag_list_get_string(taglist, GST_TAG_ALBUM, &string) && string ) {
+ m_album = string;
+ success = true;
+ }
+ if ( gst_tag_list_get_string(taglist, GST_TAG_GENRE, &string) && string ) {
+ m_genre = string;
+ success = true;
+ }
+ if ( gst_tag_list_get_uint(taglist, GST_TAG_TRACK_NUMBER, &intVal) && intVal > 0 ) {
+ m_track = QString::number(intVal);
+ success = true;
+ }
+ if ( gst_tag_list_get_string(taglist, GST_TAG_COMMENT, &string) && string ) {
+ m_comment = string;
+ success = true;
+ }
+ if ( gst_tag_list_get_string(taglist, GST_TAG_AUDIO_CODEC, &string) && string )
+ m_audioCodec = string;
+ if ( gst_tag_list_get_string(taglist, GST_TAG_VIDEO_CODEC, &string) && string )
+ m_videoCodec = string;
+
+ if (success)
+ processMetaInfo();
+}
diff --git a/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.desktop b/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.desktop
new file mode 100644
index 0000000..8a2015a
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.desktop
@@ -0,0 +1,45 @@
+[Desktop Entry]
+Encoding=UTF-8
+Icon=gstreamer
+Name=Kaffeine-GStreamer
+Name[af]=Kaffeine=GStremer
+Name[nb]=Kaffeine GStreamer
+Name[pa]=ਕੈਫ਼ੀਨ-ਜੀਸਟਰੀਮਰ
+Name[se]=Kaffeine GStreamer
+Name[sv]=Kaffeine-Gstreamer
+Name[xx]=xxKaffeine-GStreamerxx
+Comment=A Kaffeine engine based on GStreamer.
+Comment[af]='n Kaffeine enjin wat op GStreamer gebaseer is.
+Comment[bg]=Ядро за Kaffeine, базирано върху GStreamer.
+Comment[ca]=Una part de reproductor basada en GStreamer.
+Comment[cs]=Část přehrávače založená na GStreameru.
+Comment[da]=En Kaffeine-grænseflade baseret på Gstreamer.
+Comment[de]=Ein auf GStreamer basierendes Programmmodul.
+Comment[el]=Μία μηχανή του Kaffeine βασισμένη στο GStreamer.
+Comment[et]=Kaffeine mootor GStreameri põhjal.
+Comment[ga]=Inneall Kaffeine bunaithe ar GStreamer.
+Comment[gl]=Un motor para Kaffeine baseado en GStreamer.
+Comment[hu]=GStreamer-alapú Kaffeine-alrendszer.
+Comment[it]=Un motore di Kaffeine basato su GStreamer.
+Comment[ja]=GStreamer に基づく Kaffeine エンジン
+Comment[lt]=Kaffeine variklis, paremtas GStreamer.
+Comment[nb]=En spillermotor basert på GStreamer.
+Comment[nl]=Een Kaffeine-engine gebaseerd op GStreamer.
+Comment[pa]=ਜੀਸਟੀਮਰ ਅਧਾਰਤ ਇੱਕ ਕੈਫ਼ੀਨ ਇੰਜਣ ਹੈ।
+Comment[pl]=Moduł odtwarzacza do Kaffeine bazujący na GStreamer.
+Comment[pt]=Um motor Kaffeine no GStreamer.
+Comment[pt_BR]=Um componente de reprodução Kaffeine baseado no GStreamer.
+Comment[se]=Čuojanmohtor vuođđoduvvon GStreameris.
+Comment[sr]=Кафеинов мотор заснован на GStreamer-у.
+Comment[sr@Latn]=Кафеинов мотор заснован на GStreamer-у.
+Comment[sv]=Ett Kaffeine-gränssnitt baserad på Gstreamer.
+Comment[tg]=Барномаи Kaffeine дар асоси GStreamer.
+Comment[th]=โปรแกรมประมวลผลของ Kaffeine โดยใช้ GStreamer
+Comment[tr]=GStreamer tabanlı bir Kaffeine motoru.
+Comment[uk]=Рушій Kaffeine, оснований на GStreamer.
+Comment[xx]=xxA Kaffeine engine based on GStreamer.xx
+MimeType=application/x-ogg;video/x-matroska;audio/x-matroska;video/mpeg;video/msvideo;video/quicktime;video/vnd.rn-realvideo;video/x-avi;video/x-fli;video/x-flic;video/x-ms-asf;video/x-ms-wmv;video/x-msvideo;application/x-mplayer2;application/smil;application/x-kaffeine;audio/x-musepack;
+ServiceTypes=KParts/ReadOnlyPart,KaffeinePart
+Type=Service
+X-KDE-Library=libgstreamerpart
+InitialPreference=1
diff --git a/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.h b/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.h
new file mode 100644
index 0000000..0f5c276
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.h
@@ -0,0 +1,154 @@
+/*
+ * gstreamer_part.h
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef GSTREAMER_PART_H
+#define GSTREAMER_PART_H
+
+#include <kparts/factory.h>
+
+#include <gst/gst.h>
+
+#include "kaffeinepart.h"
+
+#include "timer.h"
+#include "video.h"
+#include "videosettings.h"
+#include "gstreamerconfig.h"
+
+
+
+class GStreamerPart : public KaffeinePart
+{
+ Q_OBJECT
+public:
+ GStreamerPart( QWidget*, const char*, QObject*, const char*, const QStringList& );
+ virtual ~GStreamerPart();
+
+ /*
+ *Reimplement from KaffeinePart
+ */
+ bool isPlaying();
+ bool isPaused();
+ uint volume() const; /* percent */
+ uint position() const; /* percent */
+ bool hasVideo();
+
+ bool closeURL();
+ static KAboutData* createAboutData();
+
+public slots:
+ /*
+ * Reimplement from KaffeinePart
+ */
+ bool openURL( const MRL& mrl );
+ void slotPlay();
+ void slotTogglePause( bool );
+ void slotSetVolume( uint ); /* percent */
+ void slotSetPosition( uint ); /* percent */
+ void slotStop();
+ void slotMute();
+ void slotPrepareForFullscreen( bool fullscreen );
+
+private slots:
+ void slotNext();
+ void slotPrevious();
+ void slotVolume( int );
+ void slotSaturation( int ); /* -1000...1000 */
+ void slotHue( int ); /* -1000...1000 */
+ void slotContrast( int ); /* -1000...1000 */
+ void slotBrightness( int ); /* -1000...1000 */
+ void slotContextMenu( const QPoint& pos );
+ void slotInfo();
+ void slotSetVisualPlugin( const QString& );
+ void slotVideoSettings();
+ void slotConfigDialog();
+ void slotEngineError();
+
+ void slotReadBus();
+
+private:
+ bool initGStreamer();
+ bool createPlaybin();
+ void deletePlaybin();
+ void loadConfig();
+ void saveConfig();
+ void gstPlay( const QString& trackUrl, const QString& subtitleUrl );
+ void initActions();
+ void showError();
+ void gstStateChanged();
+ void foundTag( GstTagList *taglist );
+ void processMetaInfo();
+ void setAudioSink( QString sinkName );
+ void setDevice( QString device );
+
+private:
+ GstElement *m_play;
+ GstElement *m_videosink;
+ GstElement *m_audiosink;
+ GstElement *m_visual;
+ GstBus *bus;
+ GstState m_status;
+
+ QTimer busTimer;
+
+ VideoWindow* m_video;
+ Timer* m_timer;
+ VideoSettings* m_videoSettings;
+ GStreamerConfig* m_gstConfig;
+ QSlider* m_volume;
+ KSelectAction* m_audioVisual;
+
+ MRL m_mrl;
+ QValueList<MRL> m_playlist;
+ uint m_current;
+ bool m_mute;
+ QString m_logoPath;
+
+ QString m_errorMsg;
+ QString m_errorDetails;
+
+ QString m_url;
+ QString m_title;
+ QString m_artist;
+ QString m_album;
+ QString m_track;
+ QString m_year;
+ QString m_genre;
+ QString m_comment;
+ QString m_audioCodec;
+ QString m_videoCodec;
+ QString errorMessage;
+ QString errorDetails;
+
+ QString m_audioSinkName;
+ QString m_videoSinkName;
+ QString m_visualPluginName;
+ QStringList m_audioVisualPluginList;
+ QStringList m_audioPluginList;
+ QStringList m_videoPluginList;
+ QString m_device, currentDevice;
+ int m_savedVolume;
+ int muteVolume;
+
+ KToolBar* m_posToolbar;
+};
+
+#endif /* GSTREAMER_PART_H */
diff --git a/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.rc b/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.rc
new file mode 100644
index 0000000..2dcfc56
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/gstreamer_part.rc
@@ -0,0 +1,105 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="gstreamer_part" version="5">
+<MenuBar>
+ <Menu name="player"><text>&amp;Player</text>
+ <Action name="player_play"/>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ <Separator/>
+ <Action name="audio_visual"/>
+ <Action name="audio_mute"/>
+ <Separator/>
+ <Menu name="video_aspect"><text>&amp;Aspect Ratio</text>
+ <Action name="aspect_auto"/>
+ <Action name="aspect_43"/>
+ <Action name="aspect_anamorphic"/>
+ <Action name="aspect_dvb"/>
+ <Action name="aspect_square"/>
+ </Menu>
+ <Action name="video_settings"/>
+ <Action name="player_track_info"/>
+ </Menu>
+ <Menu name="settings">
+ <Action name="settings_gst_parameter"/>
+ </Menu>
+</MenuBar>
+<ToolBar name="gstControlsToolBar" position="Bottom"><text>Controls Toolbar</text>
+ <Action name="player_previous"/>
+ <Action name="player_play"/>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_next"/>
+</ToolBar>
+<ToolBar name="gstVolumeToolBar"><text>Volume Toolbar</text>
+ <Action name="audio_volume"/>
+ <Action name="audio_mute"/>
+</ToolBar>
+<ToolBar name="gstPositionToolBar" fullWidth="true" position="Bottom"><text>Position Toolbar</text>
+ <Action name="player_position"/>
+ <Separator/>
+ <Action name="player_playtime"/>
+</ToolBar>
+<Menu name="context_menu">
+ <Action name="player_minimal_mode"/>
+ <Separator/>
+ <Action name="player_play"/>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ <Separator/>
+ <Action name="audio_visual"/>
+ <Action name="audio_mute"/>
+ <Separator/>
+ <Menu name="video_aspect"><text>&amp;Aspect Ratio</text>
+ <Action name="aspect_auto"/>
+ <Action name="aspect_43"/>
+ <Action name="aspect_anamorphic"/>
+ <Action name="aspect_dvb"/>
+ <Action name="aspect_square"/>
+ </Menu>
+ <Action name="video_settings"/>
+ <Action name="player_track_info"/>
+</Menu>
+<State name="disable_all">
+ <enable>
+ <Action name="player_play"/>
+ </enable>
+ <disable>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_position"/>
+ <Action name="player_playtime"/>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ </disable>
+</State>
+<State name="not_playing">
+ <enable>
+ <Action name="player_play"/>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ </enable>
+ <disable>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_position"/>
+ <Action name="player_playtime"/>
+ </disable>
+</State>
+<State name="playing">
+ <enable>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_position"/>
+ <Action name="player_playtime"/>
+ </enable>
+ <disable>
+ <Action name="player_play"/>
+ </disable>
+</State>
+</kpartgui> \ No newline at end of file
diff --git a/kaffeine/src/player-parts/gstreamer-part/gstreamerconfig.cpp b/kaffeine/src/player-parts/gstreamer-part/gstreamerconfig.cpp
new file mode 100644
index 0000000..19025bc
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/gstreamerconfig.cpp
@@ -0,0 +1,117 @@
+/*
+ * gstreamerconfig.cpp - config dialog for gstreamer parameters
+ *
+ * Copyright (C) 2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <kcombobox.h>
+#include <klineedit.h>
+#include <kseparator.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+
+#include "gstreamerconfig.h"
+#include "gstreamerconfig.moc"
+
+
+GStreamerConfig::GStreamerConfig(const QStringList& audioDrivers, const QStringList& videoDrivers) :
+ KDialogBase(KDialogBase::IconList, i18n("GStreamer Engine Parameters"), KDialogBase::Ok|KDialogBase::Cancel,
+ KDialogBase::Cancel)
+
+{
+ setInitialSize(QSize(400,300), true);
+
+ QFrame* frame = NULL;
+ QGridLayout* layout = NULL;
+ QLabel* label = NULL;
+
+ //Audio Page
+ frame = addPage(i18n("Audio"), i18n("Audio Options"), KGlobal::iconLoader()->loadIcon("sound", KIcon::Panel,
+ KIcon::SizeMedium));
+ layout = new QGridLayout(frame, 10, 2);
+ layout->setMargin(10);
+ layout->setSpacing(10);
+ m_audioDriverBox = new KComboBox(frame);
+ m_audioDriverBox->insertStringList(audioDrivers);
+ label = new QLabel(i18n("Prefered audio driver"), frame);
+ layout->addWidget(label, 1, 0);
+ layout->addWidget(m_audioDriverBox, 1, 1);
+ layout->addMultiCellWidget(new KSeparator(KSeparator::Horizontal, frame), 2, 2, 0, 1);
+
+ //Video Page
+ frame = addPage(i18n("Video"), i18n("Video Options"), KGlobal::iconLoader()->loadIcon("video", KIcon::Panel,
+ KIcon::SizeMedium));
+ layout = new QGridLayout(frame, 10, 2);
+ layout->setMargin(10);
+ layout->setSpacing(10);
+ m_videoDriverBox = new KComboBox(frame);
+ m_videoDriverBox->insertStringList(videoDrivers);
+ label = new QLabel(i18n("Prefered video driver")+ "*", frame);
+ layout->addWidget(label, 1, 0);
+ layout->addWidget(m_videoDriverBox, 1, 1);
+ layout->addMultiCellWidget(new KSeparator(KSeparator::Horizontal, frame), 2, 2, 0, 1);
+ layout->addWidget(new QLabel(QString("<small>") + i18n("* Restart required!") + "</small>", frame), 10, 1);
+
+ //Media page
+ frame = addPage(i18n("Media"), i18n("Media Options"), KGlobal::iconLoader()->loadIcon("cdrom_unmount", KIcon::Panel,
+ KIcon::SizeMedium));
+ layout = new QGridLayout(frame, 10, 2);
+ layout->setMargin(10);
+ layout->setSpacing(10);
+ m_driveEdit = new KLineEdit(frame);
+ label = new QLabel(i18n("CD, VCD, DVD drive"), frame);
+ layout->addWidget(label, 1, 0);
+ layout->addWidget(m_driveEdit, 1, 1);
+ layout->addMultiCellWidget(new KSeparator(KSeparator::Horizontal, frame), 2, 2, 0, 1);
+}
+
+GStreamerConfig::~GStreamerConfig()
+{}
+
+QString GStreamerConfig::getAudioDriver() const
+{
+ return m_audioDriverBox->currentText();
+}
+
+QString GStreamerConfig::getVideoDriver() const
+{
+ return m_videoDriverBox->currentText();
+}
+
+QString GStreamerConfig::getDrive() const
+{
+ return m_driveEdit->text();
+}
+
+void GStreamerConfig::setDrive(const QString& drive)
+{
+ m_driveEdit->setText(drive);
+}
+
+void GStreamerConfig::setAudioDriver(const QString& name)
+{
+ m_audioDriverBox->setCurrentText(name);
+}
+
+void GStreamerConfig::setVideoDriver(const QString& name)
+{
+ m_videoDriverBox->setCurrentText(name);
+}
diff --git a/kaffeine/src/player-parts/gstreamer-part/gstreamerconfig.h b/kaffeine/src/player-parts/gstreamer-part/gstreamerconfig.h
new file mode 100644
index 0000000..f85d882
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/gstreamerconfig.h
@@ -0,0 +1,56 @@
+/*
+ * gstreamerconfig.h - config dialog for gstreamer parameters
+ *
+ * Copyright (C) 2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef GSTREAMERCONFIG_H
+#define GSTREAMERCONFIG_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kdialogbase.h>
+
+class QString;
+class QStringList;
+class KComboBox;
+class KLineEdit;
+
+class GStreamerConfig : public KDialogBase
+{
+ Q_OBJECT
+public:
+ GStreamerConfig(const QStringList& audioDrivers, const QStringList& videoDrivers);
+ ~GStreamerConfig();
+
+ QString getAudioDriver() const;
+ QString getVideoDriver() const;
+ QString getDrive() const;
+
+ void setDrive(const QString& drive);
+ void setAudioDriver(const QString& name);
+ void setVideoDriver(const QString& name);
+
+private:
+ KComboBox* m_audioDriverBox;
+ KComboBox* m_videoDriverBox;
+ KLineEdit* m_driveEdit;
+};
+
+#endif /* GSTREAMERCONFIG_H */
diff --git a/kaffeine/src/player-parts/gstreamer-part/timer.cpp b/kaffeine/src/player-parts/gstreamer-part/timer.cpp
new file mode 100644
index 0000000..93d0116
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/timer.cpp
@@ -0,0 +1,197 @@
+/*
+ * timer.cpp
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * heavily based on kiss by Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <qslider.h>
+#include <qlabel.h>
+#include <qtimer.h>
+
+#include "timer.h"
+
+#include "timer.moc"
+
+
+
+Timer::Timer() : QObject()
+{
+ m_label = new QLabel( "0:00 / 0:00", 0 );
+ m_slider = new QSlider( Qt::Horizontal, 0 );
+ m_slider->setMinValue( 0 );
+ m_slider->setEnabled( false );
+
+ connect( &updateTimer, SIGNAL(timeout()), SLOT(slotUpdate()) );
+
+ m_pos = GST_CLOCK_TIME_NONE;
+ m_len = GST_CLOCK_TIME_NONE;
+
+ m_play = NULL;
+ seeking = false;
+
+ connect( m_slider, SIGNAL(sliderPressed()), this, SLOT(slotSeekStart()) );
+ connect( m_slider, SIGNAL(sliderReleased()), this, SLOT(slotSeek()) );
+}
+
+
+
+void Timer::setPlaybin( GstElement *play )
+{
+ m_play = play;
+ m_slider->setEnabled( false );
+ m_slider->setValue( 0 );
+}
+
+
+
+Timer::~Timer()
+{
+}
+
+
+
+static char *niceTime( guint64 t )
+{
+ if ( t >= GST_SECOND*60*60 ) {
+ return g_strdup_printf("%d:%02d:%02d",
+ (int) (t / (GST_SECOND * 60 * 60)),
+ (int) ((t / (GST_SECOND * 60)) % 60),
+ (int) ((t / GST_SECOND) % 60));
+ }
+ else {
+ return g_strdup_printf("%d:%02d",
+ (int) ((t / (GST_SECOND * 60)) % 60),
+ (int) ((t / GST_SECOND) % 60));
+ }
+}
+
+
+
+void Timer::slotSeekStart()
+{
+ seeking = true;
+}
+
+
+
+void Timer::slotSeek()
+{
+ if ( !m_play )
+ return;
+
+ gint64 gval = m_slider->value();
+ GstSeekFlags flags = (GstSeekFlags)(GST_SEEK_FLAG_FLUSH|GST_SEEK_FLAG_KEY_UNIT);
+ gst_element_seek( m_play, 1.0, GST_FORMAT_TIME, flags,
+ GST_SEEK_TYPE_SET, gval*GST_SECOND, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+ gst_element_get_state( m_play, NULL, NULL, 100*GST_MSECOND);
+ seeking = false;
+}
+
+
+
+void Timer::seekPercent( uint percent )
+{
+ //slotSeek( (m_slider->maxValue() * percent) / 100 );
+}
+
+
+
+void Timer::slotUpdate()
+{
+ gint64 t;
+ GstFormat fmt = GST_FORMAT_TIME;
+ char *txt;
+
+ if ( seeking )
+ return;
+
+ if ( !m_play )
+ return;
+
+ if ( gst_element_query_duration( m_play, &fmt, &t ) ) {
+ m_len = t;
+ m_slider->setMaxValue( m_len / GST_SECOND );
+ }
+
+ if ( !gst_element_query_position( m_play, &fmt, &t ) )
+ return;
+
+ m_pos = t;
+
+ m_currentTimeMS = m_pos/1000000;
+ m_totalTimeMS = m_len/1000000;
+
+ if ( GST_CLOCK_TIME_IS_VALID (m_len) ) {
+ gchar *t1 = niceTime( m_pos ), *t2 = niceTime( m_len );
+ txt = g_strdup_printf( "%s / %s", t1, t2) ;
+ g_free(t1);
+ g_free(t2);
+ }
+ else {
+ txt = niceTime( m_pos );
+ }
+ m_label->setText( txt );
+ g_free( txt );
+
+ m_slider->setValue( m_pos / GST_SECOND );
+}
+
+
+
+void Timer::start()
+{
+ if ( updateTimer.isActive() )
+ return;
+ m_slider->setEnabled( true);
+ seeking = false;
+ updateTimer.start( 1000 );
+}
+
+
+
+void Timer::stop()
+{
+ if ( !updateTimer.isActive() )
+ return;
+ updateTimer.stop();
+ m_slider->setEnabled( false );
+ m_slider->setValue(0);
+}
+
+
+
+QLabel* Timer::getLabel() const
+{
+ return m_label;
+}
+
+
+
+QSlider* Timer::getSlider() const
+{
+ return m_slider;
+}
diff --git a/kaffeine/src/player-parts/gstreamer-part/timer.h b/kaffeine/src/player-parts/gstreamer-part/timer.h
new file mode 100644
index 0000000..9ee5bff
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/timer.h
@@ -0,0 +1,77 @@
+/*
+ * timer.h
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * heavily based on kiss by Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef TIMER_H
+#define TIMER_H
+
+#include <qobject.h>
+
+#include <gst/gst.h>
+
+class QSlider;
+class QLabel;
+class QTimer;
+class QTime;
+
+
+
+class Timer : public QObject
+{
+ Q_OBJECT
+
+public:
+ Timer();
+ ~Timer ();
+
+ void start();
+ void stop();
+ void setPlaybin( GstElement *play );
+
+ long getTotalTimeMS() { return m_totalTimeMS; }
+ long getCurrentTimeMS() { return m_currentTimeMS; }
+
+ void seekPercent(uint percent);
+
+ QLabel* getLabel() const;
+ QSlider* getSlider() const;
+
+public slots:
+ void slotSeekStart();
+ void slotSeek();
+
+private slots:
+ void slotUpdate();
+
+private:
+ QTimer updateTimer;
+ QLabel *m_label;
+ QSlider *m_slider;
+ GstElement *m_play;
+ bool seeking;
+
+ long m_currentTimeMS;
+ long m_totalTimeMS;
+ guint64 m_len, m_pos;
+};
+
+#endif /* TIMER_H */
diff --git a/kaffeine/src/player-parts/gstreamer-part/video.cpp b/kaffeine/src/player-parts/gstreamer-part/video.cpp
new file mode 100644
index 0000000..0fc76cd
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/video.cpp
@@ -0,0 +1,332 @@
+/*
+ * video.cpp
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * heavily based on kiss by Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qpainter.h>
+#include <qtimer.h>
+#include <qcursor.h>
+
+#include <kstatusbar.h>
+#include <ktoolbar.h>
+#include <kmenubar.h>
+#include <kdebug.h>
+
+#include <gst/interfaces/xoverlay.h>
+
+#include "video.h"
+
+#include "video.moc"
+
+
+
+VideoWindow::VideoWindow( QWidget *parent, GstElement *_element )
+ : QWidget (parent), m_width(0), m_height(0), m_aspectRatio(AUTO)
+{
+ m_play = NULL;
+
+ gst_object_ref( GST_OBJECT (_element) );
+ m_element = _element;
+
+ setPaletteBackgroundColor(QColor(0,0,0)); //black
+ setUpdatesEnabled(false);
+
+ connect( &m_mouseHideTimer, SIGNAL(timeout()), this, SLOT(slotHideMouse()) );
+}
+
+
+
+void VideoWindow::setPlaybin( GstElement *play )
+{
+ m_play = play;
+}
+
+
+
+VideoWindow::~VideoWindow()
+{
+ if ( m_element && GST_IS_X_OVERLAY(m_element) ) {
+ gst_x_overlay_set_xwindow_id( GST_X_OVERLAY(m_element), 0 );
+ }
+
+ gst_object_unref( GST_OBJECT(m_element) );
+ kdDebug() << "VideoWindow: destructed" << endl;
+}
+
+
+
+void VideoWindow::refresh()
+{
+ /* expose overlay */
+ if ( m_element && GST_IS_X_OVERLAY(m_element) ) {
+ gst_x_overlay_set_xwindow_id( GST_X_OVERLAY (m_element), winId() );
+ gst_x_overlay_expose( GST_X_OVERLAY (m_element) );
+ }
+}
+
+
+
+void VideoWindow::paintEvent(QPaintEvent */*event*/)
+{
+ refresh();
+}
+
+
+
+void VideoWindow::mousePressEvent(QMouseEvent* mev)
+{
+ if ( mev->button()==Qt::RightButton ) {
+ emit signalRightClick( mev->globalPos() );
+ mev->accept();
+ }
+ else {
+ mev->ignore();
+ }
+}
+
+
+
+void VideoWindow::newCapsset( const GstCaps *caps )
+{
+ const GstStructure *s;
+ m_width = 0;
+ m_height = 0;
+
+ s = gst_caps_get_structure(caps, 0);
+ if (s) {
+ const GValue *par;
+
+ gst_structure_get_int(s, "width", &m_width);
+ gst_structure_get_int(s, "height", &m_height);
+ if ( (par = gst_structure_get_value (s, "pixel-aspect-ratio")) ) {
+ int num = gst_value_get_fraction_numerator(par),
+ den = gst_value_get_fraction_denominator(par);
+
+ if (num > den)
+ m_width = (int) ((float) num * m_width / den);
+ else
+ m_height = (int) ((float) den * m_height / num);
+ }
+ }
+
+ QSize frame = getFrameSize();
+ correctByAspectRatio( frame );
+ emit signalNewFrameSize( frame );
+ //set correct geometry
+ setGeometry();
+}
+
+
+
+void VideoWindow::newState()
+{
+ if ( !m_play )
+ return;
+
+ const GList *list = NULL;
+
+ g_object_get( G_OBJECT(m_play), "stream-info", &list, NULL );
+ for ( ; list != NULL; list = list->next ) {
+ GObject *info = (GObject *)list->data;
+ gint type;
+ GParamSpec *pspec;
+ GEnumValue *val;
+ GstPad *pad = NULL;
+
+ if ( !info )
+ continue;
+
+ g_object_get( info, "type", &type, NULL );
+ pspec = g_object_class_find_property( G_OBJECT_GET_CLASS (info), "type" );
+ val = g_enum_get_value( G_PARAM_SPEC_ENUM(pspec)->enum_class, type );
+
+ if ( !g_strcasecmp(val->value_nick, "video") ) {
+ GstCaps *caps;
+ g_object_get( info, "object", &pad, NULL );
+ if ( (caps=gst_pad_get_negotiated_caps(pad)) ) {
+ newCapsset( caps );
+ gst_caps_unref (caps);
+ return;
+ }
+ }
+ }
+ m_width = 0;
+ m_height = 0;
+ QSize frame = getFrameSize();
+ correctByAspectRatio( frame );
+ emit signalNewFrameSize( frame );
+ //set correct geometry
+ setGeometry();
+}
+
+
+
+void VideoWindow::setGeometry( int, int, int, int )
+{
+ QSize frame = getFrameSize();
+ QSize window = parentWidget()->size();
+ int x = 0, y = 0, width = 0, height = 0;
+
+ if ( frame.width() == 0 || frame.height() == 0 ) {
+ QWidget::setGeometry(0, 0, window.width(), window.height());
+ return;
+ }
+
+ correctByAspectRatio( frame );
+
+ float frameAspect = (float)frame.width() / (float)frame.height();
+ float windowAspect = (float)window.width() / (float)window.height();
+
+ if ( frameAspect >= windowAspect ) {
+ width = window.width();
+ height = (int)((float)width / frameAspect);
+ y = (window.height() - height) / 2;
+ }
+ else {
+ height = window.height();
+ width = (int)((float)height * frameAspect);
+ x = (window.width() - width) / 2;
+ }
+
+ //kdDebug() << "VideoWindow::setGeometry: " << x << " : " << y << " : " << width << " : " << height << endl;
+ QWidget::setGeometry( x, y, width, height );
+}
+
+
+
+void VideoWindow::setGeometry()
+{
+ setGeometry(0, 0, 0, 0);
+}
+
+
+
+void VideoWindow::correctByAspectRatio( QSize& frame )
+{
+ float factor = 0;
+
+ switch ( m_aspectRatio ) {
+ case AUTO: return;
+ case FOURBYTHREE: factor = 4.0 / 3.0; break;
+ case ANAMORPHIC: factor = 16.0 / 9.0; break;
+ case DVB: factor = 2.11; break;
+ case SQUARE: factor = 1.0; break;
+ }
+
+ float frameAspect = (float)frame.width() / (float)frame.height();
+ factor = factor / frameAspect;
+ if ( factor > 1.0 )
+ frame.setWidth((int)((float)frame.width() * factor));
+ else
+ frame.setHeight((int)((float)frame.height() / factor));
+}
+
+
+
+void VideoWindow::slotAspectRatioAuto()
+{
+ m_aspectRatio = AUTO;
+ QSize frame = getFrameSize();
+ correctByAspectRatio( frame );
+ emit signalNewFrameSize( frame );
+ setGeometry();
+}
+
+
+
+void VideoWindow::slotAspectRatio4_3()
+{
+ m_aspectRatio = FOURBYTHREE;
+ QSize frame = getFrameSize();
+ correctByAspectRatio( frame );
+ emit signalNewFrameSize( frame );
+ setGeometry();
+}
+
+
+
+void VideoWindow::slotAspectRatioAnamorphic()
+{
+ m_aspectRatio = ANAMORPHIC;
+ QSize frame = getFrameSize();
+ correctByAspectRatio( frame );
+ emit signalNewFrameSize( frame );
+ setGeometry();
+}
+
+
+
+void VideoWindow::slotAspectRatioDVB()
+{
+ m_aspectRatio = DVB;
+ QSize frame = getFrameSize();
+ correctByAspectRatio( frame );
+ emit signalNewFrameSize( frame );
+ setGeometry();
+}
+
+
+
+void VideoWindow::slotAspectRatioSquare()
+{
+ m_aspectRatio = SQUARE;
+ QSize frame = getFrameSize();
+ correctByAspectRatio( frame );
+ emit signalNewFrameSize( frame );
+ setGeometry();
+}
+
+/******** mouse cursor hiding on fullscreen ****/
+
+void VideoWindow::startMouseHideTimer()
+{
+ m_mouseHideTimer.start( 5000 );
+ setMouseTracking( true );
+}
+
+
+
+void VideoWindow::stopMouseHideTimer()
+{
+ m_mouseHideTimer.stop();
+ setMouseTracking( false );
+ setCursor( QCursor(Qt::ArrowCursor) );
+}
+
+
+
+void VideoWindow::slotHideMouse()
+{
+ setCursor( QCursor(Qt::BlankCursor) );
+}
+
+
+
+void VideoWindow::mouseMoveEvent( QMouseEvent *mev )
+{
+ if ( cursor().shape() == Qt::BlankCursor )
+ setCursor( QCursor(Qt::ArrowCursor) );
+ mev->ignore();
+}
diff --git a/kaffeine/src/player-parts/gstreamer-part/video.h b/kaffeine/src/player-parts/gstreamer-part/video.h
new file mode 100644
index 0000000..5878066
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/video.h
@@ -0,0 +1,95 @@
+/*
+ * video.h
+ *
+ * Copyright (C) 2006 Christophe Thommeret <hftom@free.fr>
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * heavily based on kiss by Ronald Bultje <rbultje@ronald.bitfreak.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef VIDEO_H
+#define VIDEO_H
+
+#include <qwidget.h>
+#include <kapplication.h>
+
+#include <qsize.h>
+
+#include <gst/gst.h>
+
+
+
+class VideoWindow : public QWidget
+{
+ Q_OBJECT
+
+public:
+ VideoWindow( QWidget *parent, GstElement *element );
+ ~VideoWindow ();
+
+ enum AspectRatio {
+ AUTO,
+ FOURBYTHREE,
+ ANAMORPHIC,
+ DVB,
+ SQUARE
+ };
+
+ void newState();
+ void newCapsset( const GstCaps *caps );
+ void setPlaybin( GstElement *play );
+
+ void refresh();
+
+ QSize getFrameSize() { return QSize(m_width, m_height); }
+
+ void startMouseHideTimer();
+ void stopMouseHideTimer();
+
+signals:
+ void signalNewFrameSize( const QSize& );
+ void signalRightClick( const QPoint& );
+
+public slots:
+// void setGeometry(const QRect&);
+ void setGeometry();
+ void setGeometry( int x, int y, int width, int heigth );
+ void slotAspectRatioAuto();
+ void slotAspectRatio4_3();
+ void slotAspectRatioAnamorphic();
+ void slotAspectRatioDVB();
+ void slotAspectRatioSquare();
+
+private slots:
+ void slotHideMouse();
+
+protected:
+ void paintEvent( QPaintEvent *event );
+ void mousePressEvent( QMouseEvent* );
+ void mouseMoveEvent( QMouseEvent* );
+
+private:
+ void correctByAspectRatio( QSize &frame );
+
+private:
+ GstElement *m_element, *m_play;
+ int m_width, m_height;
+ AspectRatio m_aspectRatio;
+ QTimer m_mouseHideTimer;
+};
+
+#endif /* VIDEO_H */
diff --git a/kaffeine/src/player-parts/gstreamer-part/videosettings.cpp b/kaffeine/src/player-parts/gstreamer-part/videosettings.cpp
new file mode 100644
index 0000000..2e59359
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/videosettings.cpp
@@ -0,0 +1,95 @@
+/*
+ * videosettings.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <klocale.h>
+
+#include <qslider.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qnamespace.h>
+
+#include "videosettings.h"
+#include "videosettings.moc"
+
+
+VideoSettings::VideoSettings(int hue, int sat, int contr, int bright, QWidget *parent, const char *name)
+ : KDialogBase(KDialogBase::Plain, i18n("Video Settings"), KDialogBase::Default | KDialogBase::Close, KDialogBase::Close, parent, name, false)
+{
+ setInitialSize(QSize(450,200), true);
+ QWidget* page = plainPage();
+
+ QGridLayout* grid = new QGridLayout(page, 4, 2);
+ grid->setSpacing(5);
+
+ QLabel* hueText = new QLabel(i18n("Hue"), page);
+ hueText->setAlignment(AlignRight);
+ m_hueSlider = new QSlider(Qt::Horizontal, page);
+ m_hueSlider->setRange(-1000, 1000);
+ m_hueSlider->setSteps(10, 100);
+ m_hueSlider->setValue(hue);
+ connect(m_hueSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewHue(int)));
+ grid->addWidget(hueText, 0, 0);
+ grid->addWidget(m_hueSlider, 0, 1);
+
+ QLabel* satText = new QLabel(i18n("Saturation"), page);
+ satText->setAlignment(AlignRight);
+ m_satSlider = new QSlider(Qt::Horizontal, page);
+ m_satSlider->setRange(-1000, 1000);
+ m_satSlider->setSteps(10, 100);
+ m_satSlider->setValue(sat);
+ connect(m_satSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewSaturation(int)));
+ grid->addWidget(satText, 1, 0);
+ grid->addWidget(m_satSlider, 1, 1);
+
+ QLabel* contrastText = new QLabel(i18n("Contrast"), page);
+ contrastText->setAlignment(AlignRight);
+ m_contrastSlider = new QSlider(Qt::Horizontal, page);
+ m_contrastSlider->setRange(-1000, 1000);
+ m_contrastSlider->setSteps(10, 100);
+ m_contrastSlider->setValue(contr);
+ connect(m_contrastSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewContrast(int)));
+ grid->addWidget(contrastText, 2, 0);
+ grid->addWidget(m_contrastSlider, 2, 1);
+
+ QLabel* brightText = new QLabel(i18n("Brightness"), page);
+ brightText->setAlignment(AlignRight);
+ m_brightSlider = new QSlider(Qt::Horizontal, page);
+ m_brightSlider->setRange(-1000, 1000);
+ m_brightSlider->setSteps(10, 100);
+ m_brightSlider->setValue(bright);
+ connect(m_brightSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewBrightness(int)));
+ grid->addWidget(brightText, 3, 0);
+ grid->addWidget(m_brightSlider, 3, 1);
+
+ connect(this, SIGNAL(defaultClicked()), this, SLOT(slotSetDefaultValues()));
+}
+
+VideoSettings::~VideoSettings()
+{
+
+}
+
+void VideoSettings::slotSetDefaultValues()
+{
+ m_hueSlider->setValue(1000);
+ m_satSlider->setValue(0);
+ m_contrastSlider->setValue(0);
+ m_brightSlider->setValue(0);
+}
diff --git a/kaffeine/src/player-parts/gstreamer-part/videosettings.h b/kaffeine/src/player-parts/gstreamer-part/videosettings.h
new file mode 100644
index 0000000..62be08e
--- /dev/null
+++ b/kaffeine/src/player-parts/gstreamer-part/videosettings.h
@@ -0,0 +1,58 @@
+/*
+ * videosettings.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef VIDEOSETTINGS_H
+#define VIDEOSETTINGS_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kdialogbase.h>
+
+class QSlider;
+
+class VideoSettings : public KDialogBase
+{
+
+ Q_OBJECT
+
+public:
+ VideoSettings(int hue, int sat, int contr, int bright, QWidget *parent=0, const char *name=0);
+ ~VideoSettings();
+
+signals:
+ void signalNewHue(int);
+ void signalNewSaturation(int);
+ void signalNewContrast(int);
+ void signalNewBrightness(int);
+
+private slots:
+
+ void slotSetDefaultValues();
+
+private:
+ QSlider* m_hueSlider;
+ QSlider* m_satSlider;
+ QSlider* m_contrastSlider;
+ QSlider* m_brightSlider;
+};
+
+#endif /* VIDEOSETTINGS_H */
diff --git a/kaffeine/src/player-parts/kaffeine-part/Makefile.am b/kaffeine/src/player-parts/kaffeine-part/Makefile.am
new file mode 100644
index 0000000..7202c10
--- /dev/null
+++ b/kaffeine/src/player-parts/kaffeine-part/Makefile.am
@@ -0,0 +1,12 @@
+lib_LTLIBRARIES = libkaffeinepart.la
+
+INCLUDES = $(all_includes)
+
+kaffeineincludedir = $(includedir)/kaffeine
+kaffeineinclude_HEADERS = kaffeinepart.h mrl.h
+
+METASOURCES = AUTO
+
+libkaffeinepart_la_SOURCES = kaffeinepart.cpp mrl.cpp playlistimport.cpp
+libkaffeinepart_la_LIBADD = $(LIB_KPARTS) $(all_libraries)
+libkaffeinepart_la_LDFLAGS = -no-undefined -avoid-version
diff --git a/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.cpp b/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.cpp
new file mode 100644
index 0000000..4be8b73
--- /dev/null
+++ b/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.cpp
@@ -0,0 +1,58 @@
+/*
+ * kaffeinepart.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "kaffeinepart.h"
+#include <kapplication.h>
+#include <kservice.h>
+#include <ktrader.h>
+#include <kmessagebox.h>
+#include <krun.h>
+#include <klocale.h>
+
+#include "kaffeinepart.moc"
+
+KaffeinePart::KaffeinePart(QObject* parent, const char* name)
+ : KParts::ReadOnlyPart(parent, name)
+{
+}
+
+KaffeinePart::~KaffeinePart()
+{
+}
+
+bool KaffeinePart::installDistroCodec(QWidget* parent, const QString& engine, const QString& codec)
+{
+ QString query = QString("[X-KDE-Kaffeine-codec] == '%1' and \
+ [X-KDE-Kaffeine-engine] == '%2'").arg(codec).arg(engine);
+
+ KService::Ptr service = KTrader::self()->query( "Kaffeine/CodecInstall", query).first();
+
+ if (!service)
+ return false;
+
+ QString installScript = service->exec();
+
+ if (installScript.isNull())
+ return false;
+
+ KRun::runCommand(installScript);
+ return true;
+}
+
diff --git a/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.h b/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.h
new file mode 100644
index 0000000..e569ead
--- /dev/null
+++ b/kaffeine/src/player-parts/kaffeine-part/kaffeinepart.h
@@ -0,0 +1,222 @@
+/*
+ * kaffeinepart.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KAFFEINEPART_H
+#define KAFFEINEPART_H
+
+#include <kparts/part.h>
+
+#include "mrl.h"
+
+/*
+ * Base-Class for Kaffeine-Parts. Derive from this class if you want to develop a player part for Kaffeine.
+ * At least you have to reimplement openURL(const MRL&) and to emit signalTrackFinished()!
+ *
+ * IMPORTANT: Forward the double-click, middle-click and wheel mouse-events to the parent widget (don't use
+ * QMouseEvent::accept())!
+ *
+ * @author Jürgen Kofler
+ */
+
+class KDE_EXPORT KaffeinePart : public KParts::ReadOnlyPart
+{
+ Q_OBJECT
+public:
+ KaffeinePart(QObject* parent, const char* name);
+ virtual ~KaffeinePart();
+
+ /*
+ * Playback in progress?
+ */
+ virtual bool isPlaying()
+ {
+ return false;
+ }
+
+ /*
+ * Playback paused?
+ */
+ virtual bool isPaused()
+ {
+ return false;
+ }
+
+ /*
+ * Should look like "*.mp3 *.MP3 *.avi *.AVI", used as file filter for directory import
+ */
+ virtual QString supportedExtensions()
+ {
+ return QString::null;
+ }
+
+ /*
+ * Current volume. In percent.
+ */
+ virtual uint volume() const
+ {
+ return 0;
+ }
+ /*
+ * Current position. In percent.
+ */
+ virtual uint position() const
+ {
+ return 0;
+ }
+
+ /*
+ * DVD etc.
+ */
+ virtual bool hasChapters()
+ {
+ return false;
+ }
+
+ virtual void setDVDChapter(uint) {}
+
+ /*
+ * Contain the stream video?
+ */
+ virtual bool hasVideo()
+ {
+ return false;
+ }
+
+signals:
+ /*
+ * Frame size of video changed
+ */
+ void signalNewFrameSize(const QSize& frame);
+
+ /*
+ * New meta information available
+ */
+ void signalNewMeta(const MRL &mrl);
+
+ /*
+ * Playback of current track finished
+ */
+ void signalTrackFinished();
+
+ /*
+ * Playback failed
+ */
+ void signalPlaybackFailed();
+
+ /*
+ * User pressed play button but queue is empty
+ */
+ void signalRequestCurrentTrack();
+
+ /*
+ * User pressed next button but no track left in queue
+ */
+ void signalRequestNextTrack();
+
+ /*
+ * User pressed previous button but queue is empty
+ */
+ void signalRequestPreviousTrack();
+
+ void signalToggleMinimalMode();
+
+public slots:
+ /*
+ * You have to reimplement this! Opens an url and plays it.
+ */
+ virtual bool openURL(const MRL &mrl) = 0;
+
+ /*
+ * Tells the player we go fullscreen now. Hide controls etc.
+ */
+ virtual void slotPrepareForFullscreen(bool)
+ {}
+
+ /*
+ * DVD etc.
+ */
+ virtual void playNextChapter()
+ {}
+
+ /*
+ * DVD etc.
+ */
+ virtual void playPreviousChapter()
+ {}
+
+ /*
+ * Toggle play/pause
+ */
+ virtual void slotTogglePause(bool pauseLive = true)
+ {
+ pauseLive = true;
+ }
+
+ /*
+ * Stop playback
+ */
+ virtual void slotStop()
+ {}
+
+ /*
+ * Sets Volume. In percent.
+ */
+ virtual void slotSetVolume(uint)
+ {}
+
+ /*
+ * Sets Position. In percent.
+ */
+ virtual void slotSetPosition(uint)
+ {}
+
+ virtual void slotPosPlusSmall()
+ {}
+
+ virtual void slotPosMinusSmall()
+ {}
+
+ /*
+ * Turn mute on/off
+ */
+ virtual void slotMute()
+ {}
+
+ /*
+ * Execute distro-dependent actions to install codecs
+ */
+ static bool installDistroCodec(QWidget* parent, const QString& engine, const QString& codec);
+
+private:
+ /*
+ * Don't reimplement this, a player should be able to stream media
+ */
+ bool openFile()
+ {
+ return false;
+ }
+
+ bool openURL(const KURL &url)
+ {
+ return openURL(MRL(url));
+ }
+};
+
+#endif /* KAFFEINEPART_H */
diff --git a/kaffeine/src/player-parts/kaffeine-part/mrl.cpp b/kaffeine/src/player-parts/kaffeine-part/mrl.cpp
new file mode 100644
index 0000000..9ab6e52
--- /dev/null
+++ b/kaffeine/src/player-parts/kaffeine-part/mrl.cpp
@@ -0,0 +1,47 @@
+/*
+ * mrl.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "mrl.h"
+
+MRL::MRL()
+{
+ reset();
+}
+
+MRL::MRL(const KURL& url, const QString& title, const QTime& length, const QString& mime,
+ const QString& artist, const QString& album, const QString& track,
+ const QString& year, const QString& genre, const QString& comment,
+ const QStringList& subtitleFiles, const int currentSubtitle) :
+ m_url(url.prettyURL()), m_kurl(url), m_title(title), m_artist(artist), m_album(album), m_track(track), m_year(year), m_genre(genre), m_comment(comment),
+ m_mime(mime), m_length(length), m_subtitleFiles(subtitleFiles), m_currentSubtitle(currentSubtitle)
+{}
+
+MRL::MRL(const QString& url, const QString& title, const QTime& length, const QString& mime,
+ const QString& artist, const QString& album, const QString& track,
+ const QString& year, const QString& genre, const QString& comment,
+ const QStringList& subtitleFiles, const int currentSubtitle) :
+ m_url(url), m_kurl(KURL::fromPathOrURL(url)), m_title(title), m_artist(artist),
+ m_album(album), m_track(track), m_year(year), m_genre(genre), m_comment(comment),
+ m_mime(mime), m_length(length), m_subtitleFiles(subtitleFiles), m_currentSubtitle(currentSubtitle)
+{}
+
+MRL::~MRL()
+{
+}
diff --git a/kaffeine/src/player-parts/kaffeine-part/mrl.h b/kaffeine/src/player-parts/kaffeine-part/mrl.h
new file mode 100644
index 0000000..04c6d27
--- /dev/null
+++ b/kaffeine/src/player-parts/kaffeine-part/mrl.h
@@ -0,0 +1,96 @@
+/*
+ * mrl.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef MRL_H
+#define MRL_H
+
+#include <qdatetime.h>
+#include <qstringlist.h>
+
+#include <kurl.h>
+
+/*
+ * media resource locator
+ * holds url and meta info
+ */
+
+class KDE_EXPORT MRL
+{
+public:
+ MRL();
+ /* don't use this constructor to prevent encoding problems */
+ MRL(const KURL& url, const QString& title = QString::null, const QTime& length = QTime(), const QString& mime = QString::null,
+ const QString& artist = QString::null, const QString& album = QString::null, const QString& track = QString::null,
+ const QString& year = QString::null, const QString& genre = QString::null, const QString& comment = QString::null,
+ const QStringList& subtitleFiles = QStringList(), const int currentSubtitle = -1);
+ MRL(const QString& url, const QString& title = QString::null, const QTime& length = QTime(), const QString& mime = QString::null,
+ const QString& artist = QString::null, const QString& album = QString::null, const QString& track = QString::null,
+ const QString& year = QString::null, const QString& genre = QString::null, const QString& comment = QString::null,
+ const QStringList& subtitleFiles = QStringList(), const int currentSubtitle = -1);
+ virtual ~MRL();
+
+ void reset() { m_url = QString::null; m_kurl = KURL(); }
+ bool isEmpty() { return (m_url == QString::null); }
+
+ const QString& url() const { return m_url; }
+ const KURL& kurl() const { return m_kurl; }
+ const QString& title() const { return m_title; }
+ const QString& artist() const { return m_artist; }
+ const QString& album() const { return m_album; }
+ const QString& track() const { return m_track; }
+ const QString& year() const { return m_year; }
+ const QString& genre() const { return m_genre; }
+ const QString& comment() const { return m_comment; }
+ const QString& mime() const { return m_mime; }
+ const QTime& length() const { return m_length; }
+ const QStringList& subtitleFiles() const { return m_subtitleFiles; }
+ int currentSubtitle() const { return m_currentSubtitle; }
+
+ void setURL(const QString& url) { m_url = url; m_kurl = KURL(url); }
+ void setTitle(const QString& title) { m_title = title; }
+ void setArtist(const QString& artist) { m_artist = artist; }
+ void setAlbum(const QString& album) { m_album = album; }
+ void setTrack(const QString& track) { m_track = track; }
+ void setYear(const QString& year) { m_year = year; }
+ void setGenre(const QString& genre) { m_genre = genre; }
+ void setComment(const QString& comment) { m_comment = comment; }
+ void setMime(const QString& mime) { m_mime = mime; }
+ void setLength(const QTime& length) { m_length = length; }
+ void setSubtitleFiles(const QStringList& urls) { m_subtitleFiles = urls; }
+ void addSubtitleFile(const QString& url) { m_subtitleFiles.append(url); }
+ void setCurrentSubtitle(int sub) { m_currentSubtitle = sub; }
+
+private:
+ QString m_url;
+ KURL m_kurl;
+ QString m_title;
+ QString m_artist;
+ QString m_album;
+ QString m_track;
+ QString m_year;
+ QString m_genre;
+ QString m_comment;
+ QString m_mime;
+ QTime m_length;
+ QStringList m_subtitleFiles;
+ int m_currentSubtitle; /* -1 -> off */
+};
+
+#endif /* MRL_H */
diff --git a/kaffeine/src/player-parts/kaffeine-part/playlistimport.cpp b/kaffeine/src/player-parts/kaffeine-part/playlistimport.cpp
new file mode 100644
index 0000000..13b5d63
--- /dev/null
+++ b/kaffeine/src/player-parts/kaffeine-part/playlistimport.cpp
@@ -0,0 +1,685 @@
+/*
+ * playlistimport.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qdom.h>
+#include <qregexp.h>
+#include <qxml.h>
+
+#include <kdebug.h>
+#include <kio/netaccess.h>
+
+#include "playlistimport.h"
+
+class MyXMLParser : public QXmlDefaultHandler
+{
+
+public:
+ QValueList<MRL> mrls;
+ bool isKaffeinePlaylist;
+
+
+ MyXMLParser() : isKaffeinePlaylist(false)
+ {}
+
+ bool startElement(const QString&, const QString&,
+ const QString &qname, const QXmlAttributes &att)
+ {
+
+ if (qname == "playlist")
+ if (att.value("client") == "kaffeine")
+ {
+ isKaffeinePlaylist = true;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+
+ if (qname != "entry") return true;
+
+ QStringList subs = QStringList();
+ int currentSub = -1;
+
+ if ((!att.value("subs").isNull()) && (!att.value("subs").isEmpty()))
+ subs = QStringList::split("&",att.value("subs"),false);
+ if ((!att.value("subs").isNull()) && (!att.value("subs").isEmpty()))
+ {
+ bool ok;
+ currentSub = att.value("currentSub").toInt(&ok);
+ if (!ok)
+ currentSub = -1;
+ }
+
+ // kdDebug() << "PlaylistImport: kaffeine import url: " << att.value("url") << endl;
+ mrls.append(MRL(att.value("url"), att.value("title"), PlaylistImport::stringToTime(att.value("length")),
+ att.value("mime"), att.value("artist"), att.value("album"), att.value("track"),
+ att.value("year"), att.value("genre"), QString::null, subs, currentSub));
+ return true;
+ }
+
+};
+
+bool PlaylistImport::kaffeine(const QString& playlist, QValueList<MRL>& mrls)
+{
+ kdDebug() << "PlaylistImport: kaffeine: " << playlist << endl;
+ QFile file(playlist);
+ if (!file.open(IO_ReadOnly)) return false;
+
+ QXmlInputSource source(&file);
+ QXmlSimpleReader reader;
+
+ MyXMLParser parser;
+ reader.setContentHandler(&parser);
+ reader.parse(source);
+ file.close();
+
+ if (!parser.isKaffeinePlaylist)
+ {
+ return false;
+ }
+ else
+ {
+ QValueList<MRL>::ConstIterator end(parser.mrls.end());
+ for (QValueList<MRL>::ConstIterator it = parser.mrls.begin(); it != end; ++it)
+ mrls.append(*it);
+ return true;
+ }
+}
+
+class NoatunXMLParser : public QXmlDefaultHandler
+{
+
+public:
+ QValueList<MRL> mrls;
+ bool isNoatunPlaylist;
+
+ NoatunXMLParser(): isNoatunPlaylist(false)
+ {}
+
+ bool startElement(const QString&, const QString &,
+ const QString &qname, const QXmlAttributes &att)
+ {
+
+ if (qname == "playlist")
+ if (att.value("client") == "noatun")
+ {
+ isNoatunPlaylist = true;
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+
+ if (qname != "item") return true;
+
+ QString title = att.value("title");
+
+ if (title.isNull())
+ title = att.value("url");
+
+ bool ok;
+ QTime length;
+ int time = att.value("length").toInt(&ok);
+ if ((ok) && (time > 0))
+ {
+ length = QTime().addMSecs(time);
+ }
+
+ kdDebug() << "PlaylistImport: noatun import url: " << att.value("url") << endl;
+ mrls.append(MRL(att.value("url"), title, length, QString::null, att.value("author"),
+ att.value("album"), att.value("track")));
+
+ return true;
+ }
+
+};
+
+bool PlaylistImport::noatun(const QString& playlist, QValueList<MRL>& mrls)
+{
+ kdDebug() << "PlaylistImport: noatun: " << playlist << endl;
+ QFile file(playlist);
+ if (!file.open(IO_ReadOnly)) return false;
+
+ QXmlInputSource source(&file);
+ QXmlSimpleReader reader;
+
+ NoatunXMLParser parser;
+ reader.setContentHandler(&parser);
+ reader.parse(source);
+ file.close();
+
+ if (!parser.isNoatunPlaylist)
+ {
+ return false;
+ }
+ else
+ {
+ QValueList<MRL>::ConstIterator end(parser.mrls.end());
+ for (QValueList<MRL>::ConstIterator it = parser.mrls.begin(); it != end; ++it)
+ mrls.append(*it);
+ return true;
+ }
+}
+
+bool PlaylistImport::m3u(const QString& playlist , QValueList<MRL>& mrls)
+{
+ kdDebug() << "PlaylistImport: m3u: " << playlist << endl;
+ QFile file(playlist);
+ if (!file.open(IO_ReadOnly)) return false;
+ QTextStream stream(&file);
+
+ // if (stream.readLine().upper() != "#EXTM3U") return false;
+ QString url;
+ int time;
+ bool ok;
+ QTime length;
+ QString title;
+ KURL kUrl;
+ bool foundAnyUrl = false;
+ KURL plurl(playlist);
+ plurl.setFileName ("");
+
+ while (!stream.eof())
+ {
+ url = stream.readLine();
+ time = 0;
+ title = QString::null;
+ length = QTime();
+ if (url.left(1) == "#")
+ {
+ if (url.left(7).upper() == "#EXTINF")
+ {
+ url = url.remove(0,8);
+ time = url.section(",", 0,0).toInt(&ok);
+ if ((ok) && (time > 0))
+ {
+ length = QTime().addSecs(time);
+ }
+
+ title = url.section(",",1,1);
+ url = stream.readLine();
+ }
+ else
+ {
+ continue;
+ }
+ }
+ url.replace ('\\', '/'); /* for windows styled urls */
+ kUrl = KURL (plurl, url); /* maybe a relative url */
+ if (kUrl.isValid())
+ {
+ kdDebug() << "PlaylistImport: m3u import url: " << kUrl.prettyURL() << endl;
+
+ MRL mrl;
+ if (kUrl.isLocalFile())
+ mrl.setURL(kUrl.path());
+ else
+ mrl.setURL(kUrl.prettyURL());
+ if (title.isNull())
+ title = kUrl.fileName();
+ mrl.setTitle(title);
+ mrl.setLength(length);
+
+ mrls.append(mrl);
+
+ foundAnyUrl = true;
+ }
+ else
+ kdDebug() << "PlaylistImport: M3U: Not valid: " << kUrl.prettyURL() << endl;
+ }
+ file.close();
+ if (foundAnyUrl)
+ return true;
+ else
+ return false;
+}
+
+bool PlaylistImport::pls(const QString& playlist, QValueList<MRL>& mrls)
+{
+ kdDebug() << "PlaylistImport: pls: " << playlist << endl;
+ QFile file(playlist);
+ if (!file.open(IO_ReadOnly)) return false;
+
+ QTextStream stream(&file);
+
+ //if (stream.readLine().upper() != "[PLAYLIST]") return false;
+
+ // Better Handling of pls playlists - Taken from amaroK - amarok.kde.org
+ // Counted number of "File#=" lines.
+ uint entryCnt = 0;
+ // Value of the "NumberOfEntries=#" line.
+ uint numberOfEntries = 0;
+ bool havePlaylistSection = false;
+ QString tmp;
+ QStringList lines;
+
+ // set Regexp keywords, Be case insensitive
+ const QRegExp regExp_NumberOfEntries("^NumberOfEntries\\s*=\\s*\\d+$", false);
+ const QRegExp regExp_File("^File\\d+\\s*=", false);
+ const QRegExp regExp_Title("^Title\\d+\\s*=", false);
+ const QRegExp regExp_Length("^Length\\d+\\s*=\\s*-?\\d+$", false);
+ const QRegExp regExp_Version("^Version\\s*=\\s*\\d+$", false);
+ const QString section_playlist("[playlist]");
+
+ /* Preprocess the input data.
+ * Read the lines into a buffer; Cleanup the line strings;
+ * Count the entries manually and read "NumberOfEntries".
+ */
+ while (!stream.atEnd()) {
+ tmp = stream.readLine();
+ tmp = tmp.stripWhiteSpace();
+ if (tmp.isEmpty())
+ continue;
+ lines.append(tmp);
+
+ if (tmp == section_playlist) {
+ havePlaylistSection = true;
+ continue;
+ }
+
+ if (tmp.contains(regExp_File)) {
+ entryCnt++;
+ continue;
+ }
+
+ if (tmp.contains(regExp_NumberOfEntries)) {
+ numberOfEntries = tmp.section('=', -1).stripWhiteSpace().toUInt();
+ continue;
+ }
+ }
+
+ file.close();
+
+ if (numberOfEntries != entryCnt) {
+ kdError() << "PlaylistImport: Invalid \"NumberOfEntries\" value in .pls playlist. "
+ << "NumberOfEntries=" << numberOfEntries << " counted="
+ << entryCnt << endl;
+ /* Corrupt file. The "NumberOfEntries" value is
+ * not correct. Fix it by setting it to the manually
+ * counted number and go on parsing.
+ */
+ numberOfEntries = entryCnt;
+ }
+ // If we have no Entries, return
+ if (!numberOfEntries)
+ return true;
+
+ int time;
+ bool ok;
+ uint index;
+ bool inPlaylistSection = false;
+ QString* titles = new QString[entryCnt];
+ QString* files = new QString[entryCnt];
+ QTime* length = new QTime[entryCnt];
+
+ QStringList::const_iterator i = lines.begin(), end = lines.end();
+ for ( ; i != end; ++i) {
+ if (!inPlaylistSection && havePlaylistSection) {
+ /* The playlist begins with the "[playlist]" tag.
+ * Skip everything before this.
+ */
+ if ((*i) == section_playlist)
+ inPlaylistSection = true;
+ continue;
+ }
+ if ((*i).contains(regExp_File)) {
+ // Have a "File#=XYZ" line.
+ index = extractIndex(*i);
+ if (index > numberOfEntries || index == 0)
+ continue;
+ files[index-1] = (*i).section('=', 1).stripWhiteSpace();
+ continue;
+ }
+ if ((*i).contains(regExp_Title)) {
+ // Have a "Title#=XYZ" line.
+ index = extractIndex(*i);
+ if (index > numberOfEntries || index == 0)
+ continue;
+ titles[index-1] = (*i).section('=', 1).stripWhiteSpace();
+ continue;
+ }
+ if ((*i).contains(regExp_Length)) {
+ // Have a "Length#=XYZ" line.
+ index = extractIndex(*i);
+ if (index > numberOfEntries || index == 0)
+ continue;
+ tmp = (*i).section('=', 1).stripWhiteSpace();
+ time = tmp.toInt(&ok);
+ if ( !(ok) || !(time > 0) ) continue;
+ length[index-1] = QTime().addSecs(time);
+ continue;
+ }
+ if ((*i).contains(regExp_NumberOfEntries)) {
+ // Have the "NumberOfEntries=#" line.
+ continue;
+ }
+ if ((*i).contains(regExp_Version)) {
+ // Have the "Version=#" line.
+ tmp = (*i).section('=', 1).stripWhiteSpace();
+ // We only support Version=2
+ if (tmp.toUInt(&ok) != 2)
+ kdWarning() << "PlaylistImport: pls: Unsupported version." << endl;
+ continue;
+ }
+ kdWarning() << "PlaylistImport: pls: Unrecognized line: \"" << *i << "\"" << endl;
+ }
+
+ for (uint i=0; i<entryCnt; i++)
+ {
+ if (files[i].isNull()) continue;
+ kdDebug() << "PlaylistImport: pls import url: " << files[i] << endl;
+ if (titles[i].isNull())
+ titles[i] = files[i];
+ mrls.append(MRL(files[i], titles[i], length[i]));
+ }
+
+ delete [] titles;
+ delete [] files;
+ delete [] length;
+
+ return true;
+}
+
+// Helper for pls import
+uint PlaylistImport::extractIndex( const QString &str )
+{
+ /* Extract the index number out of a .pls line.
+ * Example:
+ * extractIndex("File2=foobar") == 2
+ */
+ bool ok = false;
+ unsigned int ret;
+ QString tmp(str.section('=', 0, 0));
+ tmp.remove(QRegExp("^\\D*"));
+ ret = tmp.stripWhiteSpace().toUInt(&ok);
+ if (!ok)
+ kdError() << "PlaylistImport: pls: Corrupt pls file, Error extracting index." << endl;
+ return ret;
+}
+
+bool PlaylistImport::ram(const MRL& playlist, QValueList<MRL>& mrls, QWidget* parent)
+{
+ Q_ULONG result;
+ char buf[10];
+
+ kdDebug() << "PlaylistImport: ram: " << playlist.url() << endl;
+ memset( buf, 0, 10 );
+
+ if (playlist.kurl().isLocalFile()) {
+ QFile file(playlist.kurl().path());
+ if (!file.open(IO_ReadOnly)) {
+ kdError() << "PlaylistImport: Can't open " << playlist.url() << endl;
+ return false;
+ }
+ result = file.readBlock(buf, 4);
+ file.close();
+ if (result != 4) {
+ kdError() << "PlaylistImport: Can't read " << playlist.url() << endl;
+ return false;
+ }
+ if (buf[0]=='.' && buf[1]=='R' && buf[2]=='M' && buf[3]=='F') {
+ kdDebug() << "PlaylistImport: Seems to be a real media file" << endl;
+ return false;
+ }
+ }
+ else if (!playlist.kurl().protocol().startsWith("http")) {
+ kdError() << "PlaylistImport: ram: Download via " << playlist.kurl().protocol() << " protocol not supported." << endl;
+ return false;
+ }
+
+ kdDebug() << "PlaylistImport: Seems to be a ram playlist!" << endl;
+
+ QString localFile, url;
+ if (KIO::NetAccess::mimetype(playlist.kurl(), parent) == "application/vnd.rn-realmedia") {
+ kdDebug() << "PlaylistImport: Seems to be a real media file" << endl;
+ return false;
+ }
+
+ if (KIO::NetAccess::download(playlist.kurl(), localFile, parent))
+ {
+ QFile plFile(localFile);
+ if (!plFile.open(IO_ReadOnly)) return false;
+ QTextStream stream( &plFile );
+
+ while (!stream.eof())
+ {
+ url = stream.readLine();
+
+ if (url[0] == '#') continue; /* ignore comments */
+ if (url == "--stop--") break; /* stop line */
+
+ if ((url.left(7) == "rtsp://") || (url.left(6) == "pnm://") || (url.left(7) == "http://"))
+ {
+ kdDebug() << "PlaylistImport: ram import url: " << url << endl;
+ mrls.append(MRL(url, url));
+ }
+ }
+ }
+ else {
+ kdError() << "PlaylistImport: " << KIO::NetAccess::lastErrorString() << endl;
+ return false;
+ }
+
+ return true;
+}
+
+/**********************************************************************************
+ * load asx playlist *
+ * spec: http://msdn.microsoft.com/library/en-us/wmplay/mmp_sdk/asxelement.asp *
+ **********************************************************************************/
+
+bool PlaylistImport::asx(const QString& playlist, QValueList<MRL>& mrls)
+{
+ kdDebug() << "PlaylistImport: asx: " << playlist << endl;
+ QFile file(playlist);
+ if (!file.open(IO_ReadOnly)) return false;
+
+ QDomDocument doc;
+ QString errorMsg;
+ int errorLine, errorColumn;
+ if (!doc.setContent(&file, &errorMsg, &errorLine, &errorColumn))
+ {
+ kdError() << "PlaylistImport: XML parse error: " << errorMsg
+ << " (line: " << errorLine << ", column: " << errorColumn << ")" << endl;
+ return false;
+ }
+
+ QDomElement root = doc.documentElement();
+
+ QString url;
+ QString title;
+ QString author;
+ QTime length;
+ QString duration;
+
+ if (root.nodeName().lower() != "asx") return false;
+
+ QDomNode node = root.firstChild();
+ QDomNode subNode;
+ QDomElement element;
+
+ while (!node.isNull())
+ {
+ url = QString::null;
+ title = QString::null;
+ author = QString::null;
+ length = QTime();
+ if (node.nodeName().lower() == "entry")
+ {
+ subNode = node.firstChild();
+ while (!subNode.isNull())
+ {
+ if ((subNode.nodeName().lower() == "ref") && (subNode.isElement()) && (url.isNull()))
+ {
+ element = subNode.toElement();
+ if (element.hasAttribute("href"))
+ url = element.attribute("href");
+ if (element.hasAttribute("HREF"))
+ url = element.attribute("HREF");
+ if (element.hasAttribute("Href"))
+ url = element.attribute("Href");
+ if (element.hasAttribute("HRef"))
+ url = element.attribute("HRef");
+
+ }
+
+ if ((subNode.nodeName().lower() == "duration") && (subNode.isElement()))
+ {
+ duration = QString::null;
+ element = subNode.toElement();
+ if (element.hasAttribute("value"))
+ duration = element.attribute("value");
+ if (element.hasAttribute("Value"))
+ duration = element.attribute("Value");
+ if (element.hasAttribute("VALUE"))
+ duration = element.attribute("VALUE");
+
+ if (!duration.isNull())
+ length = PlaylistImport::stringToTime(duration);
+ }
+
+ if ((subNode.nodeName().lower() == "title") && (subNode.isElement()))
+ {
+ title = subNode.toElement().text();
+ }
+ if ((subNode.nodeName().lower() == "author") && (subNode.isElement()))
+ {
+ author = subNode.toElement().text();
+ }
+
+ /* possible nodes we ignore: ABSTRACT, BANNER, BASE, COPYRIGHT, ENDMARKER, MOREINFO, PARAM,
+ * PREVIEWDURATION, STARTMARKER, STARTTIME
+ */
+ subNode = subNode.nextSibling();
+ }
+
+ if (!url.isNull())
+ {
+ if (title.isNull())
+ title = url;
+ kdDebug() << "PlaylistImport: asx import url: " << url << endl;
+ mrls.append(MRL(url, title, length, QString::null, author));
+ }
+ }
+ node = node.nextSibling();
+ }
+
+ file.close();
+
+ return true;
+}
+
+/****************************************************************
+ * Full SMIL support seems to be impossible at the moment... *
+ * spec: http://www.w3.org/TR/REC-smil/ *
+ ****************************************************************/
+
+bool PlaylistImport::smil(const QString& playlist, const MRL& baseMRL, QValueList<MRL>& mrls)
+{
+ kdDebug() << "PlaylistImport: smil: " << playlist << endl;
+ QFile file(playlist);
+ if (!file.open(IO_ReadOnly)) return false;
+
+ QDomDocument doc;
+ doc.setContent(&file);
+ QDomElement root = doc.documentElement();
+
+ if (root.nodeName().lower() != "smil") return false;
+
+ bool anyURL = false;
+ KURL kurl;
+ QString url;
+ QDomNodeList nodeList;
+ QDomNode node;
+ QDomElement element;
+
+ //video sources...
+ nodeList = doc.elementsByTagName("video");
+ kdDebug() << "PlaylistImport: smil: " << nodeList.count() << " 'video' tags found" << endl;
+ for (uint i = 0; i < nodeList.count(); i++)
+ {
+ node = nodeList.item(i);
+ url = QString::null;
+ if ((node.nodeName().lower() == "video") && (node.isElement()))
+ {
+ element = node.toElement();
+ if (element.hasAttribute("src"))
+ url = element.attribute("src");
+ if (element.hasAttribute("Src"))
+ url = element.attribute("Src");
+ if (element.hasAttribute("SRC"))
+ url = element.attribute("SRC");
+ }
+ if (!url.isNull())
+ {
+ kurl = KURL(baseMRL.kurl(), url);
+ kdDebug() << "PlaylistImport: smil: found video source: " << kurl.url() << endl;
+ mrls.append(kurl);
+ anyURL = true;
+ }
+ }
+
+ //audio sources...
+ nodeList = doc.elementsByTagName("audio");
+ kdDebug() << "PlaylistImport: smil: " << nodeList.count() << " 'audio' tags found" << endl;
+ for (uint i = 0; i < nodeList.count(); i++)
+ {
+ node = nodeList.item(i);
+ url = QString::null;
+ if ((node.nodeName().lower() == "audio") && (node.isElement()))
+ {
+ element = node.toElement();
+ if (element.hasAttribute("src"))
+ url = element.attribute("src");
+ if (element.hasAttribute("Src"))
+ url = element.attribute("Src");
+ if (element.hasAttribute("SRC"))
+ url = element.attribute("SRC");
+ }
+ if (!url.isNull())
+ {
+ kurl = KURL(baseMRL.kurl(), url);
+ kdDebug() << "PlaylistImport: smil: found audio source: " << kurl.url() << endl;
+ mrls.append(kurl);
+ anyURL = true;
+ }
+ }
+
+ file.close();
+ return anyURL;
+}
+
+QTime PlaylistImport::stringToTime(const QString& timeString)
+{
+ int sec = 0;
+ bool ok = false;
+ QStringList tokens = QStringList::split(':',timeString);
+
+ sec += tokens[0].toInt(&ok)*3600; //hours
+ sec += tokens[1].toInt(&ok)*60; //minutes
+ sec += tokens[2].toInt(&ok); //secs
+
+ if (ok)
+ return QTime().addSecs(sec);
+ else
+ return QTime();
+}
diff --git a/kaffeine/src/player-parts/kaffeine-part/playlistimport.h b/kaffeine/src/player-parts/kaffeine-part/playlistimport.h
new file mode 100644
index 0000000..16420eb
--- /dev/null
+++ b/kaffeine/src/player-parts/kaffeine-part/playlistimport.h
@@ -0,0 +1,50 @@
+/*
+ * playlistimport.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef PLAYLISTIMPORT_H
+#define PLAYLISTIMPORT_H
+
+#include "mrl.h"
+
+class QWidget;
+
+/*
+ * static methods for playlist import
+ */
+
+class KDE_EXPORT PlaylistImport
+{
+public:
+
+ static bool kaffeine(const QString&, QValueList<MRL>&);
+ static bool noatun(const QString&, QValueList<MRL>&);
+ static bool m3u(const QString&, QValueList<MRL>&);
+ static bool pls(const QString&, QValueList<MRL>&);
+ static bool ram(const MRL&, QValueList<MRL>&, QWidget*);
+ static bool asx(const QString&, QValueList<MRL>&);
+ static bool smil(const QString&, const MRL&, QValueList<MRL>&);
+ /* helper */
+ static QTime stringToTime(const QString&);
+
+private:
+ static uint extractIndex(const QString&);
+};
+
+#endif /* PLAYLISTIMPORT_H */
diff --git a/kaffeine/src/player-parts/xine-part/Makefile.am b/kaffeine/src/player-parts/xine-part/Makefile.am
new file mode 100644
index 0000000..0325e1d
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/Makefile.am
@@ -0,0 +1,26 @@
+kde_module_LTLIBRARIES = libxinepart.la
+
+INCLUDES = -I$(top_srcdir)/kaffeine/src/ -I$(top_srcdir)/kaffeine/src/player-parts/kaffeine-part $(all_includes) $(CFLAGS_XINERAMA) $(CFLAGS_XINE) $(CFLAGS_XCB)
+
+METASOURCES = AUTO
+
+kaffeineincludedir = $(includedir)/kaffeine
+kaffeineinclude_HEADERS = xine_part.h xine_part_iface.h
+
+noinst_HEADERS = xine_part_iface.h kxinewidget.h postfilter.h deinterlacequality.h videosettings.h \
+ filterdialog.h screenshotpreview.h xineconfig.h positionslider.h equalizer.h
+
+libxinepart_la_SOURCES = xine_part.cpp kxinewidget.cpp postfilter.cpp deinterlacequality.cpp \
+ videosettings.cpp filterdialog.cpp screenshotpreview.cpp xineconfig.cpp positionslider.cpp \
+ equalizer.cpp xine_part_iface.skel
+libxinepart_la_LIBADD = $(LIB_XINERAMA) $(LIB_XINE) $(LIB_XCB) ../kaffeine-part/libkaffeinepart.la
+libxinepart_la_LDFLAGS = -module $(KDE_PLUGIN) $(all_libraries) -avoid-version -no-undefined
+
+
+# this is where the desktop file will go
+partdesktopdir = $(kde_servicesdir)
+partdesktop_DATA = xine_part.desktop
+
+# this is where the part's XML-GUI resource file goes
+partrcdir = $(kde_datadir)/kaffeine
+partrc_DATA = xine_part.rc
diff --git a/kaffeine/src/player-parts/xine-part/README b/kaffeine/src/player-parts/xine-part/README
new file mode 100644
index 0000000..b97bb38
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/README
@@ -0,0 +1,81 @@
+********************
+* XINE-PART *
+********************
+
+The xine-based default player-part of Kaffeine.
+
+
+*** IMPORTANT ***
+The following example is outdated and unlikely to work.
+*** IMPORTANT ***
+
+
+You can use this part in your Application like this:
+----------------------------------------------------
+
+*** myplayer.h: ***
+
+#include <kmainwindow.h>
+
+class KaffeinePart;
+
+class MyPlayer : public MainWindow
+{
+ public:
+ MyPlayer();
+ ~MyPlayer();
+
+ void loadURL(const QString&);
+
+ //...
+ private:
+ KaffeinePart* m_player;
+};
+
+*** myplayer.cpp: ***
+
+#include <kaffeine/xine_part.h>
+
+MyPlayer::MyPlayer() : KMainWindow(0)
+{
+ initMyActions();
+ createGUI();
+
+ //...
+
+ m_player = new XinePart(this, "my_player", this, 0, QStringList());
+ guiFactory()->addClient(m_player);
+ setCentralWidget(m_player->widget());
+
+ //..
+}
+
+void MyPlayer::loadURL(const QString& url)
+{
+ m_player->openURL(url);
+}
+
+*** Makefile.am ***
+
+bin_PROGRAMS = myplayer
+
+INCLUDES = $(all_includes)
+
+noinst_HEADERS = myplayer.h
+
+METASOURCES = AUTO
+
+myplayer_SOURCES = myplayer.cpp
+myplayer_LDFLAGS = $(KDE_RPATH) $(all_libraries)
+myplayer_LDADD = $(LIB_KPARTS) -lxinepart
+
+
+*******************
+
+Thats it. If you need to implement your own UI, check kxinewidget.h
+
+
+
+
+
+
diff --git a/kaffeine/src/player-parts/xine-part/deinterlacequality.cpp b/kaffeine/src/player-parts/xine-part/deinterlacequality.cpp
new file mode 100644
index 0000000..70ca01d
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/deinterlacequality.cpp
@@ -0,0 +1,137 @@
+/*
+ * deinterlacequality.cpp - dialog for selecting the quality of deinterlacing
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <kdebug.h>
+#include <klocale.h>
+#include <kpushbutton.h>
+
+#include <qcheckbox.h>
+#include <qslider.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qlabel.h>
+#include <qlayout.h>
+
+#include "deinterlacequality.h"
+#include "deinterlacequality.moc"
+
+
+DeinterlaceQuality::DeinterlaceQuality(QWidget* filterDialog, QWidget *parent, const char *name)
+:KDialogBase(parent, name, true, i18n("Deinterlace Quality"), KDialogBase::Close)
+{
+ m_configStrings << "tvtime:method=Greedy2Frame,enabled=1,pulldown=vektor,framerate_mode=full,judder_correction=1,use_progressive_frame_flag=1,chroma_filter=1,cheap_mode=0";
+ m_configStrings << "tvtime:method=Greedy2Frame,enabled=1,pulldown=vektor,framerate_mode=full,judder_correction=0,use_progressive_frame_flag=1,chroma_filter=0,cheap_mode=0";
+ m_configStrings << "tvtime:method=Greedy,enabled=1,pulldown=none,framerate_mode=half_top,judder_correction=0,use_progressive_frame_flag=1,chroma_filter=0,cheap_mode=0";
+ m_configStrings << "tvtime:method=Greedy,enabled=1,pulldown=none,framerate_mode=half_top,judder_correction=0,use_progressive_frame_flag=1,chroma_filter=0,cheap_mode=1";
+ m_configStrings << "tvtime:method=LinearBlend,enabled=1,pulldown=none,framerate_mode=half_top,judder_correction=0,use_progressive_frame_flag=1,chroma_filter=0,cheap_mode=1";
+ m_configStrings << "tvtime:method=LineDoubler,enabled=1,pulldown=none,framerate_mode=half_top,judder_correction=0,use_progressive_frame_flag=1,chroma_filter=0,cheap_mode=1";
+
+ setInitialSize(QSize(680, 480));
+ QWidget* mainWidget = makeMainWidget();
+ QGridLayout* grid = new QGridLayout( mainWidget, 9, 2 );
+ grid->setSpacing(5);
+ grid->setMargin(5);
+
+ m_qualitySlider = new QSlider( QSlider::Vertical, mainWidget );
+ m_qualitySlider->setRange(0, 5);
+ m_qualitySlider->setSteps(1, 1);
+ m_qualitySlider->setTickmarks(QSlider::Right);
+ grid->addMultiCellWidget(m_qualitySlider, 0, 5, 0, 0);
+
+ QLabel* level0Descr = new QLabel(i18n("<b>Very low cpu usage, worst quality.</b><br>Half of vertical resolution is lost. For some systems (with PCI video cards) this might decrease the cpu usage when compared to plain video playback (no deinterlacing)."), mainWidget);
+ grid->addWidget(level0Descr, 5, 1);
+
+ QLabel* level1Descr = new QLabel(i18n("<b>Low cpu usage, poor quality.</b><br>Image is blurred vertically so interlacing effects are removed."), mainWidget);
+ grid->addWidget(level1Descr, 4, 1);
+
+ QLabel* level2Descr = new QLabel(i18n("<b>Medium cpu usage, medium quality.</b><br>Image is analysed and areas showing interlacing artifacts are fixed (interpolated)."), mainWidget);
+ grid->addWidget(level2Descr, 3, 1);
+
+ QLabel* level3Descr = new QLabel(i18n("<b>High cpu usage, good quality.</b><br>Conversion of dvd image format improves quality and fixes chroma upsampling bug."), mainWidget);
+ grid->addWidget(level3Descr, 2, 1);
+
+ QLabel* level4Descr = new QLabel(i18n("<b>Very high cpu usage, great quality.</b><br>Besides using smart deinterlacing algorithms it will also double the frame rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 pulldown. *"), mainWidget);
+ grid->addWidget(level4Descr, 1, 1);
+
+ QLabel* level5Descr = new QLabel(i18n("<b>Very very high cpu usage, great quality with (experimental) improvements.</b><br>Enables judder correction (play films at their original 24 fps speed) and vertical color smoothing (fixes small color stripes seen in some dvds). *"), mainWidget);
+ grid->addWidget(level5Descr, 0, 1);
+
+ m_customBox = new QCheckBox(i18n("User defined"), mainWidget);
+ grid->addMultiCellWidget(m_customBox, 6, 6, 0, 1);
+ connect(m_customBox, SIGNAL(toggled(bool)), this, SLOT(slotCustomBoxToggled(bool)));
+
+ m_customConfigButton = new KPushButton(i18n("Configure tvtime Deinterlace Plugin..."), mainWidget);
+ m_customConfigButton->setSizePolicy(QSizePolicy (QSizePolicy::Minimum, QSizePolicy::Fixed));
+ grid->addWidget(m_customConfigButton, 7, 1);
+ connect(m_customConfigButton, SIGNAL(clicked()), filterDialog, SLOT(show()));
+
+ QLabel* note = new QLabel(i18n("* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"), mainWidget);
+ note->setAlignment(QLabel::WordBreak | QLabel::AlignVCenter);
+ grid->addMultiCellWidget(note, 9, 9, 0, 1);
+}
+
+DeinterlaceQuality::~DeinterlaceQuality()
+{
+ kdDebug() << "DeinterlaceQuality: destructed" << endl;
+}
+
+void DeinterlaceQuality::slotLevelChanged( int level )
+{
+ // kdDebug() << "DeinterlaceQuality: Change to quality " << level << endl;
+ emit signalSetDeinterlaceConfig(m_configStrings[level]);
+}
+
+void DeinterlaceQuality::slotCustomBoxToggled(bool on)
+{
+ if (on)
+ {
+ m_customConfigButton->setEnabled(true);
+ m_qualitySlider->setEnabled(false);
+ }
+ else
+ {
+ m_customConfigButton->setEnabled(false);
+ m_qualitySlider->setEnabled(true);
+ }
+}
+
+void DeinterlaceQuality::setQuality(uint qu)
+{
+ if (qu < 10)
+ {
+ m_qualitySlider->setValue(qu);
+ m_customBox->setChecked(false);
+ slotCustomBoxToggled(false);
+ }
+ else
+ {
+ m_qualitySlider->setValue(qu-10);
+ m_customBox->setChecked(true);
+ }
+ connect(m_qualitySlider, SIGNAL(valueChanged(int)), this, SLOT(slotLevelChanged(int)));
+}
+
+uint DeinterlaceQuality::getQuality() const
+{
+ if (m_customBox->isChecked())
+ return m_qualitySlider->value()+10;
+ else
+ return m_qualitySlider->value();
+}
diff --git a/kaffeine/src/player-parts/xine-part/deinterlacequality.h b/kaffeine/src/player-parts/xine-part/deinterlacequality.h
new file mode 100644
index 0000000..5a91ad4
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/deinterlacequality.h
@@ -0,0 +1,78 @@
+/*
+ * deinterlacequality.h - dialog for selecting the quality of deinterlacing
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef DEINTERLACEQUALITY_H
+#define DEINTERLACEQUALITY_H
+
+#include <kdialogbase.h>
+
+/**
+ *@author Juergen Kofler
+ */
+
+class QCheckBox;
+class QSlider;
+class QString;
+class QStringList;
+class KPushButton;
+
+class DeinterlacerConfigDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ DeinterlacerConfigDialog(QWidget *parent=0, const char *name=0)
+ : KDialogBase( parent, name, true, i18n("Configure tvtime Deinterlace Plugin"), KDialogBase::Close )
+ {
+ setInitialSize(QSize(450,400), true);
+
+ mainWidget = makeVBoxMainWidget();
+ }
+
+ ~DeinterlacerConfigDialog() {}
+ QWidget* getMainWidget() const { return (QWidget*)mainWidget; }
+
+private:
+ QVBox* mainWidget;
+};
+
+class DeinterlaceQuality : public KDialogBase {
+ Q_OBJECT
+public:
+ DeinterlaceQuality(QWidget* filterDialog, QWidget *parent=0, const char *name=0);
+ ~DeinterlaceQuality();
+
+ void setQuality(uint);
+ uint getQuality() const;
+
+signals:
+ void signalSetDeinterlaceConfig(const QString&);
+
+private slots:
+ void slotLevelChanged(int);
+ void slotCustomBoxToggled(bool);
+
+private:
+ QStringList m_configStrings;
+ QSlider* m_qualitySlider;
+ QCheckBox* m_customBox;
+ KPushButton* m_customConfigButton;
+};
+
+#endif /* DEINTERLACEQUALITY_H */
diff --git a/kaffeine/src/player-parts/xine-part/equalizer.cpp b/kaffeine/src/player-parts/xine-part/equalizer.cpp
new file mode 100644
index 0000000..12e5f92
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/equalizer.cpp
@@ -0,0 +1,245 @@
+/*
+ * equalizer.cpp
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <qlayout.h>
+#include <qtooltip.h>
+#include <qlabel.h>
+
+#include "equalizer.h"
+#include "equalizer.moc"
+
+Equalizer::Equalizer(QWidget *parent, const char *name)
+ : KDialogBase(KDialogBase::Plain, i18n("Equalizer Settings"), KDialogBase::Default | KDialogBase::Close, KDialogBase::Close, parent, name, false)
+{
+ setInitialSize(QSize(450,250), true);
+ reparent(parent, pos(), false);
+ QWidget* page = plainPage();
+
+ QGridLayout* mainGrid = new QGridLayout( page, 3, 1 );
+
+ on = new QCheckBox( i18n("On"), page );
+ mainGrid->addWidget( on, 0, 0 );
+ connect(on, SIGNAL(toggled(bool)), this, SLOT(slotSetEnabled(bool)));
+
+ volumeGain = new QCheckBox( i18n("Volume gain"), page );
+ QToolTip::add(volumeGain, i18n("Volume Gain for Equalizer - If the sound becomes noisy disable this"));
+ mainGrid->addWidget( volumeGain, 1, 0 );
+ connect(volumeGain, SIGNAL(toggled(bool)), this, SIGNAL(signalSetVolumeGain(bool)));
+
+ equalGroup = new QGroupBox( QString::null, page );
+ mainGrid->addWidget( equalGroup, 2, 0 );
+
+ QGridLayout* equalGrid = new QGridLayout(equalGroup, 2, 10);
+ equalGrid->setSpacing(5);
+ equalGrid->setMargin(10);
+
+ QLabel* eq30Text = new QLabel("30Hz", equalGroup);
+ eq30Slider = new QSlider(Qt::Vertical, equalGroup);
+ eq30Slider->setRange(-100, -1);
+ eq30Slider->setSteps(1, 10);
+ eq30Slider->setTickInterval(50);
+ eq30Slider->setTickmarks(QSlider::Right);
+ connect(eq30Slider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewEq30(int)));
+ equalGrid->addWidget(eq30Text, 1, 0);
+ equalGrid->addWidget(eq30Slider, 0, 0);
+
+ QLabel* eq60Text = new QLabel("60Hz", equalGroup);
+ eq60Slider = new QSlider(Qt::Vertical, equalGroup);
+ eq60Slider->setRange(-100, -1);
+ eq60Slider->setSteps(1, 10);
+ connect(eq60Slider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewEq60(int)));
+ equalGrid->addWidget(eq60Text, 1, 1);
+ equalGrid->addWidget(eq60Slider, 0, 1);
+
+ QLabel* eq125Text = new QLabel("125Hz", equalGroup);
+ eq125Slider = new QSlider(Qt::Vertical, equalGroup);
+ eq125Slider->setRange(-100, -1);
+ eq125Slider->setSteps(1, 10);
+ connect(eq125Slider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewEq125(int)));
+ equalGrid->addWidget(eq125Text, 1, 2);
+ equalGrid->addWidget(eq125Slider, 0, 2);
+
+ QLabel* eq250Text = new QLabel("250Hz", equalGroup);
+ eq250Slider = new QSlider(Qt::Vertical, equalGroup);
+ eq250Slider->setRange(-100, -1);
+ eq250Slider->setSteps(1, 10);
+ connect(eq250Slider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewEq250(int)));
+ equalGrid->addWidget(eq250Text, 1, 3);
+ equalGrid->addWidget(eq250Slider, 0, 3);
+
+ QLabel* eq500Text = new QLabel("500Hz", equalGroup);
+ eq500Slider = new QSlider(Qt::Vertical, equalGroup);
+ eq500Slider->setRange(-100, -1);
+ eq500Slider->setSteps(1, 10);
+ connect(eq500Slider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewEq500(int)));
+ equalGrid->addWidget(eq500Text, 1, 4);
+ equalGrid->addWidget(eq500Slider, 0, 4);
+
+ QLabel* eq1kText = new QLabel("1kHz", equalGroup);
+ eq1kSlider = new QSlider(Qt::Vertical, equalGroup);
+ eq1kSlider->setRange(-100, -1);
+ eq1kSlider->setSteps(1, 10);
+ connect(eq1kSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewEq1k(int)));
+ equalGrid->addWidget(eq1kText, 1, 5);
+ equalGrid->addWidget(eq1kSlider, 0, 5);
+
+ QLabel* eq2kText = new QLabel("2kHz", equalGroup);
+ eq2kSlider = new QSlider(Qt::Vertical, equalGroup);
+ eq2kSlider->setRange(-100, -1);
+ eq2kSlider->setSteps(1, 10);
+ connect(eq2kSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewEq2k(int)));
+ equalGrid->addWidget(eq2kText, 1, 6);
+ equalGrid->addWidget(eq2kSlider, 0, 6);
+
+ QLabel* eq4kText = new QLabel("4kHz", equalGroup);
+ eq4kSlider = new QSlider(Qt::Vertical, equalGroup);
+ eq4kSlider->setRange(-100, -1);
+ eq4kSlider->setSteps(1, 10);
+ connect(eq4kSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewEq4k(int)));
+ equalGrid->addWidget(eq4kText, 1, 7);
+ equalGrid->addWidget(eq4kSlider, 0, 7);
+
+ QLabel* eq8kText = new QLabel("8kHz", equalGroup);
+ eq8kSlider = new QSlider(Qt::Vertical, equalGroup);
+ eq8kSlider->setRange(-100, -1);
+ eq8kSlider->setSteps(1, 10);
+ connect(eq8kSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewEq8k(int)));
+ equalGrid->addWidget(eq8kText, 1, 8);
+ equalGrid->addWidget(eq8kSlider, 0, 8);
+
+ QLabel* eq16kText = new QLabel("16kHz", equalGroup);
+ eq16kSlider = new QSlider(Qt::Vertical, equalGroup);
+ eq16kSlider->setRange(-100, -1);
+ eq16kSlider->setSteps(1, 10);
+ eq16kSlider->setTickInterval(50);
+ eq16kSlider->setTickmarks(QSlider::Left);
+ connect(eq16kSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewEq16k(int)));
+ equalGrid->addWidget(eq16kText, 1, 9);
+ equalGrid->addWidget(eq16kSlider, 0, 9);
+
+ connect(this, SIGNAL(defaultClicked()), this, SLOT(slotSetDefaultValues()));
+}
+
+
+Equalizer::~Equalizer()
+{
+}
+
+
+void Equalizer::slotSetEnabled( bool enabled )
+{
+ equalGroup->setEnabled( enabled );
+ volumeGain->setEnabled( enabled );
+ enableButton( KDialogBase::Default, enabled );
+
+ if (enabled)
+ {
+ emit signalSetVolumeGain( volumeGain->isChecked() );
+ emit signalNewEq30( eq30Slider->value() );
+ emit signalNewEq60( eq60Slider->value() );
+ emit signalNewEq125( eq125Slider->value() );
+ emit signalNewEq250( eq250Slider->value() );
+ emit signalNewEq500( eq500Slider->value() );
+ emit signalNewEq1k( eq1kSlider->value() );
+ emit signalNewEq2k( eq2kSlider->value() );
+ emit signalNewEq4k( eq4kSlider->value() );
+ emit signalNewEq8k( eq8kSlider->value() );
+ emit signalNewEq16k( eq16kSlider->value() );
+ }
+ else
+ {
+ emit signalSetVolumeGain( false );
+ emit signalNewEq30( 0 );
+ emit signalNewEq60( 0 );
+ emit signalNewEq125( 0 );
+ emit signalNewEq250( 0 );
+ emit signalNewEq500( 0 );
+ emit signalNewEq1k( 0 );
+ emit signalNewEq2k( 0 );
+ emit signalNewEq4k( 0 );
+ emit signalNewEq8k( 0 );
+ emit signalNewEq16k( 0 );
+ }
+}
+
+
+void Equalizer::slotSetDefaultValues()
+{
+ eq30Slider->setValue(-50);
+ eq60Slider->setValue(-50);
+ eq125Slider->setValue(-50);
+ eq250Slider->setValue(-50);
+ eq500Slider->setValue(-50);
+ eq1kSlider->setValue(-50);
+ eq2kSlider->setValue(-50);
+ eq4kSlider->setValue(-50);
+ eq8kSlider->setValue(-50);
+ eq16kSlider->setValue(-50);
+}
+
+
+/******* read from config-file ********/
+void Equalizer::ReadValues(KConfig* config)
+{
+ config->setGroup("Equalizer");
+
+ bool enabled = config->readBoolEntry( "Enabled", false );
+ on->setChecked( enabled );
+
+ bool gain = config->readBoolEntry( "Volume Gain", true );
+ volumeGain->setChecked( gain );
+
+ eq30Slider->setValue( config->readNumEntry("30Hz", -50) );
+ eq60Slider->setValue( config->readNumEntry("60Hz", -50) );
+ eq125Slider->setValue( config->readNumEntry("125Hz", -50) );
+ eq250Slider->setValue( config->readNumEntry("250Hz", -50) );
+ eq500Slider->setValue( config->readNumEntry("500Hz", -50) );
+ eq1kSlider->setValue( config->readNumEntry("1kHz", -50) );
+ eq2kSlider->setValue( config->readNumEntry("2kHz", -50) );
+ eq4kSlider->setValue( config->readNumEntry("4kHz", -50) );
+ eq8kSlider->setValue( config->readNumEntry("8kHz", -50) );
+ eq16kSlider->setValue( config->readNumEntry("16kHz", -50) );
+
+ if (!enabled)
+ slotSetEnabled( false );
+}
+
+
+/************** save in config file *************/
+void Equalizer::SaveValues(KConfig* config)
+{
+ config->setGroup("Equalizer");
+
+ config->writeEntry( "Enabled", on->isChecked());
+ config->writeEntry( "Volume Gain", volumeGain->isChecked());
+ config->writeEntry("30Hz", eq30Slider->value());
+ config->writeEntry("60Hz", eq60Slider->value());
+ config->writeEntry("125Hz", eq125Slider->value());
+ config->writeEntry("250Hz", eq250Slider->value());
+ config->writeEntry("500Hz", eq500Slider->value());
+ config->writeEntry("1kHz", eq1kSlider->value());
+ config->writeEntry("2kHz", eq2kSlider->value());
+ config->writeEntry("4kHz", eq4kSlider->value());
+ config->writeEntry("8kHz", eq8kSlider->value());
+ config->writeEntry("16kHz", eq16kSlider->value());
+}
diff --git a/kaffeine/src/player-parts/xine-part/equalizer.h b/kaffeine/src/player-parts/xine-part/equalizer.h
new file mode 100644
index 0000000..e912dcc
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/equalizer.h
@@ -0,0 +1,79 @@
+/*
+ * equalizer.h
+ *
+ * Copyright (C) 2003-2004 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef EQUALIZER_H
+#define EQUALIZER_H
+
+#include <kdialogbase.h>
+#include <kconfig.h>
+
+#include <qwidget.h>
+#include <qslider.h>
+#include <qgroupbox.h>
+#include <qcheckbox.h>
+
+/**equalizer widget
+ *@author Juergen Kofler
+ */
+
+class Equalizer : public KDialogBase {
+ Q_OBJECT
+public:
+ Equalizer(QWidget *parent=0, const char *name=0);
+ ~Equalizer();
+
+ void ReadValues(KConfig* config);
+ void SaveValues(KConfig* config);
+
+signals:
+ void signalNewEq30(int);
+ void signalNewEq60(int);
+ void signalNewEq125(int);
+ void signalNewEq250(int);
+ void signalNewEq500(int);
+ void signalNewEq1k(int);
+ void signalNewEq2k(int);
+ void signalNewEq4k(int);
+ void signalNewEq8k(int);
+ void signalNewEq16k(int);
+ void signalSetVolumeGain(bool);
+
+
+private slots:
+ void slotSetDefaultValues();
+ void slotSetEnabled( bool );
+
+private:
+ QCheckBox* on;
+ QCheckBox* volumeGain;
+ QGroupBox* equalGroup;
+ QSlider* eq30Slider;
+ QSlider* eq60Slider;
+ QSlider* eq125Slider;
+ QSlider* eq250Slider;
+ QSlider* eq500Slider;
+ QSlider* eq1kSlider;
+ QSlider* eq2kSlider;
+ QSlider* eq4kSlider;
+ QSlider* eq8kSlider;
+ QSlider* eq16kSlider;
+};
+
+#endif /* EQUALIZER_H */
diff --git a/kaffeine/src/player-parts/xine-part/filterdialog.cpp b/kaffeine/src/player-parts/xine-part/filterdialog.cpp
new file mode 100644
index 0000000..4468b31
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/filterdialog.cpp
@@ -0,0 +1,135 @@
+/*
+ * filterdialog.cpp - config dialog for postprocessing filters
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <klocale.h>
+#include <kdebug.h>
+#include <kpushbutton.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kcombobox.h>
+
+#include <qvbox.h>
+#include <qstringlist.h>
+#include <qcheckbox.h>
+#include <qlayout.h>
+#include <qscrollview.h>
+
+#include "filterdialog.h"
+#include "filterdialog.moc"
+
+
+FilterDialog::FilterDialog(const QStringList& audioFilters, const QStringList& videoFilters, QWidget *parent, const char *name) :
+ KDialogBase(KDialogBase::IconList, i18n("Effect Plugins"), KDialogBase::Ok, KDialogBase::Ok, parent, name, false)
+{
+ reparent(parent, pos(), false);
+ setInitialSize(QSize(400,350), true);
+
+/****** Audio Filters ******/
+ QWidget* audioPage = addPage(i18n("Audio"), i18n("Audio Filters"),
+ KGlobal::iconLoader()->loadIcon("sound", KIcon::Panel, KIcon::SizeMedium));
+ QGridLayout* audioGrid = new QGridLayout( audioPage, 3, 3 );
+ audioGrid->setSpacing( 5 );
+
+ QCheckBox* useAudioFiltersCB = new QCheckBox( audioPage );
+ useAudioFiltersCB->setText( i18n("Enable audio filters") );
+ useAudioFiltersCB->setChecked( true );
+ connect( useAudioFiltersCB, SIGNAL(toggled(bool)), this, SLOT(slotUseAudioFilters(bool)));
+
+ audioGrid->addMultiCellWidget( useAudioFiltersCB, 0, 0, 0, 2 );
+
+ m_audioFilterCombo = new KComboBox( audioPage );
+ m_audioFilterCombo->insertStringList( audioFilters );
+
+ m_addAudioButton = new KPushButton( i18n("Add Filter"), audioPage );
+ connect( m_addAudioButton, SIGNAL( clicked() ), this, SLOT( slotAddAudioClicked() ));
+ m_removeAudioButton = new KPushButton( i18n("Remove All Filters"), audioPage );
+ connect( m_removeAudioButton, SIGNAL( clicked() ), this, SIGNAL( signalRemoveAllAudioFilters() ));
+
+ audioGrid->addWidget( m_audioFilterCombo, 1, 0 );
+ audioGrid->addWidget( m_removeAudioButton, 1, 2 );
+ audioGrid->addWidget( m_addAudioButton, 1, 1 );
+
+ QScrollView* audioSv = new QScrollView( audioPage );
+ audioSv->setResizePolicy(QScrollView::AutoOneFit);
+ m_audioFilterPage = new QVBox(audioSv->viewport());
+ m_audioFilterPage->setMargin( 5 );
+ audioSv->addChild(m_audioFilterPage);
+
+ audioGrid->addMultiCellWidget( audioSv, 2, 2, 0, 2 );
+
+/****** Video Filters ******/
+ QWidget* videoPage = addPage(i18n("Video"), i18n("Video Filters"),
+ KGlobal::iconLoader()->loadIcon("video", KIcon::Panel, KIcon::SizeMedium));
+ QGridLayout* videoGrid = new QGridLayout( videoPage, 3, 3 );
+ videoGrid->setSpacing( 5 );
+
+ QCheckBox* useVideoFiltersCB = new QCheckBox( videoPage );
+ useVideoFiltersCB->setText( i18n("Enable video filters") );
+ useVideoFiltersCB->setChecked( true );
+ connect( useVideoFiltersCB, SIGNAL(toggled(bool)), this, SLOT(slotUseVideoFilters(bool)));
+
+ videoGrid->addMultiCellWidget( useVideoFiltersCB, 0, 0, 0, 2 );
+
+ m_videoFilterCombo = new KComboBox( videoPage );
+ m_videoFilterCombo->insertStringList( videoFilters );
+
+ m_addVideoButton = new KPushButton( i18n("Add Filter"), videoPage );
+ connect( m_addVideoButton, SIGNAL( clicked() ), this, SLOT( slotAddVideoClicked() ));
+ m_removeVideoButton = new KPushButton( i18n("Remove All Filters"), videoPage );
+ connect( m_removeVideoButton, SIGNAL( clicked() ), this, SIGNAL( signalRemoveAllVideoFilters() ));
+
+ videoGrid->addWidget( m_videoFilterCombo, 1, 0 );
+ videoGrid->addWidget( m_removeVideoButton, 1, 2 );
+ videoGrid->addWidget( m_addVideoButton, 1, 1 );
+
+ QScrollView* videoSv = new QScrollView( videoPage );
+ videoSv->setResizePolicy(QScrollView::AutoOneFit);
+ m_videoFilterPage = new QVBox(videoSv->viewport());
+ m_videoFilterPage->setMargin( 5 );
+ videoSv->addChild(m_videoFilterPage);
+
+ videoGrid->addMultiCellWidget( videoSv, 2, 2, 0, 2 );
+}
+
+
+FilterDialog::~FilterDialog()
+{
+ kdDebug() << "FilterDialog: destructor" << endl;
+}
+
+
+void FilterDialog::slotUseAudioFilters( bool on )
+{
+ m_audioFilterCombo->setEnabled( on );
+ m_removeAudioButton->setEnabled( on );
+ m_addAudioButton->setEnabled( on );
+ m_audioFilterPage->setEnabled( on );
+ emit signalUseAudioFilters( on );
+}
+
+
+void FilterDialog::slotUseVideoFilters( bool on )
+{
+ m_videoFilterCombo->setEnabled( on );
+ m_removeVideoButton->setEnabled( on );
+ m_addVideoButton->setEnabled( on );
+ m_videoFilterPage->setEnabled( on );
+ emit signalUseVideoFilters( on );
+}
diff --git a/kaffeine/src/player-parts/xine-part/filterdialog.h b/kaffeine/src/player-parts/xine-part/filterdialog.h
new file mode 100644
index 0000000..c730f69
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/filterdialog.h
@@ -0,0 +1,68 @@
+/*
+ * filterdialog.h - config dialog for postprocessing filters
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef FILTERDIALOG_H
+#define FILTERDIALOG_H
+
+#include <kdialogbase.h>
+
+class KComboBox;
+class QVBox;
+class QString;
+class QStringList;
+
+/**
+ *@author Juergen Kofler
+ */
+
+class FilterDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ FilterDialog(const QStringList& audiofilters, const QStringList& videofilters, QWidget *parent=0, const char *name=0);
+ ~FilterDialog();
+
+signals:
+ void signalCreateAudioFilter(const QString& name, QWidget* parent);
+ void signalRemoveAllAudioFilters();
+ void signalUseAudioFilters(bool);
+ void signalCreateVideoFilter(const QString& name, QWidget* parent);
+ void signalRemoveAllVideoFilters();
+ void signalUseVideoFilters(bool);
+
+private slots:
+ void slotAddAudioClicked() { emit signalCreateAudioFilter(m_audioFilterCombo->currentText(), (QWidget*)m_audioFilterPage); }
+ void slotUseAudioFilters(bool on);
+ void slotAddVideoClicked() { emit signalCreateVideoFilter(m_videoFilterCombo->currentText(), (QWidget*)m_videoFilterPage); }
+ void slotUseVideoFilters(bool on);
+
+private:
+ KComboBox* m_audioFilterCombo;
+ QVBox* m_audioFilterPage;
+ KPushButton* m_addAudioButton;
+ KPushButton* m_removeAudioButton;
+
+ KComboBox* m_videoFilterCombo;
+ QVBox* m_videoFilterPage;
+ KPushButton* m_addVideoButton;
+ KPushButton* m_removeVideoButton;
+};
+
+#endif /* FILTERDIALOG_H */
diff --git a/kaffeine/src/player-parts/xine-part/kxinewidget.cpp b/kaffeine/src/player-parts/xine-part/kxinewidget.cpp
new file mode 100644
index 0000000..77f26e2
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/kxinewidget.cpp
@@ -0,0 +1,4117 @@
+/*
+ * kxinewidget.cpp - a kde / qt api for xine-lib
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2005-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <qapplication.h>
+#include <qwidget.h>
+#include <qstringlist.h>
+
+#include <qtimer.h>
+#include <qevent.h>
+#include <qdir.h>
+#include <qcursor.h>
+#include <qimage.h>
+#include <qdatetime.h>
+#include <qtextcodec.h>
+
+#include <xine/xineutils.h>
+
+#include <cmath>
+
+#include "kxinewidget.h"
+#include "kaffeinepart.h"
+
+#ifdef HAVE_XINERAMA
+#include <X11/extensions/Xinerama.h>
+#endif
+
+#ifndef USE_QT_ONLY
+#include "kxinewidget.moc"
+#include <klocale.h>
+#include <kdebug.h>
+#endif
+
+#define TIMER_EVENT_PLAYBACK_FINISHED 100
+#define TIMER_EVENT_NEW_CHANNELS 101
+#define TIMER_EVENT_NEW_TITLE 102
+#define TIMER_EVENT_NEW_STATUS 103
+#define TIMER_EVENT_CHANGE_CURSOR 104
+#define TIMER_EVENT_NEW_MRL_REFERENCE 105
+#define TIMER_EVENT_NEW_XINE_MESSAGE 106
+#define TIMER_EVENT_NEW_XINE_ERROR 107
+#define TIMER_EVENT_FRAME_FORMAT_CHANGE 108
+#define TIMER_EVENT_NEW_VOLUME_LEVEL 109
+#define TIMER_EVENT_RESTART_PLAYBACK 200
+#define TIMER_EVENT_RESIZE_PARENT 300
+
+
+KXineWidget::KXineWidget(QWidget* parent, const char* name,
+ const QString& pathToConfigFile, const QString& pathToLogoFile,
+ const QString& audioDriver, const QString& videoDriver,
+ bool startManual, bool verbose)
+ : QWidget(parent,name), m_startXineManual(startManual), m_xineReady(false),
+ m_logoFile(pathToLogoFile), m_preferedAudio(audioDriver), m_preferedVideo(videoDriver), m_xineVerbose(verbose),
+ m_xineEngine(NULL), m_audioDriver(NULL), m_videoDriver(NULL), m_xineStream(NULL), connection(NULL),
+ m_eventQueue(NULL), m_osd(NULL), m_osdUnscaled(false), m_osdShow(false), m_osdSize(0), m_osdFont(NULL),
+ m_audioChoices(NULL), m_audioInfo(NULL), m_videoChoices(NULL), m_videoInfo(NULL), m_mixerInfo(NULL),
+ m_osdShowInfo(NULL),
+ m_osdSizeOptions(NULL), m_osdSizeInfo(NULL), m_osdFontInfo(NULL),
+#ifndef USE_QT_ONLY
+ m_videoFiltersEnabled(true), m_audioFiltersEnabled(true), m_deinterlaceFilter(NULL),
+ m_deinterlaceEnabled(false),
+ m_visualPlugin(NULL),
+#else
+ m_xinePost(NULL), m_postAudioSource(NULL), m_postInput(NULL),
+#endif
+ m_visualPluginName(QString::null), m_currentSpeed(Normal), m_softwareMixer(false), m_volumeGain(false),
+ m_currentZoom(100), m_currentZoomX(100), m_currentZoomY(100), m_currentAudio(0), m_currentSub(0), m_savedPos(0), m_autoresizeEnabled(false)
+{
+ setMinimumSize(QSize(20,20)); // set a size hint
+ setPaletteBackgroundColor(QColor(0,0,0)); //black
+
+ /* dvb */
+ TimeShiftFilename = "";
+ dvbHaveVideo = 0;
+ dvbOSD = 0;
+ dvbColor[0] = 0;
+ connect( &dvbOSDHideTimer, SIGNAL(timeout()), this, SLOT(dvbHideOSD()) );
+
+ if (pathToConfigFile.isNull())
+ {
+ debugOut("Using default config file ~/.xine/config");
+ m_configFilePath = QDir::homeDirPath();
+ m_configFilePath.append("/.xine/config");
+ }
+ else
+ m_configFilePath = pathToConfigFile;
+
+ if (!m_logoFile.isNull())
+ appendToQueue(m_logoFile);
+
+#ifndef USE_QT_ONLY
+ m_videoFilterList.setAutoDelete(true); /*** delete post plugin on removing from list ***/
+ m_audioFilterList.setAutoDelete(true); /*** delete post plugin on removing from list ***/
+#endif
+
+ connect(&m_posTimer, SIGNAL(timeout()), this, SLOT(slotSendPosition()));
+ connect(&m_lengthInfoTimer, SIGNAL(timeout()), this, SLOT(slotEmitLengthInfo()));
+ connect(&m_mouseHideTimer, SIGNAL(timeout()), this, SLOT(slotHideMouse()));
+ connect(&m_osdTimer, SIGNAL(timeout()), this, SLOT(slotOSDHide()));
+ connect(&m_recentMessagesTimer, SIGNAL(timeout()), this, SLOT(slotNoRecentMessage()));
+
+ setUpdatesEnabled(false);
+ setMouseTracking(true);
+}
+
+
+KXineWidget::~KXineWidget()
+{
+ /* "careful" shutdown, maybe xine initialization was not successful */
+ m_xineReady = false;
+
+ /* stop all timers */
+ m_posTimer.stop();
+ m_mouseHideTimer.stop();
+
+#ifndef USE_QT_ONLY
+ slotRemoveAllAudioFilters();
+ slotRemoveAllVideoFilters();
+#endif
+ if (m_osd)
+ xine_osd_free(m_osd);
+
+ if (m_xineStream)
+ xine_close(m_xineStream);
+
+ debugOut("Shut down xine engine");
+
+#ifndef USE_QT_ONLY
+ if (m_deinterlaceFilter)
+ {
+ debugOut("Unwire video filters");
+ unwireVideoFilters();
+ delete m_deinterlaceFilter;
+ m_deinterlaceFilter = NULL;
+ }
+ if (m_visualPlugin)
+ {
+ debugOut("Unwire audio filters");
+ unwireAudioFilters();
+ debugOut(QString("Dispose visual plugin: %1").arg(m_visualPluginName ));
+ delete m_visualPlugin;
+ m_visualPlugin = NULL;
+ }
+#else
+ if (m_xinePost)
+ {
+ debugOut(QString("Dispose visual plugin: %1").arg(m_visualPluginName));
+ m_postAudioSource = xine_get_audio_source(m_xineStream);
+ xine_post_wire_audio_port(m_postAudioSource, m_audioDriver);
+ xine_post_dispose(m_xineEngine, m_xinePost);
+ }
+#endif
+ if (m_eventQueue)
+ {
+ debugOut("Dispose event queue");
+ xine_event_dispose_queue(m_eventQueue);
+ }
+ if (m_xineStream)
+ {
+ debugOut("Dispose stream");
+ xine_dispose(m_xineStream);
+ }
+ if (m_audioDriver)
+ {
+ debugOut("Close audio driver");
+ xine_close_audio_driver(m_xineEngine, m_audioDriver);
+ }
+ if (m_videoDriver)
+ {
+ debugOut("Close video driver");
+ xine_close_video_driver(m_xineEngine, m_videoDriver);
+ }
+ if (m_xineEngine)
+ {
+ saveXineConfig();
+ debugOut("Close xine engine");
+ xine_exit(m_xineEngine);
+ }
+ m_xineEngine = NULL;
+
+ /* free xine config strings */
+ if (m_osdShowInfo) free(m_osdShowInfo);
+
+ if (m_osdFontInfo) free(m_osdFontInfo);
+ if (m_osdFont) free(m_osdFont);
+
+ if (m_osdSizeInfo) free(m_osdSizeInfo);
+ if (m_osdSizeOptions)
+ {
+ int i=0;
+ while (m_osdSizeOptions[i])
+ {
+ free(m_osdSizeOptions[i]);
+ i++;
+ }
+ delete [] m_osdSizeOptions;
+ }
+
+ if (m_mixerInfo) free(m_mixerInfo);
+
+ if (m_videoInfo) free(m_videoInfo);
+ if (m_videoChoices)
+ {
+ int i=0;
+ while (m_videoChoices[i])
+ {
+ free(m_videoChoices[i]);
+ i++;
+ }
+ delete [] m_videoChoices;
+ }
+
+ if (m_audioInfo) free(m_audioInfo);
+ if (m_audioChoices)
+ {
+ int i=0;
+ while (m_audioChoices[i])
+ {
+ free(m_audioChoices[i]);
+ i++;
+ }
+ delete [] m_audioChoices;
+ }
+
+ if (connection)
+ {
+ debugOut("Close xine display");
+#ifndef HAVE_XCB
+ XCloseDisplay(connection); /* close xine display */
+#else
+ xcb_disconnect(connection); /* close xine display */
+#endif
+ }
+ connection = NULL;
+
+ debugOut("xine closed");
+}
+
+
+void KXineWidget::saveXineConfig()
+{
+ debugOut("Set CD/VCD/DVD path back");
+ xine_cfg_entry_t config;
+
+ if (!m_cachedCDPath.isNull())
+ {
+ xine_config_lookup_entry (m_xineEngine, "input.cdda_device", &config);
+ config.str_value = (char*)m_cachedCDPath.latin1();
+ xine_config_update_entry (m_xineEngine, &config);
+ }
+
+ if (!m_cachedVCDPath.isNull())
+ {
+ xine_config_lookup_entry (m_xineEngine, "input.vcd_device", &config);
+ config.str_value = (char*)m_cachedVCDPath.latin1();
+ xine_config_update_entry (m_xineEngine, &config);
+ }
+
+ if (!m_cachedDVDPath.isNull())
+ {
+ xine_config_lookup_entry (m_xineEngine, "input.dvd_device", &config);
+ config.str_value = (char*)m_cachedDVDPath.latin1();
+ xine_config_update_entry (m_xineEngine, &config);
+ }
+
+ debugOut(QString("Save xine config to: %1").arg(m_configFilePath));
+ xine_config_save(m_xineEngine, m_configFilePath.ascii());
+}
+
+
+/***************************************************
+ * CALLBACKS
+ ***************************************************/
+
+void KXineWidget::destSizeCallback(void* p, int /*video_width*/, int /*video_height*/, double /*video_aspect*/,
+ int* dest_width, int* dest_height, double* dest_aspect)
+
+{
+ if (p == NULL) return;
+ KXineWidget* vw = (KXineWidget*) p;
+
+ *dest_width = vw->width();
+ *dest_height = vw->height();
+ *dest_aspect = vw->m_displayRatio;
+}
+
+
+void KXineWidget::frameOutputCallback(void* p, int video_width, int video_height, double video_aspect,
+ int* dest_x, int* dest_y, int* dest_width, int* dest_height,
+ double* dest_aspect, int* win_x, int* win_y)
+
+{
+ if (p == NULL) return;
+ KXineWidget* vw = (KXineWidget*) p;
+
+ *dest_x = 0;
+ *dest_y = 0 ;
+ *dest_width = vw->width();
+ *dest_height = vw->height();
+ *win_x = vw->m_globalX;
+ *win_y = vw->m_globalY;
+ *dest_aspect = vw->m_displayRatio;
+
+ /* give false aspect for audio visualization*/
+ if ( !vw->hasVideo() ) {
+ *dest_aspect = (video_width*video_aspect)/((vw->width()*video_height/vw->height())-0.5);
+ }
+
+ /* correct size with video aspect */
+ if (video_aspect >= vw->m_displayRatio)
+ video_width = (int) ( (double) (video_width * video_aspect / vw->m_displayRatio + 0.5) );
+ else
+ video_height = (int) ( (double) (video_height * vw->m_displayRatio / video_aspect) + 0.5);
+
+ /* frame size changed */
+ if ( (video_width != vw->m_videoFrameWidth) || (video_height != vw->m_videoFrameHeight) )
+ {
+ debugOut(QString("New video frame size: %1x%2 - aspect ratio: %3").arg(video_width).arg(video_height).arg(video_aspect));
+ vw->m_videoFrameWidth = video_width;
+ vw->m_videoFrameHeight = video_height;
+ vw->m_videoAspect = video_aspect;
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_FRAME_FORMAT_CHANGE));
+
+ /* auto-resize parent widget */
+ if ((vw->m_autoresizeEnabled) && (vw->parentWidget()) && (vw->m_posTimer.isActive()) && (!vw->parentWidget()->isFullScreen())
+ && (video_width > 0) && (video_height > 0))
+ {
+ vw->m_newParentSize = vw->parentWidget()->size() - QSize((vw->width() - video_width), vw->height() - video_height);
+
+ debugOut(QString("Resize video window to: %1x%2").arg(vw->m_newParentSize.width()).arg(vw->m_newParentSize.height()));
+
+ /* we should not do a resize() inside a xine thread,
+ but post an event to the main thread */
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_RESIZE_PARENT));
+ }
+ }
+}
+
+
+/*
+ * XINE EVENT THREAD
+ * only the QT event thread should do GUI operations,
+ * we use QApplication::postEvent() and a reimplementation of QObject::timerEvent() to
+ * make sure all critical jobs are done within the QT main thread context
+ *
+ * for more information see http://doc.trolltech.com/3.1/threads.html
+ */
+
+void KXineWidget::xineEventListener(void *p, const xine_event_t* xineEvent)
+{
+
+ if (p == NULL) return;
+ KXineWidget* vw = (KXineWidget*) p;
+
+ switch (xineEvent->type)
+ {
+ case XINE_EVENT_UI_PLAYBACK_FINISHED:
+ {
+ debugOut("xine event: playback finished");
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_PLAYBACK_FINISHED ));
+ break;
+ }
+ case XINE_EVENT_UI_CHANNELS_CHANGED: /* new channel informations */
+ {
+ debugOut("xine event: channels changed");
+ int i,channels;
+ char* lang = new char[128];
+ QString slang;
+ int num;
+ QStringList tmp;
+ bool update=false, sk;
+
+ /*** get audio channels ***/
+ tmp.append(i18n("auto"));
+ channels = xine_get_stream_info(vw->m_xineStream, XINE_STREAM_INFO_MAX_AUDIO_CHANNEL);
+ for(i = 0; i < channels; i++)
+ {
+ slang = QString("%1.").arg(i+1);
+ if (xine_get_audio_lang(vw->m_xineStream, i, lang))
+ slang += lang;
+ tmp << slang;
+ }
+ if ( tmp!=vw->m_audioCh ) {
+ update = true;
+ vw->m_audioCh = tmp;
+ }
+ num = xine_get_param(vw->m_xineStream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL);
+ if ( vw->m_currentAudio!=num ) {
+ update = true;
+ if ( num>channels )
+ vw->m_currentAudio = -1;
+ else
+ vw->m_currentAudio = num;
+ }
+
+ /*** get subtitle channels ***/
+ tmp.clear();
+ tmp.append(i18n("off"));
+ channels = xine_get_stream_info(vw->m_xineStream, XINE_STREAM_INFO_MAX_SPU_CHANNEL);
+ for(i = 0; i<channels; i++)
+ {
+ slang = QString("%1.").arg(i+1);
+ if (xine_get_spu_lang(vw->m_xineStream, i, lang))
+ slang += lang;
+ tmp << slang;
+ }
+ if ( tmp!=vw->m_subCh ) {
+ update = true;
+ vw->m_subCh = tmp;
+ }
+ num = xine_get_param(vw->m_xineStream, XINE_PARAM_SPU_CHANNEL);
+ if ( vw->m_currentSub!=num ) {
+ update = true;
+ if ( num>channels )
+ vw->m_currentSub = -1;
+ else
+ vw->m_currentSub = num;
+ }
+
+ delete [] lang;
+
+ //check if stream is seekable
+ sk = (bool)xine_get_stream_info(vw->m_xineStream, XINE_STREAM_INFO_SEEKABLE);
+ if ( vw->m_trackIsSeekable!=sk ) {
+ update = true;
+ vw->m_trackIsSeekable = sk;
+ }
+
+ if ( update )
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_NEW_CHANNELS));
+ break;
+ }
+ case XINE_EVENT_UI_SET_TITLE: /* set new title */
+ {
+ debugOut("xine event: ui set title");
+ xine_ui_data_t* xd = (xine_ui_data_t*)xineEvent->data;
+ vw->m_trackTitle = QString::fromLocal8Bit( (char*)xd->str );
+
+ vw->m_lengthInfoTries = 0;
+ vw->m_lengthInfoTimer.start(1000); /* May be new Length on Changing DVD/VCD titles */
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_NEW_TITLE));
+ break;
+ }
+ case XINE_EVENT_PROGRESS:
+ {
+ debugOut("xine event: progress info");
+ xine_progress_data_t* pd = (xine_progress_data_t*)xineEvent->data;
+
+ vw->m_statusString = QString::fromLocal8Bit(pd->description) + " " + QString::number(pd->percent) + "%";
+
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_NEW_STATUS));
+ break;
+ }
+ case XINE_EVENT_DROPPED_FRAMES:
+ {
+ debugOut("xine event: dropped frames");
+ xine_dropped_frames_t* dropped = (xine_dropped_frames_t*)xineEvent->data;
+
+ warningOut(QString("Skipped frames: %1 - discarded frames: %2").arg(dropped->skipped_frames/10).arg(dropped->discarded_frames/10));
+
+ break;
+ }
+ case XINE_EVENT_SPU_BUTTON:
+ {
+ debugOut("xine event: spu button");
+ xine_spu_button_t* button = (xine_spu_button_t*)xineEvent->data;
+
+ if (button->direction == 1) /* enter a button */
+ {
+ debugOut("DVD Menu: Mouse entered button");
+ vw->m_DVDButtonEntered = true;
+ }
+ else
+ {
+ debugOut("DVD Menu: Mouse left button");
+ vw->m_DVDButtonEntered = false;
+ }
+
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_CHANGE_CURSOR));
+ break;
+ }
+ case XINE_EVENT_UI_NUM_BUTTONS:
+ {
+ debugOut("xine event: ui num buttons");
+
+ break;
+ }
+ case XINE_EVENT_MRL_REFERENCE:
+ {
+ debugOut("xine event: mrl reference");
+ xine_mrl_reference_data_t* mrldata = (xine_mrl_reference_data_t*)xineEvent->data;
+ vw->m_newMRLReference = mrldata->mrl;
+
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_NEW_MRL_REFERENCE));
+ break;
+ }
+ case XINE_EVENT_FRAME_FORMAT_CHANGE:
+ {
+ // debugOut("xine event: frame format change");
+
+ // QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_FRAME_FORMAT_CHANGE));
+ break;
+ }
+ case XINE_EVENT_AUDIO_LEVEL:
+ {
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_NEW_VOLUME_LEVEL));
+ break;
+ }
+ case XINE_EVENT_UI_MESSAGE:
+ {
+ debugOut("xine event: xine message");
+
+ xine_ui_message_data_t *data = (xine_ui_message_data_t *)xineEvent->data;
+ QString message;
+
+ switch(data->type)
+ {
+ case XINE_MSG_NO_ERROR:
+ {
+ /* copy strings, and replace '\0' separators by '\n' */
+ char* s = data->messages;
+ char* d = new char[2000];
+
+ while(s && (*s != '\0') && ((*s + 1) != '\0'))
+ {
+ switch(*s)
+ {
+ case '\0':
+ {
+ *d = '\n';
+ break;
+ }
+ default:
+ {
+ *d = *s;
+ break;
+ }
+ }
+ s++;
+ d++;
+ }
+ *++d = '\0';
+
+ message = d;
+ delete [] d;
+ break;
+ }
+ case XINE_MSG_GENERAL_WARNING:
+ {
+ message = i18n("General Warning: \n");
+
+ if(data->explanation)
+ message = message + ((char *) data + data->explanation) + " " + ((char *) data + data->parameters);
+ else
+ message = message + i18n("No Informations available.");
+
+ break;
+ }
+ case XINE_MSG_SECURITY:
+ {
+ message = i18n("Security Warning: \n");
+
+ if(data->explanation)
+ message = message + ((char *) data + data->explanation) + " " + ((char *) data + data->parameters);
+
+ break;
+ }
+ case XINE_MSG_UNKNOWN_HOST:
+ {
+ message = i18n("The host you're trying to connect is unknown.\nCheck the validity of the specified hostname. ");
+ if(data->explanation)
+ message = message + "(" + ((char *) data + data->parameters) + ")";
+ break;
+ }
+ case XINE_MSG_UNKNOWN_DEVICE:
+ {
+ message = i18n("The device name you specified seems invalid. ");
+ if(data->explanation)
+ message = message + "(" + ((char *) data + data->parameters) + ")";
+ break;
+ }
+ case XINE_MSG_NETWORK_UNREACHABLE:
+ {
+ message = i18n("The network looks unreachable.\nCheck your network setup and the server name. ");
+ if(data->explanation)
+ message = message + "(" + ((char *) data + data->parameters) + ")";
+ break;
+ }
+ case XINE_MSG_AUDIO_OUT_UNAVAILABLE:
+ {
+ message = i18n("Audio output unavailable. Device is busy. ");
+ if(data->explanation)
+ message = message + "(" + ((char *) data + data->parameters) + ")";
+ break;
+ }
+ case XINE_MSG_CONNECTION_REFUSED:
+ {
+ message = i18n("The connection was refused.\nCheck the host name. ");
+ if(data->explanation)
+ message = message + "(" + ((char *) data + data->parameters) + ")";
+ break;
+ }
+ case XINE_MSG_FILE_NOT_FOUND:
+ {
+ message = "@"+i18n("The specified file or url was not found. Please check it. ");
+ if(data->explanation)
+ message = message + "(" + QString::fromLocal8Bit((char *) data + data->parameters) + ")";
+ break;
+ }
+ case XINE_MSG_PERMISSION_ERROR:
+ {
+ message = i18n("Permission to this source was denied. ");
+ // if(data->explanation)
+ message = message + "(" + ((char *) data + data->parameters) + ")";
+ break;
+ }
+ case XINE_MSG_READ_ERROR:
+ {
+ message = i18n("The source can't be read.\nMaybe you don't have enough rights for this, or source doesn't contain data (e.g: no disc in drive). ");
+ if(data->explanation)
+ message = message + "(" + ((char *) data + data->parameters) + ")";
+ debugOut(message);
+ return; // This error is handled by autoinstallation
+ }
+ case XINE_MSG_LIBRARY_LOAD_ERROR:
+ {
+ message = i18n("A problem occur while loading a library or a decoder: ");
+ if(data->explanation)
+ message = message + ((char *) data + data->parameters);
+ break;
+ }
+ case XINE_MSG_ENCRYPTED_SOURCE:
+ {
+ message = i18n("The source seems encrypted, and can't be read. ");
+ if (vw->m_trackURL.contains("dvd:/"))
+ {
+ if (KaffeinePart::installDistroCodec(vw, "xine-engine", "dvdcss"))
+ return;
+ message = message + i18n("\nYour DVD is probably crypted. According to your country laws, you can or can't use libdvdcss to be able to read this disc. ");
+ }
+ if(data->explanation)
+ message = message + "(" + ((char *) data + data->parameters) + ")";
+ break;
+ }
+ default:
+ {
+ message = i18n("Unknown error: \n");
+ if(data->explanation)
+ message = message + ((char *) data + data->explanation) + " " + ((char *) data + data->parameters);
+ break;
+ }
+ }
+
+ vw->m_xineMessage = message;
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_NEW_XINE_MESSAGE));
+ break;
+ }
+ default:
+ {
+ //debugOut("xine event: unhandled type ");
+ break;
+ }
+ }
+}
+
+void KXineWidget::timerEvent( QTimerEvent* tevent )
+{
+ switch ( tevent->timerId() )
+ {
+ case TIMER_EVENT_PLAYBACK_FINISHED:
+ {
+ if ( !TimeShiftFilename.isEmpty() )
+ {
+ QTimer::singleShot(0, this, SLOT(slotPlayTimeShift()));
+ break;
+ }
+ if ( m_trackURL=="DVB" || m_trackURL.contains(".kaxtv") )
+ break;
+
+#ifdef XINE_PARAM_GAPLESS_SWITCH
+ if ( xine_check_version(1,1,1) )
+ xine_set_param( m_xineStream, XINE_PARAM_GAPLESS_SWITCH, 1);
+#endif
+ if (isQueueEmpty())
+ {
+ if (m_trackURL != m_logoFile)
+ emit signalPlaybackFinished();
+ else
+ xine_stop(m_xineStream);
+ }
+ else
+ QTimer::singleShot(0, this, SLOT(slotPlay()));
+ break;
+ }
+ case TIMER_EVENT_NEW_CHANNELS:
+ {
+ emit signalNewChannels(m_audioCh, m_subCh, m_currentAudio, m_currentSub);
+ break;
+ }
+ case TIMER_EVENT_NEW_TITLE:
+ {
+ emit signalTitleChanged();
+ break;
+ }
+ case TIMER_EVENT_FRAME_FORMAT_CHANGE:
+ {
+ if ((m_trackHasVideo) && (m_trackURL != m_logoFile))
+ emit signalVideoSizeChanged();
+ break;
+ }
+ case TIMER_EVENT_NEW_STATUS:
+ {
+ emit signalXineStatus(m_statusString);
+ break;
+ }
+ case TIMER_EVENT_CHANGE_CURSOR:
+ {
+ if (m_DVDButtonEntered)
+ setCursor(QCursor(Qt::PointingHandCursor));
+ else
+ setCursor(QCursor(Qt::ArrowCursor));
+ break;
+ }
+ case TIMER_EVENT_NEW_MRL_REFERENCE:
+ {
+ m_queue.prepend(m_newMRLReference );
+ break;
+ }
+ case TIMER_EVENT_NEW_VOLUME_LEVEL:
+ {
+ emit signalSyncVolume();
+ break;
+ }
+ case TIMER_EVENT_NEW_XINE_MESSAGE:
+ {
+ if (!m_recentMessagesTimer.isActive())
+ {
+ m_recentMessagesTimer.start(1500);
+ emit signalXineMessage(m_xineMessage);
+ }
+ else
+ {
+ //restart
+ warningOut(QString("Message: '%1' was blocked!").arg(m_xineMessage));
+ m_recentMessagesTimer.start(1500);
+ }
+ break;
+ }
+ case TIMER_EVENT_NEW_XINE_ERROR:
+ {
+ emit signalXineError(m_xineError);
+ break;
+ }
+ case TIMER_EVENT_RESTART_PLAYBACK:
+ {
+ appendToQueue(m_trackURL);
+ slotPlay();
+ break;
+ }
+ case TIMER_EVENT_RESIZE_PARENT:
+ {
+ parentWidget()->resize(m_newParentSize);
+ break;
+ }
+ default: break;
+ }
+}
+
+void KXineWidget::slotNoRecentMessage()
+{
+ m_recentMessagesTimer.stop();
+}
+
+/******************* new video driver *********************/
+
+void KXineWidget::videoDriverChangedCallback(void* p, xine_cfg_entry_t* entry)
+{
+ if (p == NULL) return;
+ if (entry == NULL) return;
+#ifndef USE_QT_ONLY
+ KXineWidget* vw = (KXineWidget*) p;
+ xine_video_port_t* oldVideoDriver = vw->m_videoDriver;
+ xine_video_port_t* noneVideoDriver;
+
+ int pos, time, length;
+
+ debugOut(QString("New video driver: %1").arg(entry->enum_values[entry->num_value]));
+
+ if (vw->m_osd)
+ {
+ xine_osd_free(vw->m_osd);
+ vw->m_osd = NULL;
+ }
+
+ noneVideoDriver = xine_open_video_driver(vw->m_xineEngine, "none",
+ XINE_VISUAL_TYPE_NONE, NULL);
+ if (!noneVideoDriver)
+ {
+ errorOut("Can't init Video Driver 'none', operation aborted.");
+ return;
+ }
+
+ bool playing = false;
+ if (vw->isPlaying())
+ {
+ playing = true;
+ vw->m_savedPos = 0;
+
+ int t = 0, ret = 0;
+ while(((ret = xine_get_pos_length(vw->m_xineStream, &pos, &time, &length)) == 0) && (++t < 5))
+ xine_usec_sleep(100000);
+
+ if ( ret != 0 )
+ vw->m_savedPos = pos;
+ }
+
+ xine_close(vw->m_xineStream);
+
+ /* wire filters to "none" driver so the old one can be safely disposed */
+ vw->m_videoDriver = noneVideoDriver;
+ vw->unwireVideoFilters();
+ vw->wireVideoFilters();
+
+ vw->unwireAudioFilters();
+ if (vw->m_visualPlugin)
+ {
+ debugOut(QString("Dispose visual plugin: %1").arg(vw->m_visualPluginName));
+ delete vw->m_visualPlugin;
+ vw->m_visualPlugin = NULL;
+ }
+
+ xine_event_dispose_queue(vw->m_eventQueue);
+ xine_dispose(vw->m_xineStream);
+
+ xine_close_video_driver(vw->m_xineEngine, oldVideoDriver);
+
+ vw->m_videoDriver = xine_open_video_driver(vw->m_xineEngine,
+#ifndef HAVE_XCB
+ entry->enum_values[entry->num_value], XINE_VISUAL_TYPE_X11,
+#else
+ entry->enum_values[entry->num_value], XINE_VISUAL_TYPE_XCB,
+#endif
+ (void *) &(vw->m_x11Visual));
+
+ if (!vw->m_videoDriver)
+ {
+ vw->m_xineError = i18n("Error: Can't init new Video Driver %1 - using %2!").arg(entry->enum_values[entry->num_value]).arg(vw->m_videoDriverName);
+ QApplication::postEvent(vw, new QTimerEvent( TIMER_EVENT_NEW_XINE_ERROR));
+ playing = false;
+ vw->m_videoDriver = xine_open_video_driver(vw->m_xineEngine,
+#ifndef HAVE_XCB
+ vw->m_videoDriverName.ascii(), XINE_VISUAL_TYPE_X11,
+#else
+ vw->m_videoDriverName.ascii(), XINE_VISUAL_TYPE_XCB,
+#endif
+ (void *) &(vw->m_x11Visual));
+ }
+ else
+ {
+ vw->m_videoDriverName = entry->enum_values[entry->num_value];
+ vw->m_statusString = i18n("Using Video Driver: %1").arg(vw->m_videoDriverName);
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_NEW_STATUS));
+ }
+
+ vw->m_xineStream = xine_stream_new(vw->m_xineEngine, vw->m_audioDriver, vw->m_videoDriver);
+ vw->m_eventQueue = xine_event_new_queue (vw->m_xineStream);
+ xine_event_create_listener_thread(vw->m_eventQueue, &KXineWidget::xineEventListener, p);
+
+ /* rewire filters to the new driver */
+ vw->unwireVideoFilters();
+ vw->wireVideoFilters();
+
+ /* "none" can now be disposed too */
+ xine_close_video_driver(vw->m_xineEngine, noneVideoDriver);
+
+ vw->initOSD();
+
+ if (playing)
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_RESTART_PLAYBACK));
+#endif
+}
+
+/*********************** new audio driver *************************/
+
+void KXineWidget::audioDriverChangedCallback(void* p, xine_cfg_entry_t* entry)
+{
+ if (p == NULL) return;
+ if (entry == NULL) return;
+#ifndef USE_QT_ONLY
+ KXineWidget* vw = (KXineWidget*) p;
+
+ int pos, time, length;
+
+ debugOut(QString("New audio driver: %1").arg(entry->enum_values[entry->num_value]));
+
+ if (vw->m_osd)
+ {
+ xine_osd_free(vw->m_osd);
+ vw->m_osd = NULL;
+ }
+
+ vw->unwireVideoFilters();
+
+ bool playing = false;
+ if (vw->isPlaying())
+ {
+ playing = true;
+ vw->m_savedPos = 0;
+
+ int t = 0, ret = 0;
+ while(((ret = xine_get_pos_length(vw->m_xineStream, &pos, &time, &length)) == 0) && (++t < 5))
+ xine_usec_sleep(100000);
+
+ if ( ret != 0 )
+ vw->m_savedPos = pos;
+ }
+
+ xine_close(vw->m_xineStream);
+
+ vw->unwireAudioFilters();
+ if (vw->m_visualPlugin)
+ {
+ debugOut(QString("Dispose visual plugin: %1").arg(vw->m_visualPluginName));
+ delete vw->m_visualPlugin;
+ vw->m_visualPlugin = NULL;
+ }
+
+ xine_event_dispose_queue(vw->m_eventQueue);
+ xine_dispose(vw->m_xineStream);
+ xine_close_audio_driver(vw->m_xineEngine, vw->m_audioDriver);
+ vw->m_audioDriver = NULL;
+
+ vw->m_audioDriver = xine_open_audio_driver(vw->m_xineEngine, entry->enum_values[entry->num_value], NULL);
+
+ if (!vw->m_audioDriver)
+ {
+ vw->m_xineError = i18n("Error: Can't init new Audio Driver %1 - using %2!").arg(entry->enum_values[entry->num_value]).arg(vw->m_audioDriverName);
+ QApplication::postEvent(vw, new QTimerEvent( TIMER_EVENT_NEW_XINE_ERROR));
+ playing = false;
+ vw->m_audioDriver = xine_open_audio_driver(vw->m_xineEngine, vw->m_audioDriverName.ascii(), NULL);
+ }
+ else
+ {
+ vw->m_audioDriverName = entry->enum_values[entry->num_value];
+ vw->m_statusString = i18n("Using Audio Driver: %1").arg(vw->m_audioDriverName);
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_NEW_STATUS));
+ }
+
+ vw->m_xineStream = xine_stream_new(vw->m_xineEngine, vw->m_audioDriver, vw->m_videoDriver);
+ vw->m_eventQueue = xine_event_new_queue (vw->m_xineStream);
+ xine_event_create_listener_thread(vw->m_eventQueue, &KXineWidget::xineEventListener, p);
+
+ vw->wireVideoFilters();
+
+ vw->initOSD();
+
+ if (playing)
+ QApplication::postEvent(vw, new QTimerEvent(TIMER_EVENT_RESTART_PLAYBACK));
+#endif
+}
+
+/******** change audio mixer method ****************/
+void KXineWidget::audioMixerMethodChangedCallback(void* p, xine_cfg_entry_t* entry)
+{
+ if (p == NULL) return;
+ KXineWidget* vw = (KXineWidget*) p;
+
+ vw->m_softwareMixer = (bool)entry->num_value;
+}
+
+/******** Callback for OSD configuration ****************/
+void KXineWidget::showOSDMessagesChangedCallback(void* p, xine_cfg_entry_t* entry)
+{
+ if (p == NULL) return;
+ KXineWidget* vw = (KXineWidget*) p;
+
+ if (vw->m_osd)
+ vw->m_osdShow = (bool)entry->num_value;
+}
+
+void KXineWidget::sizeForOSDMessagesChangedCallback(void* p, xine_cfg_entry_t* entry)
+{
+ if (p == NULL) return;
+ KXineWidget* vw = (KXineWidget*) p;
+
+ const int fontsizetable[] = { 16,20,24,32,48,64 };
+
+ if (entry->num_value >= 6)
+ {
+ debugOut("Font size not defined: Shouldn't have happened");
+ return;
+ }
+
+ if (vw->m_osd)
+ {
+ vw->m_osdSize = entry->num_value;
+ xine_osd_set_font(vw->m_osd, vw->m_osdFont, fontsizetable[vw->m_osdSize]);
+ }
+}
+
+void KXineWidget::fontForOSDMessagesChangedCallback(void* p, xine_cfg_entry_t* entry)
+{
+ if (p == NULL) return;
+ KXineWidget* vw = (KXineWidget*) p;
+
+ const int fontsizetable[] = { 16,20,24,32,48,64 };
+
+ if (vw->m_osd)
+ if (entry->str_value)
+ {
+ free(vw->m_osdFont);
+ vw->m_osdFont = strdup(entry->str_value);
+ if (!xine_osd_set_font(vw->m_osd, vw->m_osdFont, fontsizetable[vw->m_osdSize]))
+ {
+ free(vw->m_osdFont);
+ vw->m_osdFont = strdup("sans");
+ if (!xine_osd_set_font(vw->m_osd, vw->m_osdFont, fontsizetable[vw->m_osdSize]))
+ warningOut("Default SANS font not found: shouldn't have happened.");
+ }
+ }
+}
+
+void KXineWidget::monitorXResChangedCallback(void* p, xine_cfg_entry_t* entry)
+{
+ if (p == NULL) return;
+ KXineWidget* vw = (KXineWidget*) p;
+
+ vw->monitorXRes = (double)entry->num_value;
+ double m_displayRatio = vw->monitorYRes / vw->monitorXRes;
+ if ((m_displayRatio >= 0.98) && (m_displayRatio <= 1.02))
+ m_displayRatio = 1;
+ vw->m_displayRatio = m_displayRatio;
+}
+
+void KXineWidget::monitorYResChangedCallback(void* p, xine_cfg_entry_t* entry)
+{
+ if (p == NULL) return;
+ KXineWidget* vw = (KXineWidget*) p;
+
+ vw->monitorYRes = (double)entry->num_value;
+ double m_displayRatio = vw->monitorYRes / vw->monitorXRes;
+ if ((m_displayRatio >= 0.98) && (m_displayRatio <= 1.02))
+ m_displayRatio = 1;
+ vw->m_displayRatio = m_displayRatio;
+}
+
+/**********************************************
+ * EVENT LOOP
+ *********************************************/
+
+#ifndef HAVE_XCB
+bool KXineWidget::x11Event(XEvent *event)
+{
+ if (isXineReady())
+ if (event->type == Expose)
+ if (event->xexpose.count == 0)
+ xine_port_send_gui_data(m_videoDriver, XINE_GUI_SEND_EXPOSE_EVENT, event);
+
+ return false;
+}
+#else
+void KXineWidget::paintEvent(QPaintEvent *event)
+{
+ if (isXineReady()) {
+ const QRect &rect = event->rect();
+
+ xcb_expose_event_t xcb_event;
+ memset(&xcb_event, 0, sizeof(xcb_event));
+
+ xcb_event.window = winId();
+ xcb_event.x = rect.x();
+ xcb_event.y = rect.y();
+ xcb_event.width = rect.width();
+ xcb_event.height = rect.height();
+ xcb_event.count = 0;
+
+ xine_port_send_gui_data(m_videoDriver, XINE_GUI_SEND_EXPOSE_EVENT, &xcb_event);
+ }
+
+ QWidget::paintEvent(event);
+}
+#endif
+
+/**********************************************************
+ * INIT XINE ENGINE
+ *********************************************************/
+
+void KXineWidget::polish()
+{
+ if ((!m_startXineManual) && (!isXineReady())) /* start xine engine automatically? */
+ {
+ initXine();
+ }
+}
+
+bool KXineWidget::initXine()
+{
+ if (isXineReady())
+ return true;
+
+ emit signalXineStatus(i18n("Init xine..."));
+ globalPosChanged(); /* get global pos of the window */
+
+ /**** INIT XINE DISPLAY ****/
+
+#ifndef HAVE_XCB
+ XInitThreads();
+
+ connection = XOpenDisplay(NULL);
+#else
+ int screen_nbr = 0;
+ connection = xcb_connect(NULL, &screen_nbr);
+#endif
+
+ if (!connection)
+ {
+ emit signalXineFatal(i18n("Failed to connect to X-Server!"));
+ return false;
+ }
+
+ int m_xineWindow = winId();
+
+/* // determine display aspect ratio
+ double resHor = ((double) DisplayWidth(x11Display(), x11Screen())) / DisplayWidthMM(x11Display(), x11Screen());
+ double resVer = ((double) DisplayHeight(x11Display(), x11Screen())) / DisplayHeightMM(x11Display(), x11Screen());
+
+ m_displayRatio = resVer / resHor;
+
+ if ((m_displayRatio >= 0.98) && (m_displayRatio <= 1.02))
+ m_displayRatio = 1;
+
+#ifdef HAVE_XINERAMA
+ int dummy_event, dummy_error;
+
+ if (XineramaQueryExtension(x11Display(), &dummy_event, &dummy_error))
+ {
+ int count = 1;
+ debugOut("Xinerama extension present");
+ XineramaQueryScreens(x11Display(), &count);
+ debugOut(QString("%1 screens detected").arg(count));
+ if (count > 1)
+ // multihead -> assuming square pixels
+ m_displayRatio = 1.0;
+ }
+#endif
+
+ debugOut(QString("Display aspect ratio (v/h): %1").arg(m_displayRatio));*/
+
+ /**** INIT XINE ENGINE ****/
+
+ debugOut(QString("Using xine version %1").arg(xine_get_version_string()));
+
+ m_xineEngine = xine_new();
+ if (!m_xineEngine)
+ {
+ emit signalXineFatal(i18n("Can't init xine Engine!"));
+ return false;
+ }
+
+ if (m_xineVerbose)
+ xine_engine_set_param(m_xineEngine, XINE_ENGINE_PARAM_VERBOSITY, 99);
+
+ /* load configuration */
+
+ if (!QFile::exists(m_configFilePath))
+ warningOut("No config file found, will create one...");
+ else
+ xine_config_load(m_xineEngine, QFile::encodeName(m_configFilePath));
+
+
+ debugOut("Post-init xine engine");
+ xine_init(m_xineEngine);
+
+ /** set xine parameters **/
+
+ const char* const* drivers = NULL;
+ drivers = xine_list_audio_output_plugins(m_xineEngine);
+ int i = 0;
+ while (drivers[i] != NULL) i++;
+ m_audioChoices = new char*[i+2];
+ m_audioChoices[0] = strdup("auto");
+ m_audioDriverList << m_audioChoices[0];
+ i = 0;
+ while(drivers[i])
+ {
+ m_audioChoices[i+1] = strdup(drivers[i]);
+ m_audioDriverList << m_audioChoices[i+1];
+ i++;
+ }
+ m_audioChoices[i+1] = NULL;
+
+ m_audioInfo = strdup(i18n("Audiodriver to use (default: auto)").local8Bit());
+ i = xine_config_register_enum(m_xineEngine, "audio.driver", 0,
+ m_audioChoices, m_audioInfo, NULL, 10, &KXineWidget::audioDriverChangedCallback, this);
+
+ if (m_audioDriverList.contains(m_preferedAudio))
+ m_audioDriverName = m_preferedAudio;
+ else
+ m_audioDriverName = m_audioChoices[i];
+
+ debugOut(QString("Use audio driver %1").arg(m_audioDriverName));
+
+ drivers = xine_list_video_output_plugins(m_xineEngine);
+ i = 0;
+ while (drivers[i] != NULL) i++;
+ m_videoChoices = new char*[i+2];
+ m_videoChoices[0] = strdup("auto");
+ m_videoDriverList << m_videoChoices[0];
+ i = 0;
+ while(drivers[i])
+ {
+ m_videoChoices[i+1] = strdup(drivers[i]);
+ m_videoDriverList << m_videoChoices[i+1];
+ i++;
+ }
+ m_videoChoices[i+1] = NULL;
+
+ m_videoInfo = strdup(i18n("Videodriver to use (default: auto)").local8Bit());
+ i = xine_config_register_enum(m_xineEngine, "video.driver", 0,
+ m_videoChoices, m_videoInfo, NULL, 10, &KXineWidget::videoDriverChangedCallback, this);
+
+ if (m_videoDriverList.contains(m_preferedVideo))
+ m_videoDriverName = m_preferedVideo;
+ else
+ m_videoDriverName = m_videoChoices[i];
+
+ debugOut(QString("Use video driver %1").arg(m_videoDriverName));
+
+ m_mixerInfo = strdup(i18n("Use software audio mixer").local8Bit());
+ m_softwareMixer = (bool)xine_config_register_bool(m_xineEngine, "audio.mixer_software", 1, m_mixerInfo,
+ NULL, 10, &KXineWidget::audioMixerMethodChangedCallback, this);
+
+ m_osdShowInfo = strdup(i18n("Show OSD Messages").local8Bit());
+ m_osdShow = (bool)xine_config_register_bool(m_xineEngine, "osd.osd_messages", 1, m_osdShowInfo,
+ NULL, 10, &KXineWidget::showOSDMessagesChangedCallback, this);
+
+ m_osdSizeOptions = new char*[7];
+ m_osdSizeOptions[0] = strdup("tiny");
+ m_osdSizeOptions[1] = strdup("small");
+ m_osdSizeOptions[2] = strdup("medium");
+ m_osdSizeOptions[3] = strdup("large");
+ m_osdSizeOptions[4] = strdup("very large");
+ m_osdSizeOptions[5] = strdup("huge");
+ m_osdSizeOptions[6] = NULL;
+
+ m_osdSizeInfo = strdup(i18n("Size of OSD text").local8Bit());
+ m_osdSize = (int)xine_config_register_enum(m_xineEngine, "osd.osd_size", 1 /*small - 20P*/, m_osdSizeOptions, m_osdSizeInfo,
+ NULL, 10, &KXineWidget::sizeForOSDMessagesChangedCallback, this);
+
+ m_osdFontInfo = strdup(i18n("Font for OSD Messages").local8Bit());
+ m_osdFont = strdup((char*)xine_config_register_string(m_xineEngine, "osd.osd_font", "sans", m_osdFontInfo,
+ NULL, 10, &KXineWidget::fontForOSDMessagesChangedCallback, this));
+
+ xResInfo = strdup(i18n("Monitor horizontal resolution (dpi).").local8Bit());
+ monitorXRes = (bool)xine_config_register_range(m_xineEngine, "video.screen_x_res", 78, 1, 200, xResInfo,
+ NULL, 10, &KXineWidget::monitorXResChangedCallback, this);
+ yResInfo = strdup(i18n("Monitor vertical resolution (dpi).").local8Bit());
+ monitorYRes = (bool)xine_config_register_range(m_xineEngine, "video.screen_y_res", 78, 1, 200, yResInfo,
+ NULL, 10, &KXineWidget::monitorYResChangedCallback, this);
+
+ double resHor = (double)monitorXRes;
+ double resVer = (double)monitorYRes;
+ m_displayRatio = resVer / resHor;
+ if ((m_displayRatio >= 0.98) && (m_displayRatio <= 1.02))
+ m_displayRatio = 1;
+
+ /* init video driver */
+ debugOut("Init video driver");
+
+#ifndef HAVE_XCB
+ m_x11Visual.display = connection;
+ m_x11Visual.screen = DefaultScreen(connection);
+ m_x11Visual.d = m_xineWindow;
+#else
+ xcb_screen_iterator_t screen_it = xcb_setup_roots_iterator(xcb_get_setup(connection));
+ while ((screen_it.rem > 1) && (screen_nbr > 0)) {
+ xcb_screen_next(&screen_it);
+ --screen_nbr;
+ }
+
+ m_x11Visual.connection = connection;
+ m_x11Visual.screen = screen_it.data;
+ m_x11Visual.window = m_xineWindow;
+#endif
+ m_x11Visual.dest_size_cb = &KXineWidget::destSizeCallback;
+ m_x11Visual.frame_output_cb = &KXineWidget::frameOutputCallback;
+ m_x11Visual.user_data = (void*)this;
+
+ m_videoDriver = xine_open_video_driver(m_xineEngine,
+#ifndef HAVE_XCB
+ m_videoDriverName.ascii(), XINE_VISUAL_TYPE_X11,
+#else
+ m_videoDriverName.ascii(), XINE_VISUAL_TYPE_XCB,
+#endif
+ (void *) &(m_x11Visual));
+
+ if (!m_videoDriver && m_videoDriverName != "auto")
+ {
+ emit signalXineError(i18n("Can't init Video Driver '%1' - trying 'auto'...").arg(m_videoDriverName));
+ m_videoDriverName = "auto";
+ m_videoDriver = xine_open_video_driver(m_xineEngine,
+#ifndef HAVE_XCB
+ m_videoDriverName.ascii(), XINE_VISUAL_TYPE_X11,
+#else
+ m_videoDriverName.ascii(), XINE_VISUAL_TYPE_XCB,
+#endif
+ (void *) &(m_x11Visual));
+ }
+
+ if (!m_videoDriver)
+ {
+ emit signalXineFatal(i18n("All Video Drivers failed to initialize!"));
+ return false;
+ }
+
+ /* init audio driver */
+ debugOut("Init audio driver");
+
+ m_audioDriver = xine_open_audio_driver(m_xineEngine, m_audioDriverName.ascii(), NULL);
+
+ if (!m_audioDriver && m_audioDriverName != "auto")
+ {
+ emit signalXineError(i18n("Can't init Audio Driver '%1' - trying 'auto'...").arg(m_audioDriverName));
+ m_audioDriverName = "auto";
+ m_audioDriver = xine_open_audio_driver (m_xineEngine, m_audioDriverName.ascii(), NULL);
+ }
+
+ if (!m_audioDriver)
+ {
+ emit signalXineFatal(i18n("All Audio Drivers failed to initialize!"));
+ return false;
+ }
+
+ //debugOut("Open xine stream");
+
+ m_xineStream = xine_stream_new(m_xineEngine, m_audioDriver, m_videoDriver);
+ if (!m_xineStream)
+ {
+ emit signalXineFatal(i18n("Can't create a new xine Stream!"));
+ return false;
+ }
+
+#ifdef XINE_PARAM_EARLY_FINISHED_EVENT
+ if ( xine_check_version(1,1,1) ) {
+ // enable gapless playback
+ xine_set_param(m_xineStream, XINE_PARAM_EARLY_FINISHED_EVENT, 1 );
+ }
+#endif
+
+ /*** OSD ***/
+
+ initOSD();
+
+ /** event handling **/
+
+ m_eventQueue = xine_event_new_queue (m_xineStream);
+ xine_event_create_listener_thread(m_eventQueue, &KXineWidget::xineEventListener, (void*)this);
+
+ //maybe user closed player in muted state
+ if (m_softwareMixer)
+ xine_set_param(m_xineStream, XINE_PARAM_AUDIO_AMP_MUTE, 0);
+ else
+ xine_set_param(m_xineStream, XINE_PARAM_AUDIO_MUTE, 0);
+
+ m_xineReady = true;
+
+ debugOut("xine init successful");
+
+ emit signalXineStatus(i18n("Ready"));
+ emit signalXineReady();
+
+ /** something to play? **/
+ slotPlay();
+
+ return true;
+}
+
+void KXineWidget::initOSD()
+{
+ debugOut("Init OSD");
+ const int fontsizetable[] = { 16,20,24,32,48,64 };
+ m_osd = xine_osd_new(m_xineStream, 10, 10, 1000, 200);
+ if (m_osd)
+ {
+ if (!xine_osd_set_font(m_osd, m_osdFont, fontsizetable[m_osdSize]))
+ {
+ debugOut(QString("Font ->%1<- specified for OSD doesn't exists.").arg(m_osdFont));
+ free(m_osdFont);
+ m_osdFont = strdup("sans");
+ xine_osd_set_font(m_osd, m_osdFont, fontsizetable[m_osdSize]);
+ }
+ debugOut(QString("Font for OSD: %1").arg(m_osdFont));
+ xine_osd_set_text_palette(m_osd, XINE_TEXTPALETTE_WHITE_BLACK_TRANSPARENT, XINE_OSD_TEXT1);
+ m_osdUnscaled = (xine_osd_get_capabilities(m_osd) & XINE_OSD_CAP_UNSCALED);
+ if (m_osdUnscaled)
+ debugOut("Unscaled OSD available");
+ }
+ else
+ warningOut("Initialisation of xine OSD failed.");
+}
+
+/************************************************
+ * PLAY MRL
+ ************************************************/
+
+bool KXineWidget::playDvb()
+{
+#ifndef USE_QT_ONLY
+ unwireAudioFilters();
+
+ QPtrList<PostFilter> activeList;
+
+ if (m_audioFilterList.count() && m_audioFiltersEnabled)
+ activeList = m_audioFilterList;
+
+ if ( !dvbHaveVideo )
+ {
+ if (!m_visualPlugin)
+ {
+ debugOut(QString("Init visual plugin: %1").arg(m_visualPluginName));
+ m_visualPlugin = new PostFilter(m_visualPluginName, m_xineEngine, m_audioDriver, m_videoDriver, NULL);
+ }
+
+ activeList.insert (0, m_visualPlugin);
+ }
+ else
+ {
+ if (m_visualPlugin)
+ {
+ debugOut(QString("Dispose visual plugin: %1").arg(m_visualPluginName));
+ delete m_visualPlugin;
+ m_visualPlugin = NULL;
+ }
+ }
+
+ if (activeList.count())
+ {
+ xine_post_wire_audio_port(activeList.at(activeList.count()-1)->getOutput(), m_audioDriver);
+
+ for (uint i = activeList.count()-1; i >0; i--)
+ {
+ xine_post_wire(activeList.at(i-1)->getOutput(), activeList.at(i)->getInput());
+ }
+
+ xine_post_wire( xine_get_audio_source(m_xineStream), activeList.at(0)->getInput());
+ }
+#endif
+
+ if (!xine_play(m_xineStream, 0,0))
+ {
+ sendXineError();
+ return false;
+ }
+
+ m_currentSpeed = Normal;
+ m_trackHasChapters = false;
+ m_trackArtist = QString::null;
+ m_trackAlbum = QString::null;
+ m_trackNumber = QString::null;
+ m_trackYear = QString::null;
+ m_trackComment = QString::null;
+
+ m_trackIsSeekable = false;
+
+ if ( !dvbHaveVideo ) m_trackHasVideo = false;
+ else m_trackHasVideo = (bool)xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_VIDEO);
+ if (m_trackHasVideo)
+ {
+ m_trackVideoCodec = xine_get_meta_info(m_xineStream, XINE_META_INFO_VIDEOCODEC);
+ m_videoFrameWidth = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_WIDTH);
+ m_videoFrameHeight = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_HEIGHT);
+ m_trackVideoBitrate = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_BITRATE);
+ }
+ else
+ {
+ m_trackVideoCodec = QString::null;
+ m_videoFrameWidth = 0;
+ m_videoFrameHeight = 0;
+ m_trackVideoBitrate = 0;
+ }
+
+ m_trackHasAudio = (bool)xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_AUDIO);
+ if (m_trackHasAudio)
+ {
+ m_trackAudioCodec = xine_get_meta_info(m_xineStream, XINE_META_INFO_AUDIOCODEC);
+ m_trackAudioBitrate = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_AUDIO_BITRATE);
+ }
+ else
+ {
+ m_trackAudioCodec = QString::null;
+ m_trackAudioBitrate = 0;
+ }
+
+ m_trackLength = getLengthInfo();
+
+ slotSetAudioChannel(0); //refresh channel info
+ m_posTimer.start(1000);
+
+ emit signalXinePlaying();
+ emit signalXineStatus(i18n("Playing"));
+
+ return true;
+}
+
+#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+#define rgb2yuv(R,G,B) ((((((66*R+129*G+25*B+128)>>8)+16)<<8)|(((112*R-94*G-18*B+128)>>8)+128))<<8|(((-38*R-74*G+112*B+128)>>8)+128))
+#else
+#define rgb2yuv(R,G,B) (((((((-38*R-74*G+112*B+128)>>8)+128)<<8)|(((112*R-94*G-18*B+128)>>8)+128))<<8|(((66*R+129*G+25*B+128)>>8)+16))<<8)
+#endif
+
+void KXineWidget::initDvbPalette()
+{
+ if ( dvbColor[0] ) return;
+
+ memset( dvbColor, 0, sizeof(dvbColor) );
+ memset( dvbTrans, 0, sizeof(dvbTrans) );
+ dvbColor[0]=1;
+
+ unsigned int blueText[11] = {
+ rgb2yuv(0,0,0), /* 0 : not used */
+ rgb2yuv(0,0,0), /* 1 : font bg */
+ rgb2yuv(10,50,40), /* 2 : transition bg->border */
+ rgb2yuv(30,100,85), /* 3 */
+ rgb2yuv(50,150,130), /* 4 */
+ rgb2yuv(70,200,175), /* 5 */
+ rgb2yuv(90,255,220), /* 6 : border */
+ rgb2yuv(90,255,220), /* 7 : transition border->fg */
+ rgb2yuv(90,255,220), /* 8 */
+ rgb2yuv(90,255,220), /* 9 */
+ rgb2yuv(90,255,220), /* 10 : font fg */
+ };
+ unsigned int whiteText[11] = {
+ rgb2yuv(0,0,0),
+ rgb2yuv(0,0,0),
+ rgb2yuv(50,50,50),
+ rgb2yuv(100,100,100),
+ rgb2yuv(150,150,150),
+ rgb2yuv(200,200,200),
+ rgb2yuv(255,255,255),
+ rgb2yuv(255,255,255),
+ rgb2yuv(255,255,255),
+ rgb2yuv(255,255,255),
+ rgb2yuv(255,255,255),
+ };
+ unsigned int greenText[11] = {
+ rgb2yuv(0,0,0),
+ rgb2yuv(0,0,0),
+ rgb2yuv(30,50,30),
+ rgb2yuv(60,100,30),
+ rgb2yuv(90,150,90),
+ rgb2yuv(120,200,120),
+ rgb2yuv(150,255,150),
+ rgb2yuv(150,255,150),
+ rgb2yuv(150,255,150),
+ rgb2yuv(150,255,150),
+ rgb2yuv(150,255,150),
+ };
+ unsigned char textAlpha[11] = { 0, 8, 9, 10, 11, 12, 13, 14, 15, 15, 15, };
+#define DVB_TEXT_WHITE 100
+#define DVB_TEXT_BLUE 111
+#define DVB_TEXT_GREEN 122
+ int a;
+ for ( a=DVB_TEXT_BLUE; a<DVB_TEXT_BLUE+11; a++ )
+ {
+ dvbColor[a]=blueText[a-DVB_TEXT_BLUE];
+ dvbTrans[a]=textAlpha[a-DVB_TEXT_BLUE];
+ }
+ for ( a=DVB_TEXT_GREEN; a<DVB_TEXT_GREEN+11; a++ )
+ {
+ dvbColor[a]=greenText[a-DVB_TEXT_GREEN];
+ dvbTrans[a]=textAlpha[a-DVB_TEXT_GREEN];
+ }
+ for ( a=DVB_TEXT_WHITE; a<DVB_TEXT_WHITE+11; a++ )
+ {
+ dvbColor[a]=whiteText[a-DVB_TEXT_WHITE];
+ dvbTrans[a]=textAlpha[a-DVB_TEXT_WHITE];
+ }
+#define DVB_COLOR_RED 200
+ dvbColor[DVB_COLOR_RED] = rgb2yuv(255,0,0); dvbTrans[DVB_COLOR_RED] = 15;
+#define DVB_COLOR_GREEN 201
+ dvbColor[DVB_COLOR_GREEN] = rgb2yuv(0,255,0); dvbTrans[DVB_COLOR_GREEN] = 15;
+#define DVB_COLOR_MAGENTA 202
+ dvbColor[DVB_COLOR_MAGENTA] = rgb2yuv(255,128,255); dvbTrans[DVB_COLOR_MAGENTA] = 15;
+#define DVB_COLOR_BAR 203
+ dvbColor[DVB_COLOR_BAR] = rgb2yuv(255,128,0); dvbTrans[DVB_COLOR_BAR] = 8;
+}
+
+void getOSDLine( xine_osd_t *osd, int w, QCString &dest, QCString &source )
+{
+ int prevPos, pos, tw, th;
+ bool wrap=false;
+
+ pos = source.find(" ");
+ if ( pos==-1 ) {
+ dest = source;
+ source = "";
+ return;
+ }
+ prevPos = pos;
+ dest = source.left( pos );
+ while ( !wrap ) {
+ xine_osd_get_text_size( osd, dest, &tw, &th );
+ if ( tw>w ) {
+ wrap = true;
+ break;
+ }
+ if ( pos==-1 )
+ break;
+ prevPos = pos;
+ pos = source.find(" ",pos+1);
+ dest = source.left( pos );
+ }
+ if ( wrap ) {
+ dest = source.left( prevPos );
+ source = source.right( source.length()-dest.length()-1 );
+ }
+ else {
+ dest = source;
+ source = "";
+ }
+}
+
+void KXineWidget::dvbShowOSD()
+{
+ if ( m_trackURL!="DVB" )
+ return;
+
+ if ( xine_get_status(m_xineStream)!=XINE_STATUS_PLAY )
+ return;
+
+ if ( !dvbHaveVideo )
+ m_trackHasVideo = false;
+ else
+ m_trackHasVideo = (bool)xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_VIDEO);
+
+ if (m_trackHasVideo) {
+ m_trackVideoCodec = xine_get_meta_info(m_xineStream, XINE_META_INFO_VIDEOCODEC);
+ m_videoFrameWidth = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_WIDTH);
+ m_videoFrameHeight = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_HEIGHT);
+ m_trackVideoBitrate = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_BITRATE);
+ }
+ else {
+ m_trackVideoCodec = QString::null;
+ m_videoFrameWidth = 0;
+ m_videoFrameHeight = 0;
+ m_trackVideoBitrate = 0;
+ }
+
+ m_trackHasAudio = (bool)xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_AUDIO);
+ if (m_trackHasAudio) {
+ m_trackAudioCodec = xine_get_meta_info(m_xineStream, XINE_META_INFO_AUDIOCODEC);
+ m_trackAudioBitrate = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_AUDIO_BITRATE);
+ }
+ else {
+ m_trackAudioCodec = QString::null;
+ m_trackAudioBitrate = 0;
+ }
+
+ if ( dvbOSD ) {
+ xine_osd_free( dvbOSD );
+ dvbOSD = 0;
+ }
+
+ int border=40;
+ int w = m_videoFrameWidth;
+ int h = m_videoFrameHeight;
+ if ( !w || !h )
+ return;
+ if ( w<800 ) {
+ if ( dvbCurrentNext[0]=="E" ) {
+ dvbOSDHideTimer.stop();
+ dvbOSD = xine_osd_new( m_xineStream, border, border, w-(2*border), h-(2/border) );
+ }
+ else
+ dvbOSD = xine_osd_new( m_xineStream, border, h-border-100, w-(2*border), 100 );
+ }
+ if ( dvbOSD ) {
+ QCString ct, cs;
+ if ( !dvbColor[0] ) initDvbPalette();
+ xine_osd_set_palette( dvbOSD, dvbColor, dvbTrans );
+ xine_osd_set_font( dvbOSD, m_osdFont, 16 );
+ xine_osd_set_encoding( dvbOSD, "utf-8" );
+ if ( dvbCurrentNext[0]=="E" )
+ xine_osd_draw_rect( dvbOSD, 0, 0, w-(2*border), h-(2*border), DVB_TEXT_WHITE+1, 1 );
+ else
+ xine_osd_draw_rect( dvbOSD, 0, 0, w-(2*border), 100, DVB_TEXT_WHITE+1, 1 );
+ QString t = QTime::currentTime().toString( "hh:mm" );
+ int tw, th, len;
+ xine_osd_get_text_size(dvbOSD, t.utf8(), &tw, &th);
+ len = tw;
+ int offset = 5;
+ xine_osd_draw_text( dvbOSD, w-(2*border)-tw-offset, 5, t.utf8(), DVB_TEXT_BLUE );
+ int i;
+ for ( i=0; i<(int)dvbCurrentNext.count(); i++ ) {
+ if ( dvbCurrentNext[i]=="R" ) {
+ xine_osd_draw_rect( dvbOSD, offset, 5, offset+16, 21, DVB_COLOR_RED, 1 );
+ offset+=21;
+ }
+ else if ( dvbCurrentNext[i]=="T" ) {
+ xine_osd_draw_rect( dvbOSD, offset, 5, offset+16, 21, DVB_COLOR_GREEN, 1 );
+ offset+=21;
+ }
+ }
+ if (m_dvbChannelName == "")
+ t = m_trackTitle;
+ else
+ t = m_dvbChannelName;
+
+ i=0;
+ ct = t.utf8();
+ while ( i<(int)t.length() ) {
+ xine_osd_get_text_size( dvbOSD, ct, &tw, &th );
+ if ( tw<=(w-(2*border)-offset-5-len) ) break;
+ ct = ct.remove( ct.length()-1, ct.length() );
+ i++;
+ }
+ xine_osd_draw_text( dvbOSD, offset, 5, ct, DVB_TEXT_BLUE );
+ xine_osd_draw_line( dvbOSD, 5, 10+18, w-(2*border)-5, 10+18, DVB_COLOR_MAGENTA );
+
+ QString s, c;
+ int y=43;
+ int pos;
+ if ( dvbCurrentNext[0]=="E" ) {
+ if ( dvbCurrentNext.count()<2 ) {
+ xine_osd_show( dvbOSD, 0 );
+ return;
+ }
+ if ( !dvbCurrentNext[1].isEmpty() ) {
+ s = dvbCurrentNext[1];
+ pos = s.find("-");
+ c = s.left( pos+1 );
+ s = s.right( s.length()-pos-1 );
+ t = s;
+ xine_osd_draw_text( dvbOSD, 10, y, c.utf8(), DVB_TEXT_GREEN );
+ xine_osd_get_text_size( dvbOSD, c.utf8(), &offset, &th );
+ i=0;
+ cs = s.utf8();
+ while ( i<(int)t.length() ) {
+ ct = cs.remove( cs.length()-i, cs.length() );
+ xine_osd_get_text_size( dvbOSD, ct, &tw, &th );
+ if ( tw<=(w-(2*border)-20-offset) ) break;
+ i++;
+ }
+ xine_osd_draw_text( dvbOSD, 10+offset, y, ct, DVB_TEXT_WHITE );
+ y+= 40;
+ }
+ if ( !dvbCurrentNext[2].isEmpty() ) {
+ cs = dvbCurrentNext[2].utf8();
+ while ( y<(h-(2*border)-23) ) {
+ getOSDLine( dvbOSD, (w-(2*border)-20), ct, cs );
+ xine_osd_draw_text( dvbOSD, 10, y, ct, DVB_TEXT_BLUE );
+ y+= 28;
+ if ( !cs.length() )
+ break;
+ }
+ y+= 40;
+ }
+ if ( !dvbCurrentNext[3].isEmpty() ) {
+ cs = dvbCurrentNext[3].utf8();
+ while ( y<(h-(2*border)-23) ) {
+ getOSDLine( dvbOSD, (w-(2*border)-20), ct, cs );
+ xine_osd_draw_text( dvbOSD, 10, y, ct, DVB_TEXT_WHITE );
+ y+= 28;
+ if ( !cs.length() )
+ break;
+ }
+ }
+ xine_osd_show( dvbOSD, 0 );
+ return;
+ }
+ int bar=-1;
+ int barOffset=0;
+ for ( int j=0; j<(int)dvbCurrentNext.count(); j++ ) {
+ if ( (dvbCurrentNext[ j ]=="T") || (dvbCurrentNext[ j ]=="R") ) continue;
+ if ( dvbCurrentNext[ j ].startsWith("BAR") ) {
+ s = dvbCurrentNext[ j ];
+ s = s.remove("BAR");
+ bar = s.toInt();
+ //fprintf( stderr, "BAR : %d\n", bar );
+ continue;
+ }
+ s = dvbCurrentNext[ j ];
+ pos = s.find("-");
+ c = s.left( pos+1 );
+ s = s.right( s.length()-pos-1 );
+ ct = cs = s.utf8();
+ xine_osd_draw_text( dvbOSD, 10, y, c.utf8(), DVB_TEXT_GREEN );
+ xine_osd_get_text_size( dvbOSD, c.utf8(), &offset, &th );
+ i=0;
+ while ( i<(int)t.length() ) {
+ ct = cs.remove( cs.length()-i, cs.length() );
+ xine_osd_get_text_size( dvbOSD, ct, &tw, &th );
+ if ( tw<=(w-(2*border)-20-offset-35) ) break;
+ i++;
+ }
+ if ( !barOffset )
+ barOffset = tw;
+ xine_osd_draw_text( dvbOSD, 10+offset, y, ct, DVB_TEXT_WHITE );
+ y+= 28;
+ if ( bar>-1 ) {
+ int x1=10+offset+barOffset+10;
+ int x2=w-(2*border)-5;
+ if ( (x1+30)>x2 )
+ x1 = x2 - 30;
+ int x3=x1+((bar*(x2-x1))/100);
+ //fprintf( stderr, "x1=%d - x2=%d - x3=%d\n", x1, x2, x3 );
+ int y1=46;
+ int y2=60;
+ xine_osd_draw_line( dvbOSD, x1, y1, x2, y1, DVB_COLOR_BAR );
+ xine_osd_draw_line( dvbOSD, x1, y2, x2, y2, DVB_COLOR_BAR );
+ xine_osd_draw_line( dvbOSD, x1, y1, x1, y2, DVB_COLOR_BAR );
+ xine_osd_draw_line( dvbOSD, x2, y1, x2, y2, DVB_COLOR_BAR );
+ xine_osd_draw_rect( dvbOSD, x1, y1, x3, y2, DVB_COLOR_BAR, 1 );
+ }
+ }
+ xine_osd_show( dvbOSD, 0 );
+ dvbOSDHideTimer.start( 5000, true );
+ }
+}
+
+void KXineWidget::dvbHideOSD()
+{
+ if ( dvbOSD ) {
+ xine_osd_hide( dvbOSD, 0 );
+ xine_osd_free( dvbOSD );
+ dvbOSD = 0;
+
+ if (m_dvbChannelName != "")
+ m_dvbChannelName = "";
+
+ emit signalDvbOSDHidden();
+ }
+}
+
+void KXineWidget::setDvbCurrentNext( const QString &channelName, const QStringList &list )
+{
+ if ( list[0]=="STOP" ) {
+ dvbHideOSD();
+ return;
+ }
+ dvbCurrentNext = list;
+
+ m_dvbChannelName = channelName;
+
+ QTimer::singleShot( 0, this, SLOT(dvbShowOSD()) );
+}
+
+void KXineWidget::setDvb( const QString &pipeName, const QString &chanName, int haveVideo )
+{
+ m_trackURL = pipeName;
+ m_trackTitle = chanName;
+ dvbHaveVideo = haveVideo;
+}
+
+bool KXineWidget::openDvb()
+{
+ if ( dvbOSD ) {
+ dvbOSDHideTimer.stop();
+ xine_osd_hide( dvbOSD, 0 );
+ xine_osd_free( dvbOSD );
+ dvbOSD = 0;
+ }
+
+ clearQueue();
+ m_lengthInfoTimer.stop();
+ m_posTimer.stop();
+ xine_set_param( m_xineStream, XINE_PARAM_METRONOM_PREBUFFER, 180000);
+ if (!xine_open(m_xineStream, QFile::encodeName(m_trackURL))) {
+ sendXineError();
+ return false;
+ }
+ else fprintf(stderr,"xine pipe opened %s\n", m_trackURL.ascii());
+ m_trackURL = "DVB";
+ emit signalXineStatus(i18n("DVB: opening..."));
+ QTimer::singleShot( 0, this, SLOT(playDvb()) );
+
+ return true;
+}
+
+void KXineWidget::slotPlayTimeShift()
+{
+ m_lengthInfoTimer.stop();
+ m_posTimer.stop();
+ xine_set_param( m_xineStream, XINE_PARAM_METRONOM_PREBUFFER, 0);
+ if (!xine_open(m_xineStream, QFile::encodeName(TimeShiftFilename))) {
+ sendXineError();
+#ifdef XINE_PARAM_GAPLESS_SWITCH
+ if ( xine_check_version(1,1,1) )
+ xine_set_param( m_xineStream, XINE_PARAM_GAPLESS_SWITCH, 0);
+#endif
+ return;
+ }
+ if (!xine_play(m_xineStream, 0,0)) {
+ sendXineError();
+ return;
+ }
+ m_trackIsSeekable = true;
+ m_lengthInfoTimer.start(1000);
+ m_posTimer.start(1000);
+}
+
+bool KXineWidget::unhandledStreamsPresent()
+{
+ unsigned int hasAudio = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_AUDIO);
+ unsigned int hasVideo = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_VIDEO);
+
+ return (hasAudio && !xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_AUDIO_HANDLED)) ||
+ (hasVideo && !xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_HANDLED));
+}
+
+void KXineWidget::slotPlay()
+{
+ if ((!isXineReady()) || (isQueueEmpty()))
+ return;
+
+ if (m_logoFile != NULL && m_trackURL == m_logoFile && isPlaying())
+ return;
+
+ /* dvb */
+ if ( dvbOSD ) {
+ dvbOSDHideTimer.stop();
+ xine_osd_hide( dvbOSD, 0 );
+ xine_osd_free( dvbOSD );
+ dvbOSD = 0;
+ }
+
+ m_lengthInfoTimer.stop();
+ m_posTimer.stop();
+ m_currentSpeed = Normal;
+
+ setCursor(QCursor(Qt::WaitCursor));
+
+ m_trackURL = m_queue.first();
+ m_queue.remove(m_queue.find(m_trackURL));
+
+ if (m_trackURL != m_logoFile)
+ emit signalXineStatus(i18n("Opening..."));
+
+ /* check for external subtitle file or save url */
+ m_trackSubtitleURL = QString::null;
+ m_trackSaveURL = QString::null;
+
+ /*for (int i = 1; i <= m_trackURL.contains('#'); i++) {
+ ref = m_trackURL.section('#', i, i);
+ if (ref.section(':', 0, 0) == "subtitle")
+ m_trackSubtitleURL = ref.section(':', 1);
+ if (ref.section(':', 0, 0) == "save")
+ m_trackSaveURL = ref.section(':', 1);
+ }*/
+
+ QString turl;
+ int pos;
+
+ if ( (pos=m_trackURL.find("#subtitle:"))>-1 ) {
+ turl = m_trackURL.left(pos);
+ m_trackSubtitleURL = m_trackURL.right( m_trackURL.length()-pos );
+ if ( (pos=m_trackSubtitleURL.find("#save:"))>-1 ) {
+ m_trackSaveURL = m_trackSubtitleURL.right( m_trackSubtitleURL.length()-pos );
+ m_trackSubtitleURL = m_trackSubtitleURL.left(pos);
+ }
+ }
+ else if ( (pos=m_trackURL.find("#save:"))>-1 ) {
+ turl = m_trackURL.left(pos);
+ m_trackSaveURL = m_trackURL.right( m_trackURL.length()-pos );
+ }
+ else turl = m_trackURL;
+
+ m_trackSubtitleURL.remove("#subtitle:");
+ m_trackSaveURL.remove("#save:");
+
+ turl = turl.replace( "%", "%25" ).replace( "#", "%23" ).replace( ";", "%3b" ).replace( " ", "%20" );
+ if ( !m_trackSubtitleURL.isEmpty() )
+ turl = turl + "#subtitle:" + m_trackSubtitleURL.replace( "%", "%25" ).replace( "#", "%23" ).replace( ";", "%3b" ).replace( " ", "%20" );
+ if ( !m_trackSaveURL.isEmpty() )
+ turl = turl + "#save:" + m_trackSaveURL.replace( "%", "%25" ).replace( "#", "%23" ).replace( ";", "%3b" ).replace( " ", "%20" );
+ if ( turl.startsWith("/") )
+ turl.prepend("file://");
+
+ debugOut(QString("Playing: %1").arg(turl.local8Bit()));
+
+ xine_set_param( m_xineStream, XINE_PARAM_METRONOM_PREBUFFER, 12000 );
+ if (!xine_open(m_xineStream, QFile::encodeName(turl))) {
+
+ sendXineError();
+ setCursor(QCursor(Qt::ArrowCursor));
+#ifdef XINE_PARAM_GAPLESS_SWITCH
+ if ( xine_check_version(1,1,1) )
+ xine_set_param( m_xineStream, XINE_PARAM_GAPLESS_SWITCH, 0);
+#endif
+ return;
+ }
+
+ if (unhandledStreamsPresent())
+ {
+ errorOut("No codecs to handle media");
+ sendXineError();
+ return;
+ }
+
+ /**** use visualization ? ****/
+#ifndef USE_QT_ONLY
+ unwireAudioFilters();
+ wireAudioFilters();
+#else
+ if ((xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_AUDIO)) &&
+ (!xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_VIDEO)))
+ {
+ if (m_visualPluginName && (!m_xinePost))
+ {
+ debugOut(QString("Init visual plugin: %1").arg(m_visualPluginName));
+ m_xinePost = xine_post_init(m_xineEngine, m_visualPluginName, 0,
+ &m_audioDriver,
+ &m_videoDriver);
+
+ m_postAudioSource = xine_get_audio_source(m_xineStream);
+ m_postInput = (xine_post_in_t*)xine_post_input (m_xinePost, const_cast<char*>("audio in"));
+ xine_post_wire(m_postAudioSource, m_postInput);
+ }
+ }
+ else
+ {
+ if (m_xinePost)
+ {
+ debugOut(QString("Dispose visual plugin: %1").arg(m_visualPluginName));
+ m_postAudioSource = xine_get_audio_source(m_xineStream);
+ xine_post_wire_audio_port(m_postAudioSource, m_audioDriver);
+ xine_post_dispose(m_xineEngine, m_xinePost);
+ m_xinePost = NULL;
+ }
+ }
+#endif
+
+ /*** play ***/
+ int savedPos = m_savedPos;
+ m_savedPos = 0;
+ if (!xine_play(m_xineStream, savedPos, 0))
+ {
+ sendXineError();
+ setCursor(QCursor(Qt::ArrowCursor));
+ return;
+ }
+
+ /* do the stream have chapters ? */
+ m_trackHasChapters = (bool)xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_CHAPTERS);
+
+ /** information requirement **/
+
+ m_trackTitle = QString::null;
+
+ bool currentUtf8Locale;
+ QTextCodec* testUtf8Local = QTextCodec::codecForLocale();
+ if (!strcmp(testUtf8Local->name(),"UTF-8"))
+ currentUtf8Locale = true;
+ else
+ currentUtf8Locale = false;
+
+ QTextCodec *CodecUtf8;
+ CodecUtf8 = QTextCodec::codecForName("UTF-8");
+
+ QString infotag;
+ infotag = QString::fromLatin1(xine_get_meta_info(m_xineStream, XINE_META_INFO_TITLE));
+
+ if (currentUtf8Locale)
+ m_trackTitle = infotag;
+ else
+ m_trackTitle = QString::fromLocal8Bit(infotag.ascii());
+
+ if (CodecUtf8->heuristicContentMatch(infotag.ascii(), infotag.length()) >= 0)
+ m_trackTitle = QString::fromUtf8(infotag.ascii());
+
+ if ((!m_trackTitle.isNull()) && (!m_trackTitle.isEmpty())) /* no meta? */
+ {
+ QString trackArtist=NULL;
+ QString trackAlbum=NULL;
+ QString trackComment=NULL;
+ trackArtist = QString::fromLatin1(xine_get_meta_info(m_xineStream, XINE_META_INFO_ARTIST));
+ trackAlbum = QString::fromLatin1(xine_get_meta_info(m_xineStream, XINE_META_INFO_ALBUM));
+ trackComment = QString::fromLatin1(xine_get_meta_info(m_xineStream, XINE_META_INFO_COMMENT));
+ if (currentUtf8Locale)
+ {
+ m_trackArtist = trackArtist;
+ m_trackAlbum = trackAlbum;
+ m_trackComment = trackComment;
+ }
+ else
+ {
+ m_trackArtist = QString::fromLocal8Bit(trackArtist.ascii());
+ m_trackAlbum = QString::fromLocal8Bit(trackAlbum.ascii());
+ m_trackComment = QString::fromLocal8Bit(trackComment.ascii());
+ }
+ if (CodecUtf8->heuristicContentMatch(trackArtist.ascii(), trackArtist.length()) >= 0)
+ m_trackArtist = QString::fromUtf8(trackArtist.ascii());
+ if (CodecUtf8->heuristicContentMatch(trackAlbum.ascii(), trackAlbum.length()) >= 0)
+ m_trackAlbum = QString::fromUtf8(trackAlbum.ascii());
+ if (CodecUtf8->heuristicContentMatch(trackComment.ascii(), trackComment.length()) >= 0)
+ m_trackComment = QString::fromUtf8(trackComment.ascii());
+
+ m_trackYear = xine_get_meta_info(m_xineStream, XINE_META_INFO_YEAR);
+ m_trackNumber = xine_get_meta_info(m_xineStream, XINE_META_INFO_TRACK_NUMBER);
+ }
+ else
+ {
+ m_trackArtist = QString::null;
+ m_trackAlbum = QString::null;
+ m_trackNumber = QString::null;
+ m_trackYear = QString::null;
+ m_trackComment = QString::null;
+ }
+
+ m_trackHasVideo = (bool)xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_VIDEO);
+ if (m_trackHasVideo)
+ {
+ m_trackVideoCodec = xine_get_meta_info(m_xineStream, XINE_META_INFO_VIDEOCODEC);
+ m_videoFrameWidth = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_WIDTH);
+ m_videoFrameHeight = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_HEIGHT);
+ m_trackVideoBitrate = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_BITRATE);
+ }
+ else
+ {
+ m_trackVideoCodec = QString::null;
+ m_videoFrameWidth = 0;
+ m_videoFrameHeight = 0;
+ m_trackVideoBitrate = 0;
+ }
+
+ m_trackHasAudio = (bool)xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_AUDIO);
+ if (m_trackHasAudio)
+ {
+ m_trackAudioCodec = xine_get_meta_info(m_xineStream, XINE_META_INFO_AUDIOCODEC);
+ m_trackAudioBitrate = xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_AUDIO_BITRATE);
+ }
+ else
+ {
+ m_trackAudioCodec = QString::null;
+ m_trackAudioBitrate = 0;
+ }
+
+ /*** we need a little delay for some meta info ***/
+ QTimer::singleShot(1000, this, SLOT(slotGetInfoDelayed()));
+
+
+ m_trackLength = getLengthInfo();
+ if ((m_trackLength.isNull()) && (m_trackURL != m_logoFile))
+ {
+ debugOut("Wait for valid length information");
+ m_lengthInfoTries = 0;
+ m_lengthInfoTimer.start(1000); /* wait for available track length info */
+ }
+
+ if (m_trackTitle.isNull() || m_trackTitle.isEmpty())
+ {
+ /* no meta info */
+ m_trackTitle = m_trackURL;
+ }
+
+ slotSetAudioChannel(0); //refresh channel info
+ if (m_trackURL != m_logoFile)
+ m_posTimer.start(200);
+ setCursor(QCursor(Qt::ArrowCursor));
+
+ if (m_trackURL != m_logoFile)
+ {
+ emit signalXinePlaying();
+ if (hasSaveURL())
+ emit signalXineStatus(i18n("Recording"));
+ else
+ emit signalXineStatus(i18n("Playing"));
+ }
+}
+
+int KXineWidget::getVideoWidth()
+{
+ return xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_WIDTH);
+}
+
+int KXineWidget::getVideoHeight()
+{
+ return xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_VIDEO_HEIGHT);
+}
+
+void KXineWidget::slotGetInfoDelayed()
+{
+ if (!m_xineStream)
+ return;
+
+ if (m_trackHasVideo)
+ m_trackVideoCodec = xine_get_meta_info(m_xineStream, XINE_META_INFO_VIDEOCODEC);
+ if (m_trackHasAudio)
+ m_trackAudioCodec = xine_get_meta_info(m_xineStream, XINE_META_INFO_AUDIOCODEC);
+}
+
+
+/****** error processing ****/
+
+void KXineWidget::sendXineError()
+{
+ QString error;
+ int errCode = xine_get_error(m_xineStream);
+
+ QString addInfo;
+ QString audioCodec = xine_get_meta_info(m_xineStream, XINE_META_INFO_AUDIOCODEC);
+ QString videoCodec = xine_get_meta_info(m_xineStream, XINE_META_INFO_VIDEOCODEC);
+ if ((!audioCodec.isEmpty()) || (!videoCodec.isEmpty()))
+ {
+ if (!audioCodec.isEmpty())
+ addInfo.append(QString("(") + i18n("Audio Codec") + ": " + audioCodec + ")");
+ if (!videoCodec.isEmpty())
+ addInfo.append(QString("(") + i18n("Video Codec") + ": " + videoCodec + ")");
+ }
+ else
+ addInfo.append(QString("(") + m_trackURL + ")");
+
+ switch (errCode)
+ {
+ case XINE_ERROR_NO_INPUT_PLUGIN:
+ case XINE_ERROR_NO_DEMUX_PLUGIN:
+ {
+ if (m_trackURL.startsWith("dvd:/"))
+ {
+ if (KaffeinePart::installDistroCodec(this, "xine-engine", "dvdcss"))
+ return;
+ }
+ else
+ {
+ if (KaffeinePart::installDistroCodec(this, "xine-engine", "ffmpeg"))
+ return;
+ }
+
+ error = i18n("No plugin found to handle this resource") + " " + addInfo;
+ break;
+ }
+ case XINE_ERROR_DEMUX_FAILED:
+ {
+ error = i18n("Resource seems to be broken") + " (" + m_trackURL + ")";
+ break;
+ }
+ case XINE_ERROR_MALFORMED_MRL:
+ {
+ error = i18n("Requested resource does not exist") + " (" + m_trackURL + ")";
+ break;
+ }
+ case XINE_ERROR_INPUT_FAILED:
+ {
+ error = i18n("Resource can not be opened") + " (" + m_trackURL + ")";
+ break;
+ }
+ default:
+ {
+ if (unhandledStreamsPresent() && KaffeinePart::installDistroCodec(this, "xine-engine", "ffmpeg"))
+ return;
+
+ error = i18n("Generic error") + " (" + m_trackURL + ")";
+ break;
+ }
+ }
+
+ if (isQueueEmpty())
+ {
+ if (m_trackURL != m_logoFile)
+ {
+ emit signalXineStatus(i18n("Error"));
+ emit signalXineError(error);
+ }
+ else
+ errorOut("Can't find/play logo file!");
+ }
+ else
+ {
+ errorOut(error);
+ errorOut(QString("Can't play: %1 - trying next").arg(m_trackURL));
+ QTimer::singleShot(0, this, SLOT(slotPlay()));
+ }
+}
+
+bool KXineWidget::isPlaying() const
+{
+ if (isXineReady())
+ return ((xine_get_status(m_xineStream) == XINE_STATUS_PLAY) && (m_trackURL != m_logoFile));
+ else
+ return false;
+}
+
+QString KXineWidget::getXineLog() const
+{
+ QString logStr;
+ int i = 0;
+ QTextStream ts(&logStr, IO_WriteOnly);
+
+ const char* const* log = xine_get_log(m_xineEngine, /* XINE_LOG_MSG*/ 0);
+ if (log == NULL)
+ return QString();
+
+ while(log[i])
+ {
+ ts << QString::fromLocal8Bit(log[i]);
+ i++;
+ }
+
+ return logStr;
+}
+
+void KXineWidget::showOSDMessage(const QString& message, uint duration, int priority)
+{
+ if ((!m_osd) || (!m_osdShow) || (isHidden()))
+ return;
+
+ static int prevOsdPriority = 0;
+ if (m_osdTimer.isActive() && prevOsdPriority > priority)
+ return;
+ prevOsdPriority = priority;
+
+ //debugOut(QString("OSD: draw text: %1").arg(message));
+ xine_osd_clear(m_osd);
+ xine_osd_draw_text(m_osd, 0, 0, message.local8Bit(), XINE_OSD_TEXT1);
+
+ if (m_osdUnscaled)
+ xine_osd_show_unscaled(m_osd, 0);
+ else
+ xine_osd_show(m_osd, 0);
+
+ m_osdTimer.start(duration);
+}
+
+void KXineWidget::slotOSDHide()
+{
+ xine_osd_hide(m_osd, 0);
+ m_osdTimer.stop();
+}
+
+#ifndef USE_QT_ONLY
+/****************** postprocessing filter management ****************/
+
+QStringList KXineWidget::getVideoFilterNames() const
+{
+ QStringList filters;
+ const char* const* plugins = xine_list_post_plugins_typed(m_xineEngine, XINE_POST_TYPE_VIDEO_FILTER);
+
+ for (int i = 0; plugins[i]; i++)
+ {
+ filters << plugins[i];
+ }
+ return filters;
+}
+
+QStringList KXineWidget::getAudioFilterNames() const
+{
+ QStringList filters;
+ const char* const* plugins = xine_list_post_plugins_typed(m_xineEngine, XINE_POST_TYPE_AUDIO_FILTER);
+
+ for (int i = 0; plugins[i]; i++)
+ {
+ filters << plugins[i];
+ }
+ return filters;
+}
+#endif
+
+void KXineWidget::slotCreateVideoFilter(const QString& name, QWidget* parent)
+{
+#ifndef USE_QT_ONLY
+ unwireVideoFilters();
+
+ PostFilter* filter = new PostFilter(name, m_xineEngine, m_audioDriver, m_videoDriver, parent);
+ connect(filter, SIGNAL(signalDeleteMe(PostFilter*)), this, SLOT(slotDeleteVideoFilter(PostFilter*)));
+ m_videoFilterList.append(filter);
+
+ wireVideoFilters();
+#else
+ parent = parent;
+ warningOut(QString("Not implemented [CreateVideoFilter %1]").arg(name));
+#endif
+}
+
+void KXineWidget::slotCreateAudioFilter(const QString& name, QWidget* parent)
+{
+#ifndef USE_QT_ONLY
+ unwireAudioFilters();
+
+ PostFilter* filter = new PostFilter(name, m_xineEngine, m_audioDriver, m_videoDriver, parent);
+ connect(filter, SIGNAL(signalDeleteMe(PostFilter*)), this, SLOT(slotDeleteAudioFilter(PostFilter*)));
+ m_audioFilterList.append(filter);
+
+ wireAudioFilters();
+#else
+ parent = parent;
+ warningOut(QString("Not implemented [CreateAudioFilter %1]").arg(name));
+#endif
+}
+
+
+void KXineWidget::slotRemoveAllVideoFilters()
+{
+#ifndef USE_QT_ONLY
+ unwireVideoFilters();
+ while (m_videoFilterList.count())
+ m_videoFilterList.removeLast();
+ wireVideoFilters();
+#else
+ warningOut("Not implemented!");
+#endif
+}
+
+void KXineWidget::slotRemoveAllAudioFilters()
+{
+#ifndef USE_QT_ONLY
+ unwireAudioFilters();
+ while (m_audioFilterList.count())
+ m_audioFilterList.removeLast();
+ wireAudioFilters();
+#else
+ warningOut("Not implemented!");
+#endif
+}
+
+void KXineWidget::slotDeleteVideoFilter(PostFilter* filter)
+{
+#ifndef USE_QT_ONLY
+ unwireVideoFilters();
+ m_videoFilterList.remove(filter);
+ wireVideoFilters();
+#else
+ filter = filter;
+ warningOut("Not implemented!");
+#endif
+}
+
+void KXineWidget::slotDeleteAudioFilter(PostFilter* filter)
+{
+#ifndef USE_QT_ONLY
+ unwireAudioFilters();
+ m_audioFilterList.remove(filter);
+ wireAudioFilters();
+#else
+ filter = filter;
+ warningOut("Not implemented!");
+#endif
+}
+
+#ifndef USE_QT_ONLY
+void KXineWidget::unwireVideoFilters()
+{
+ if (m_xineStream && m_videoDriver)
+ xine_post_wire_video_port(xine_get_video_source(m_xineStream), m_videoDriver);
+}
+
+void KXineWidget::wireVideoFilters()
+{
+ if (!m_xineStream)
+ {
+ debugOut("wireVideoFilters() - xine stream not initialized, nothing happend.");
+ return;
+ }
+
+ QPtrList<PostFilter> activeList;
+
+ if (m_videoFilterList.count() && m_videoFiltersEnabled)
+ activeList = m_videoFilterList;
+
+ if (m_deinterlaceFilter && m_deinterlaceEnabled )
+ activeList.insert (0, m_deinterlaceFilter);
+
+ if (activeList.count())
+ {
+ xine_post_wire_video_port(activeList.at(activeList.count()-1)->getOutput(), m_videoDriver);
+
+ for (uint i = activeList.count()-1; i >0; i--)
+ {
+ xine_post_wire(activeList.at( i-1 )->getOutput(), activeList.at(i)->getInput());
+ }
+
+ xine_post_wire( xine_get_video_source(m_xineStream), activeList.at(0)->getInput());
+ }
+}
+
+void KXineWidget::unwireAudioFilters()
+{
+ if (m_xineStream && m_audioDriver)
+ xine_post_wire_audio_port( xine_get_audio_source (m_xineStream), m_audioDriver);
+}
+
+void KXineWidget::wireAudioFilters()
+{
+ if (!m_xineStream)
+ {
+ debugOut("wireAudioFilters() - xine stream not initialized, nothing happend.");
+ return;
+ }
+
+ QPtrList<PostFilter> activeList;
+
+ if (m_audioFilterList.count() && m_audioFiltersEnabled)
+ activeList = m_audioFilterList;
+
+ if ((xine_get_stream_info (m_xineStream, XINE_STREAM_INFO_HAS_AUDIO)) &&
+ (!xine_get_stream_info (m_xineStream, XINE_STREAM_INFO_HAS_VIDEO)) &&
+ m_visualPluginName.ascii())
+ {
+ if (!m_visualPlugin)
+ {
+ debugOut(QString("Init visual plugin: %1").arg(m_visualPluginName));
+ m_visualPlugin = new PostFilter(m_visualPluginName, m_xineEngine, m_audioDriver, m_videoDriver, NULL);
+ }
+
+ activeList.insert (0, m_visualPlugin);
+ }
+ else
+ {
+ if (m_visualPlugin)
+ {
+ debugOut(QString("Dispose visual plugin: %1").arg(m_visualPluginName));
+ delete m_visualPlugin;
+ m_visualPlugin = NULL;
+ }
+ }
+
+ if (activeList.count())
+ {
+ xine_post_wire_audio_port(activeList.at(activeList.count()-1)->getOutput(), m_audioDriver);
+
+ for (uint i = activeList.count()-1; i >0; i--)
+ {
+ xine_post_wire(activeList.at(i-1)->getOutput(), activeList.at(i)->getInput());
+ }
+
+ xine_post_wire( xine_get_audio_source(m_xineStream), activeList.at(0)->getInput());
+ }
+}
+#endif
+
+void KXineWidget::slotEnableVideoFilters(bool enable)
+{
+#ifndef USE_QT_ONLY
+ m_videoFiltersEnabled = enable;
+
+ unwireVideoFilters();
+ wireVideoFilters();
+#else
+ enable = enable;
+ warningOut("Not implemented!");
+#endif
+}
+
+void KXineWidget::slotEnableAudioFilters(bool enable)
+{
+#ifndef USE_QT_ONLY
+ m_audioFiltersEnabled = enable;
+
+ unwireAudioFilters();
+ wireAudioFilters();
+#else
+ enable = enable;
+ warningOut("Not implemented!");
+#endif
+}
+
+#ifndef USE_QT_ONLY
+QStringList KXineWidget::getAudioFilterConfig()
+{
+ QStringList configStrings;
+ for (uint i=0; i<m_audioFilterList.count(); i++)
+ configStrings << m_audioFilterList.at(i)->getConfig();
+ return configStrings;
+}
+
+QStringList KXineWidget::getVideoFilterConfig()
+{
+ QStringList configStrings;
+ for (uint i=0; i<m_videoFilterList.count(); i++)
+ configStrings << m_videoFilterList.at(i)->getConfig();
+ return configStrings;
+}
+#endif
+
+/**** visual plugin **********/
+
+QStringList KXineWidget::getVisualPlugins() const
+{
+ QStringList visuals;
+ const char* const* plugins = xine_list_post_plugins_typed(m_xineEngine, XINE_POST_TYPE_AUDIO_VISUALIZATION);
+
+ for (int i = 0; plugins[i]; i++)
+ {
+ visuals << plugins[i];
+ }
+ return visuals;
+}
+
+/**************** change visualization plugin *****************/
+
+void KXineWidget::slotSetVisualPlugin(const QString& visual)
+{
+ if (m_visualPluginName == visual) return;
+ debugOut(QString("New visualization plugin: %1").arg(visual));
+
+#ifndef USE_QT_ONLY
+ unwireAudioFilters();
+ if(m_visualPlugin)
+ {
+ delete m_visualPlugin;
+ m_visualPlugin = NULL;
+ }
+
+ if (visual == "none")
+ m_visualPluginName = QString::null;
+ else
+ m_visualPluginName = visual;
+
+ wireAudioFilters();
+#else
+ if (visual == "none")
+ m_visualPluginName = QString::null;
+ else
+ m_visualPluginName = visual;
+
+ if (m_xinePost)
+ {
+ xine_post_out_t *pp;
+
+ pp = xine_get_audio_source(m_xineStream);
+ xine_post_wire_audio_port(pp, m_audioDriver);
+ xine_post_dispose(m_xineEngine, m_xinePost);
+ m_xinePost = NULL;
+ }
+
+ if ( (xine_get_status(m_xineStream ) == XINE_STATUS_PLAY)
+ && (!xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_HAS_VIDEO)) && (m_visualPluginName) )
+ {
+ m_xinePost = xine_post_init(m_xineEngine, m_visualPluginName, 0, &m_audioDriver, &m_videoDriver);
+ m_postAudioSource = xine_get_audio_source(m_xineStream);
+ m_postInput = (xine_post_in_t*)xine_post_input(m_xinePost, const_cast<char*>("audio in"));
+ xine_post_wire(m_postAudioSource, m_postInput);
+ }
+#endif
+}
+
+/*****/
+
+void KXineWidget::getAutoplayPlugins(QStringList& autoPlayList) const
+{
+ char** pluginIds = NULL;
+ int i = 0;
+
+ pluginIds = (char**)xine_get_autoplay_input_plugin_ids(m_xineEngine);
+
+ while(pluginIds[i])
+ {
+ autoPlayList << pluginIds[i];
+
+ autoPlayList << xine_get_input_plugin_description(m_xineEngine, pluginIds[i]);
+ i++;
+ }
+}
+
+bool KXineWidget::getAutoplayPluginURLS(const QString& plugin, QStringList& list)
+{
+ char** urls = NULL;
+ int num;
+ int i = 0;
+
+ urls = xine_get_autoplay_mrls(m_xineEngine, plugin.ascii(), &num);
+
+ if (urls)
+ {
+ while (urls[i])
+ {
+ list << urls[i];
+ i++;
+ }
+ return true;
+ }
+ else
+ {
+ return false;
+ }
+}
+
+void KXineWidget::slotSetVolume(int vol)
+{
+ if (!isXineReady()) return;
+ if (m_softwareMixer)
+ {
+ //debugOut(QString("Set software amplification level: %1").arg(vol));
+ if (m_volumeGain)
+ xine_set_param(m_xineStream, XINE_PARAM_AUDIO_AMP_LEVEL, vol*2);
+ else
+ xine_set_param(m_xineStream, XINE_PARAM_AUDIO_AMP_LEVEL, vol);
+ }
+ else
+ {
+ //debugOut(QString("Set audio mixer volume: %1").arg(vol));
+ xine_set_param(m_xineStream, XINE_PARAM_AUDIO_VOLUME, vol);
+ }
+ emit signalXineStatus(i18n("Volume") + ": " + QString::number(vol) +"%");
+}
+
+uint KXineWidget::getVolume() const
+{
+ if (!isXineReady()) return 0;
+ uint vol;
+ if (m_softwareMixer)
+ {
+ vol = xine_get_param(m_xineStream, XINE_PARAM_AUDIO_AMP_LEVEL);
+ if (vol > 200)
+ {
+ // when amp is high > 100, xine_get_param sometimes returns incorrect amp level
+ errorOut("Amp level returned weird results, set Amp to 100");
+ vol = 100;
+ }
+ if (m_volumeGain) vol = vol/2;
+ }
+ else
+ {
+ vol = xine_get_param(m_xineStream, XINE_PARAM_AUDIO_VOLUME);
+ }
+ return vol;
+}
+
+void KXineWidget::slotToggleMute()
+{
+ int muteParam;
+ if (m_softwareMixer)
+ muteParam = XINE_PARAM_AUDIO_AMP_MUTE;
+ else
+ muteParam = XINE_PARAM_AUDIO_MUTE;
+
+ if (xine_get_param(m_xineStream, muteParam))
+ {
+ xine_set_param(m_xineStream, muteParam, 0); /* mute off */
+ emit signalXineStatus(i18n("Mute Off"));
+ }
+ else
+ {
+ xine_set_param(m_xineStream, muteParam, 1); /* mute on */
+ emit signalXineStatus(i18n("Mute On"));
+ }
+}
+
+bool KXineWidget::SoftwareMixing() const
+{
+ if (m_softwareMixer)
+ return true;
+ else
+ return false;
+}
+
+void KXineWidget::mouseMoveEvent(QMouseEvent* mev)
+{
+ if (!m_xineReady) return;
+
+ if (cursor().shape() == Qt::BlankCursor)
+ {
+ setCursor(QCursor(Qt::ArrowCursor));
+ }
+
+ x11_rectangle_t rect;
+ xine_event_t event;
+ xine_input_data_t input;
+
+ rect.x = mev->x();
+ rect.y = mev->y();
+ rect.w = 0;
+ rect.h = 0;
+
+ xine_port_send_gui_data (m_videoDriver, XINE_GUI_SEND_TRANSLATE_GUI_TO_VIDEO, (void*)&rect);
+
+ event.type = XINE_EVENT_INPUT_MOUSE_MOVE;
+ event.data = &input;
+ event.data_length = sizeof(input);
+ input.button = 0;
+ input.x = rect.x;
+ input.y = rect.y;
+ xine_event_send(m_xineStream, &event);
+ mev->ignore();
+}
+
+
+void KXineWidget::mousePressEvent(QMouseEvent* mev)
+{
+ if (!m_xineReady) return;
+ int cur = cursor().shape();
+
+ if (mev->button() == Qt::MidButton)
+ {
+ emit signalMiddleClick();
+ mev->ignore();
+ return;
+ }
+
+ if (mev->button() == Qt::RightButton)
+ {
+ if ( (cur == Qt::ArrowCursor) || (cur == Qt::BlankCursor) )
+ {
+ emit signalRightClick(mev->globalPos());
+ mev->accept();
+ return;
+ }
+ }
+
+ if (mev->button() == Qt::LeftButton)
+ {
+ if ( (cur == Qt::ArrowCursor) || (cur == Qt::BlankCursor) )
+ {
+ emit signalLeftClick(mev->globalPos());
+ mev->ignore();
+ return;
+ }
+
+ x11_rectangle_t rect;
+ xine_event_t event;
+ xine_input_data_t input;
+
+ rect.x = mev->x();
+ rect.y = mev->y();
+ rect.w = 0;
+ rect.h = 0;
+
+ xine_port_send_gui_data(m_videoDriver, XINE_GUI_SEND_TRANSLATE_GUI_TO_VIDEO, (void*)&rect);
+
+ event.type = XINE_EVENT_INPUT_MOUSE_BUTTON;
+ event.data = &input;
+ event.data_length = sizeof(input);
+ input.button = 1;
+ input.x = rect.x;
+ input.y = rect.y;
+ xine_event_send (m_xineStream, &event);
+ mev->accept(); /* don't send event to parent */
+ }
+}
+
+void KXineWidget::mouseDoubleClickEvent(QMouseEvent* mev)
+{
+ emit signalDoubleClick();
+ mev->ignore();
+}
+
+void KXineWidget::wheelEvent(QWheelEvent* e)
+{
+ int oldVal = getPosition();
+ if (oldVal == 0) // no valid position
+ return;
+
+ float offset = log10( QABS(e->delta()) ) / 0.002;
+ int newVal = 0;
+ if (e->delta()>0)
+ newVal = oldVal - int(offset);
+ else
+ newVal = oldVal + int(offset);
+ if (newVal < 0) newVal = 0;
+ slotSeekToPosition(newVal);
+ e->accept();
+}
+
+void KXineWidget::playNextChapter() const
+{
+ xine_event_t xev;
+
+ xev.type = XINE_EVENT_INPUT_NEXT;
+ xev.data = NULL;
+ xev.data_length = 0;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::playPreviousChapter() const
+{
+ xine_event_t xev;
+
+ xev.type = XINE_EVENT_INPUT_PREVIOUS;
+ xev.data = NULL;
+ xev.data_length = 0;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotStop()
+{
+ m_posTimer.stop();
+ if ( m_lengthInfoTimer.isActive() ) m_lengthInfoTimer.stop();
+ //emit signalNewPosition(0, QTime());
+
+ xine_stop(m_xineStream);
+
+ emit signalXineStatus(i18n("Stop"));
+}
+
+void KXineWidget::slotSetAudiocdDevice(const QString& device)
+{
+ debugOut(QString("Set AudioCD device to %1").arg(device));
+
+ xine_cfg_entry_t config;
+ xine_config_lookup_entry(m_xineEngine, "input.cdda_device", &config);
+ if (m_cachedCDPath.isNull())
+ m_cachedCDPath = config.str_value;
+ config.str_value = QFile::encodeName(device).data();
+ xine_config_update_entry (m_xineEngine, &config);
+}
+
+void KXineWidget::slotSetVcdDevice(const QString& device)
+{
+ debugOut(QString("Set VCD device to %1").arg(device));
+
+ xine_cfg_entry_t config;
+ xine_config_lookup_entry(m_xineEngine, "input.vcd_device", &config);
+ if (m_cachedVCDPath.isNull())
+ m_cachedVCDPath = config.str_value;
+ config.str_value = QFile::encodeName(device).data();
+ xine_config_update_entry (m_xineEngine, &config);
+}
+
+void KXineWidget::slotSetDvdDevice(const QString& device)
+{
+ debugOut(QString("Set DVD device to %1").arg(device));
+
+ xine_cfg_entry_t config;
+ xine_config_lookup_entry(m_xineEngine, "input.dvd_device", &config);
+ if (m_cachedDVDPath.isNull())
+ m_cachedDVDPath = config.str_value;
+ config.str_value = QFile::encodeName(device).data();
+ xine_config_update_entry (m_xineEngine, &config);
+}
+
+QString KXineWidget::audiocdDevice() const
+{
+ xine_cfg_entry_t config;
+ xine_config_lookup_entry(m_xineEngine, "input.cdda_device", &config);
+
+ return QFile::decodeName(config.str_value);
+}
+
+QString KXineWidget::vcdDevice() const
+{
+ xine_cfg_entry_t config;
+ xine_config_lookup_entry(m_xineEngine, "input.vcd_device", &config);
+
+ return QFile::decodeName(config.str_value);
+}
+
+QString KXineWidget::dvdDevice() const
+{
+ xine_cfg_entry_t config;
+ xine_config_lookup_entry(m_xineEngine, "input.dvd_device", &config);
+
+ return QFile::decodeName(config.str_value);
+}
+
+uint KXineWidget::currentDVDTitleNumber() const
+{
+ return xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_DVD_TITLE_NUMBER);
+}
+
+uint KXineWidget::getDVDTitleCount() const
+{
+ return xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_DVD_TITLE_COUNT);
+}
+
+uint KXineWidget::currentDVDChapterNumber() const
+{
+ return xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_DVD_CHAPTER_NUMBER);
+}
+
+uint KXineWidget::getDVDChapterCount() const
+{
+ return xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_DVD_CHAPTER_COUNT);
+}
+
+uint KXineWidget::currentDVDAngleNumber() const
+{
+ return xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_DVD_ANGLE_NUMBER);
+}
+
+uint KXineWidget::getDVDAngleCount() const
+{
+ return xine_get_stream_info(m_xineStream, XINE_STREAM_INFO_DVD_ANGLE_COUNT);
+}
+
+void KXineWidget::setStreamSaveDir(const QString& dir)
+{
+ xine_cfg_entry_t config;
+
+ if (!xine_config_lookup_entry(m_xineEngine, "misc.save_dir", &config)) return; /* older xine-lib */
+
+ debugOut(QString("Set misc.save_dir to: %1").arg(dir));
+ config.str_value = QFile::encodeName(dir).data();
+ xine_config_update_entry (m_xineEngine, &config);
+}
+
+const QString KXineWidget::getStreamSaveDir()
+{
+ xine_cfg_entry_t config;
+
+ if (!xine_config_lookup_entry(m_xineEngine, "misc.save_dir", &config)) return QString::null; /* older xine-lib */
+
+ return QFile::decodeName(config.str_value);
+}
+
+void KXineWidget::setBroadcasterPort(const uint port)
+{
+ debugOut(QString("Set broadcaster port to %1").arg(port));
+ xine_set_param(m_xineStream, XINE_PARAM_BROADCASTER_PORT, port);
+}
+
+void KXineWidget::slotSpeedPause()
+{
+ if (m_currentSpeed == Pause)
+ {
+ slotSpeedNormal();
+ }
+ else if (m_trackURL != m_logoFile) // don't pause logo
+ {
+ xine_set_param(m_xineStream, XINE_PARAM_SPEED, XINE_SPEED_PAUSE);
+ m_posTimer.stop();
+ if (m_currentSpeed != Undefined)
+ emit signalXineStatus(i18n("Pause"));
+ m_currentSpeed = Pause;
+ }
+}
+
+void KXineWidget::slotSpeedNormal()
+{
+ xine_set_param(m_xineStream, XINE_PARAM_SPEED, XINE_SPEED_NORMAL);
+ m_posTimer.start(200);
+ m_currentSpeed = Normal;
+ emit signalXineStatus(i18n("Playing") + " ");
+}
+
+void KXineWidget::slotSpeedFaster()
+{
+ switch (m_currentSpeed)
+ {
+ case Fast1:
+ {
+ xine_set_param(m_xineStream, XINE_PARAM_SPEED, XINE_SPEED_FAST_4);
+ m_currentSpeed = Fast2;
+ emit signalXineStatus(i18n("Fast Forward %1").arg("x2"));
+ break;
+ }
+ case Fast2:
+ {
+ slotSpeedNormal();
+ break;
+ }
+ case Slow1:
+ {
+ slotSpeedNormal();
+ break;
+ }
+ case Slow2:
+ {
+ xine_set_param(m_xineStream, XINE_PARAM_SPEED, XINE_SPEED_SLOW_2);
+ m_currentSpeed = Slow1;
+ emit signalXineStatus(i18n("Slow Motion %1").arg("x1"));
+ break;
+ }
+ default:
+ {
+ xine_set_param(m_xineStream, XINE_PARAM_SPEED, XINE_SPEED_FAST_2);
+ m_currentSpeed = Fast1;
+ emit signalXineStatus(i18n("Fast Forward %1").arg("x1"));
+ break;
+ }
+ }
+}
+
+void KXineWidget::slotSpeedSlower()
+{
+ switch (m_currentSpeed)
+ {
+ case Slow1:
+ {
+ xine_set_param(m_xineStream, XINE_PARAM_SPEED, XINE_SPEED_SLOW_4);
+ m_currentSpeed = Slow2;
+ emit signalXineStatus(i18n("Slow Motion %1").arg("x2"));
+ break;
+ }
+ case Slow2:
+ {
+ slotSpeedNormal();
+ break;
+ }
+ case Fast1:
+ {
+ slotSpeedNormal();
+ break;
+ }
+ case Fast2:
+ {
+ xine_set_param(m_xineStream, XINE_PARAM_SPEED, XINE_SPEED_FAST_2);
+ m_currentSpeed = Fast1;
+ emit signalXineStatus(i18n("Fast Forward %1").arg("x1"));
+ break;
+ }
+ default:
+ {
+ xine_set_param(m_xineStream, XINE_PARAM_SPEED, XINE_SPEED_SLOW_2);
+ m_currentSpeed = Slow1;
+ emit signalXineStatus(i18n("Slow Motion %1").arg("x1"));
+ break;
+ }
+ }
+}
+
+QString KXineWidget::getSupportedExtensions() const
+{
+ return xine_get_file_extensions(m_xineEngine);
+}
+
+void KXineWidget::slotSetAudioChannel(int ch)
+{
+ debugOut(QString("Switch to audio channel %1").arg(ch-1));
+ xine_set_param(m_xineStream, XINE_PARAM_AUDIO_CHANNEL_LOGICAL, ch-1);
+}
+
+
+void KXineWidget::slotSetSubtitleChannel(int ch)
+{
+ debugOut(QString("Switch to subtitle channel %1").arg(ch-1));
+ xine_set_param(m_xineStream, XINE_PARAM_SPU_CHANNEL, ch-1);
+}
+
+
+void KXineWidget::slotSetFileSubtitles(QString url)
+{
+ int pos;
+ int time;
+ int length;
+
+ m_queue.prepend(url);
+
+ int t = 0, ret = 0;
+ while(((ret = xine_get_pos_length(m_xineStream, &pos, &time, &length)) == 0) && (++t < 5))
+ xine_usec_sleep(100000);
+
+ if ( ret == 0 )
+ {
+ debugOut("No valid stream position information");
+ return;
+ }
+
+ if (isPlaying())
+ xine_stop(m_xineStream);
+ m_posTimer.stop();
+
+ slotPlay();
+ slotSeekToPosition(pos);
+}
+
+
+
+uint KXineWidget::getPosition() const
+{
+ if (!m_xineReady) return 0;
+
+ int pos, time, length;
+
+ int t = 0, ret = 0;
+ while(((ret = xine_get_pos_length(m_xineStream, &pos, &time, &length)) == 0) && (++t < 5))
+ xine_usec_sleep(100000);
+
+ if ( ret == 0 )
+ {
+ debugOut("No valid stream position information");
+ return 0;
+ }
+
+ return (uint)pos;
+}
+
+QTime KXineWidget::getPlaytime() const
+{
+ if (!m_xineReady) return QTime();
+
+ int pos, time, length;
+
+ int t = 0, ret = 0;
+ while(((ret = xine_get_pos_length(m_xineStream, &pos, &time, &length)) == 0) && (++t < 5))
+ xine_usec_sleep(100000);
+
+ if ( ret == 0 )
+ {
+ debugOut("No valid stream position information");
+ return QTime();
+ }
+
+ return msToTime(time);
+}
+
+void KXineWidget::slotSendPosition()
+{
+ if (!m_xineReady) return;
+
+ int pos, time, length;
+
+ int t = 0, ret = 0;
+ while(((ret = xine_get_pos_length(m_xineStream, &pos, &time, &length)) == 0) && (++t < 5))
+ xine_usec_sleep(100000);
+
+ if ( ret == 0 )
+ {
+ debugOut("No valid stream position information");
+ return;
+ }
+
+ emit signalNewPosition(pos, msToTime(time));
+}
+
+void KXineWidget::slotStartSeeking()
+{
+ debugOut("Seeking started");
+ m_posTimer.stop();
+}
+
+void KXineWidget::run()
+{
+ if ( seekThreadPos )
+ xine_play(m_xineStream, seekThreadPos, 0);
+ else if ( seekThreadTime )
+ xine_play(m_xineStream, 0, seekThreadTime);
+ else
+ xine_play(m_xineStream, seekThreadPos, 0);
+
+ if ( seekThreadPause ) {
+ m_currentSpeed = Undefined;
+ slotSpeedPause();
+ }
+}
+
+void KXineWidget::slotSeekToPositionBlocking(int pos)
+{
+ while ( running() )
+ usleep( 1000 );
+ if ( pos!=seekThreadPos )
+ slotSeekToPosition(pos);
+}
+
+
+void KXineWidget::slotSeekToPosition(int pos)
+{
+ if ( running() ) {
+ return;
+ }
+
+ if ((!isXineReady()) || (!isPlaying()) || (!isSeekable()))
+ return;
+
+ seekThreadPause = false;
+ if (m_currentSpeed == Pause)
+ seekThreadPause = true;
+ seekThreadPos = pos;
+ seekThreadTime = 0;
+ start();
+}
+
+void KXineWidget::slotSeekToTime(const QTime& postime)
+{
+ if ( running() )
+ return;
+
+ if ((!isXineReady()) || (!isPlaying()) || (!isSeekable()))
+ return;
+
+ seekThreadPause = false;
+ if (m_currentSpeed == Pause)
+ seekThreadPause = true;
+ seekThreadPos = 0;
+ seekThreadTime = QTime().msecsTo(postime);
+ start();
+}
+
+void KXineWidget::slotStopSeeking()
+{
+ debugOut("Seeking stopped");
+ m_posTimer.start(200, false);
+}
+
+void KXineWidget::slotEject()
+{
+ xine_eject(m_xineStream);
+}
+
+void KXineWidget::slotEnableAutoresize(bool enable)
+{
+ m_autoresizeEnabled = enable;
+ if (!m_autoresizeEnabled)
+ {
+ m_videoFrameHeight = 0;
+ m_videoFrameWidth = 0;
+ }
+}
+
+/***************************************
+ * tvtime deinterlacer plugin *
+ ***************************************/
+
+#ifndef USE_QT_ONLY
+void KXineWidget::createDeinterlacePlugin(const QString& config, QWidget* parent)
+{
+ m_deinterlaceFilter = new PostFilter(config.section(':',0,0), m_xineEngine, m_audioDriver, m_videoDriver, parent);
+ if( !m_deinterlaceFilter->getInput() || !m_deinterlaceFilter->getOutput() )
+ {
+ delete m_deinterlaceFilter;
+ m_deinterlaceFilter = NULL;
+ }
+
+ slotSetDeinterlaceConfig(config);
+}
+
+const QString KXineWidget::getDeinterlaceConfig() const
+{
+ if (m_deinterlaceFilter)
+ return m_deinterlaceFilter->getConfig();
+
+ return DEFAULT_TVTIME_CONFIG;
+}
+#endif
+
+void KXineWidget::slotSetDeinterlaceConfig(const QString& config)
+{
+#ifndef USE_QT_ONLY
+ if (m_deinterlaceFilter)
+ m_deinterlaceFilter->setConfig(config);
+#else
+ warningOut(QString ("Not implemented [SetDeinterlaceConfig %1]").arg(config));
+#endif
+}
+
+void KXineWidget::slotToggleDeinterlace()
+{
+#ifndef USE_QT_ONLY
+ QString s;
+
+ if (m_deinterlaceFilter)
+ {
+ m_deinterlaceEnabled = !m_deinterlaceEnabled;
+ debugOut(QString("Deinterlace enabled: %1").arg(m_deinterlaceEnabled));
+ if ( m_deinterlaceEnabled ) s = i18n("Deinterlace: on");
+ else s = i18n("Deinterlace: off");
+ showOSDMessage( s, 2000 );
+ unwireVideoFilters();
+ wireVideoFilters();
+ }
+ else
+ {
+ /* fallback - this method is deprecated */
+ if (xine_get_param(m_xineStream, XINE_PARAM_VO_DEINTERLACE))
+ xine_set_param(m_xineStream, XINE_PARAM_VO_DEINTERLACE, false);
+ else
+ xine_set_param(m_xineStream, XINE_PARAM_VO_DEINTERLACE, true);
+ }
+#else
+ warningOut("Not implemented!");
+#endif
+}
+
+/**************************/
+
+void KXineWidget::slotAspectRatioAuto()
+{
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ASPECT_RATIO, XINE_VO_ASPECT_AUTO);
+ emit signalXineStatus(i18n("Aspect Ratio") + ": " + i18n("Auto"));
+}
+
+void KXineWidget::slotAspectRatio4_3()
+{
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ASPECT_RATIO, XINE_VO_ASPECT_4_3);
+ emit signalXineStatus(i18n("Aspect Ratio") + ": " + i18n("4:3"));
+}
+
+void KXineWidget::slotAspectRatioAnamorphic()
+{
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ASPECT_RATIO, XINE_VO_ASPECT_ANAMORPHIC);
+ emit signalXineStatus(i18n("Aspect Ratio") + ": " + i18n("16:9"));
+}
+
+void KXineWidget::slotAspectRatioSquare()
+{
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ASPECT_RATIO, XINE_VO_ASPECT_SQUARE);
+ emit signalXineStatus(i18n("Aspect Ratio") + ": " + i18n("1:1"));
+}
+
+void KXineWidget::slotAspectRatioDVB()
+{
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ASPECT_RATIO, XINE_VO_ASPECT_DVB);
+ emit signalXineStatus(i18n("Aspect Ratio") + ": " + i18n("2.11:1"));
+}
+
+void KXineWidget::slotZoomOutX()
+{
+ if ((m_currentZoomX - 5) >= 100)
+ {
+ m_currentZoomX -= 5;
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ZOOM_X, m_currentZoomX);
+ emit signalXineStatus(i18n("Zoom X") + ": " + QString::number(m_currentZoomX) + "%");
+ }
+}
+
+void KXineWidget::slotZoomInX()
+{
+ if ((m_currentZoomX + 5) <= XINE_VO_ZOOM_MAX)
+ {
+ m_currentZoomX += 5;
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ZOOM_X, m_currentZoomX);
+ emit signalXineStatus(i18n("Zoom X") + ": " + QString::number(m_currentZoomX) + "%");
+ }
+}
+
+void KXineWidget::slotZoomOutY()
+{
+ if ((m_currentZoomY - 5) >= 100)
+ {
+ m_currentZoomY -= 5;
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ZOOM_Y, m_currentZoomY);
+ emit signalXineStatus(i18n("Zoom Y") + ": " + QString::number(m_currentZoomY) + "%");
+ }
+}
+
+void KXineWidget::slotZoomInY()
+{
+ if ((m_currentZoomY + 5) <= XINE_VO_ZOOM_MAX)
+ {
+ m_currentZoomY += 5;
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ZOOM_Y, m_currentZoomY);
+ emit signalXineStatus(i18n("Zoom Y") + ": " + QString::number(m_currentZoomY) + "%");
+ }
+}
+
+void KXineWidget::slotZoomOut()
+{
+ if ((m_currentZoom - 5) >= 100)
+ {
+ m_currentZoom -= 5;
+ m_currentZoomX = m_currentZoomY = m_currentZoom;
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ZOOM_X, m_currentZoom);
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ZOOM_Y, m_currentZoom);
+ emit signalXineStatus(i18n("Zoom") + ": " + QString::number(m_currentZoom) + "%");
+ }
+}
+
+void KXineWidget::slotZoomIn()
+{
+ if ((m_currentZoom + 5) <= XINE_VO_ZOOM_MAX)
+ {
+ m_currentZoom += 5;
+ m_currentZoomX = m_currentZoomY = m_currentZoom;
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ZOOM_X, m_currentZoom);
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ZOOM_Y, m_currentZoom);
+ emit signalXineStatus(i18n("Zoom") + ": " + QString::number(m_currentZoom) + "%");
+ }
+}
+
+void KXineWidget::slotZoomOff()
+{
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ZOOM_X, 100);
+ xine_set_param(m_xineStream, XINE_PARAM_VO_ZOOM_Y, 100);
+ m_currentZoom = 100;
+ m_currentZoomX = m_currentZoomY = m_currentZoom;
+ emit signalXineStatus(i18n("Zoom") + ": " + QString::number(m_currentZoom) + "%");
+}
+
+QTime KXineWidget::getLengthInfo()
+{
+ int pos, time, length;
+
+ int t = 0, ret = 0;
+ while(((ret = xine_get_pos_length(m_xineStream, &pos, &time, &length)) == 0) && (++t < 5))
+ xine_usec_sleep(100000);
+
+ if ( (ret != 0) && (length > 0) )
+ {
+ return msToTime(length);
+ }
+
+ return QTime();
+}
+
+void KXineWidget::slotEmitLengthInfo()
+{
+ QTime length = getLengthInfo();
+ if (!(length.isNull()))
+ {
+ if ( m_trackURL!="DVB" ) m_lengthInfoTimer.stop();
+ m_trackLength = length;
+ emit signalLengthChanged();
+ }
+ else
+ {
+ if (m_lengthInfoTries > 10) // wait 10 seconds
+ m_lengthInfoTimer.stop();
+ else
+ {
+ debugOut("Wait for valid length information");
+ m_lengthInfoTries ++;
+ }
+ }
+}
+
+void KXineWidget::globalPosChanged()
+{
+ QPoint g = mapToGlobal(QPoint(0,0));
+ m_globalX = g.x();
+ m_globalY = g.y();
+}
+
+const xine_t* const KXineWidget::getXineEngine()const
+{
+ return m_xineEngine;
+}
+
+/************ video settings ****************/
+
+void KXineWidget::getVideoSettings(int& hue, int& sat, int& contrast, int& bright,
+ int& avOffset, int& spuOffset) const
+{
+ hue = xine_get_param(m_xineStream, XINE_PARAM_VO_HUE);
+ sat = xine_get_param(m_xineStream, XINE_PARAM_VO_SATURATION);
+ contrast = xine_get_param(m_xineStream, XINE_PARAM_VO_CONTRAST);
+ bright = xine_get_param(m_xineStream, XINE_PARAM_VO_BRIGHTNESS);
+ avOffset = xine_get_param(m_xineStream, XINE_PARAM_AV_OFFSET);
+ spuOffset = xine_get_param(m_xineStream, XINE_PARAM_SPU_OFFSET);
+}
+
+void KXineWidget::getspuOffset(int& spuOffset) const
+{
+ spuOffset = xine_get_param(m_xineStream, XINE_PARAM_SPU_OFFSET);
+}
+
+void KXineWidget::slotSetHue(int hue)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_VO_HUE, hue);
+ emit signalXineStatus(i18n("Hue") + ": " + QString::number((hue*100)/65535) + "%");
+}
+
+void KXineWidget::slotSetSaturation(int sat)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_VO_SATURATION, sat);
+ emit signalXineStatus(i18n("Saturation") + ": " + QString::number((sat*100)/65535) + "%");
+}
+
+void KXineWidget::slotSetContrast(int contrast)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_VO_CONTRAST, contrast);
+ emit signalXineStatus(i18n("Contrast") + ": " + QString::number((contrast*100)/65535) + "%");
+}
+
+void KXineWidget::slotSetBrightness(int bright)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_VO_BRIGHTNESS, bright);
+ emit signalXineStatus(i18n("Brightness") + ": " + QString::number((bright*100)/65535) + "%");
+}
+
+void KXineWidget::slotSetAVOffset(int av)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_AV_OFFSET, av);
+ emit signalXineStatus(i18n("Audio/Video Offset") + ": " + QString::number(av/90) + i18n("msec"));
+}
+
+void KXineWidget::slotSetSpuOffset(int spu)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_SPU_OFFSET, spu);
+ emit signalXineStatus(i18n("Subtitle Offset") + ": " + QString::number(spu/90) + i18n("msec"));
+}
+
+
+/**************** equalizer *****************/
+
+void KXineWidget::slotSetEq30(int val)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_EQ_30HZ, -val);
+}
+
+void KXineWidget::slotSetEq60(int val)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_EQ_60HZ, -val);
+}
+
+void KXineWidget::slotSetEq125(int val)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_EQ_125HZ, -val);
+}
+
+void KXineWidget::slotSetEq250(int val)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_EQ_250HZ, -val);
+}
+
+void KXineWidget::slotSetEq500(int val)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_EQ_500HZ, -val);
+}
+
+void KXineWidget::slotSetEq1k(int val)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_EQ_1000HZ, -val);
+}
+
+void KXineWidget::slotSetEq2k(int val)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_EQ_2000HZ, -val);
+}
+
+void KXineWidget::slotSetEq4k(int val)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_EQ_4000HZ, -val);
+}
+
+void KXineWidget::slotSetEq8k(int val)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_EQ_8000HZ, -val);
+}
+
+void KXineWidget::slotSetEq16k(int val)
+{
+ xine_set_param(m_xineStream, XINE_PARAM_EQ_16000HZ, -val);
+}
+
+void KXineWidget::slotSetVolumeGain(bool gain)
+{
+ int amp = 0;
+
+ if (gain)
+ {
+ if (m_softwareMixer)
+ amp = getVolume()*2;
+ else
+ amp = 200;
+ }
+ else
+ {
+ if (m_softwareMixer)
+ amp = getVolume();
+ else
+ amp = 100;
+ }
+ xine_set_param(m_xineStream, XINE_PARAM_AUDIO_AMP_LEVEL, amp);
+
+ m_volumeGain = gain;
+}
+
+/*************** dvd menus ******************/
+
+void KXineWidget::slotMenuToggle()
+{
+ xine_event_t xev;
+ xev.type = XINE_EVENT_INPUT_MENU1;
+ xev.data = NULL;
+ xev.data_length = 0;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotMenuTitle()
+{
+ xine_event_t xev;
+ xev.type = XINE_EVENT_INPUT_MENU2;
+ xev.data = NULL;
+ xev.data_length = 0;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotMenuRoot()
+{
+ xine_event_t xev;
+ xev.type = XINE_EVENT_INPUT_MENU3;
+ xev.data = NULL;
+ xev.data_length = 0;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotMenuSubpicture()
+{
+ xine_event_t xev;
+ xev.type = XINE_EVENT_INPUT_MENU4;
+ xev.data = NULL;
+ xev.data_length = 0;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotMenuAudio()
+{
+ xine_event_t xev;
+ xev.type = XINE_EVENT_INPUT_MENU5;
+ xev.data = NULL;
+ xev.data_length = 0;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotMenuAngle()
+{
+ xine_event_t xev;
+ xev.type = XINE_EVENT_INPUT_MENU6;
+ xev.data = NULL;
+ xev.data_length = 0;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotMenuPart()
+{
+ xine_event_t xev;
+ xev.type = XINE_EVENT_INPUT_MENU7;
+ xev.data = NULL;
+ xev.data_length = 0;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotDVDMenuLeft()
+{
+ xine_event_t xev;
+ xev.data = NULL;
+ xev.data_length = 0;
+ xev.type = XINE_EVENT_INPUT_LEFT;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotDVDMenuRight()
+{
+ xine_event_t xev;
+ xev.data = NULL;
+ xev.data_length = 0;
+ xev.type = XINE_EVENT_INPUT_RIGHT;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotDVDMenuUp()
+{
+ xine_event_t xev;
+ xev.data = NULL;
+ xev.data_length = 0;
+ xev.type = XINE_EVENT_INPUT_UP;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotDVDMenuDown()
+{
+ xine_event_t xev;
+ xev.data = NULL;
+ xev.data_length = 0;
+ xev.type = XINE_EVENT_INPUT_DOWN;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+void KXineWidget::slotDVDMenuSelect()
+{
+ xine_event_t xev;
+ xev.data = NULL;
+ xev.data_length = 0;
+ xev.type = XINE_EVENT_INPUT_SELECT;
+
+ xine_event_send(m_xineStream, &xev);
+}
+
+
+/******** mouse hideing at fullscreen ****/
+
+void KXineWidget::startMouseHideTimer()
+{
+ m_mouseHideTimer.start(5000);
+}
+
+void KXineWidget::stopMouseHideTimer()
+{
+ m_mouseHideTimer.stop();
+}
+
+void KXineWidget::slotHideMouse()
+{
+ if (cursor().shape() == Qt::ArrowCursor)
+ {
+ setCursor(QCursor(Qt::BlankCursor));
+ }
+}
+
+
+/************************************************************
+ * Take a Screenshot *
+ ************************************************************/
+
+QImage KXineWidget::getScreenshot() const
+{
+ uchar *rgbPile = NULL;
+ int width, height;
+ double scaleFactor;
+
+ getScreenshot(rgbPile, width, height, scaleFactor);
+
+ if (!rgbPile) return QImage();
+
+ QImage screenShot(rgbPile, width, height, 32, 0, 0, QImage::IgnoreEndian);
+ if (scaleFactor >= 1.0)
+ width = (int)((double) width * scaleFactor + 0.5);
+ else
+ height = (int)((double) height / scaleFactor + 0.5);
+
+ debugOut(QString("Screenshot: scale picture from %1x%2 to %3x%4").arg(screenShot.width()).arg(screenShot.height()).arg(width).arg(height));
+ screenShot = screenShot.smoothScale(width, height);
+
+ delete []rgbPile;
+ return screenShot;
+}
+
+void KXineWidget::getScreenshot(uchar*& rgb32BitData, int& videoWidth, int& videoHeight, double& scaleFactor) const
+{
+
+ uint8_t *yuv = NULL, *y = NULL, *u = NULL, *v =NULL;
+
+ int width, height, ratio, format;
+ // double desired_ratio, image_ratio;
+
+ if (!xine_get_current_frame(m_xineStream, &width, &height, &ratio, &format, NULL))
+ return;
+
+ yuv = new uint8_t[((width+8) * (height+1) * 2)];
+ if (yuv == NULL)
+ {
+ errorOut("Not enough memory to make screenshot!");
+ return;
+ }
+
+ xine_get_current_frame(m_xineStream, &width, &height, &ratio, &format, yuv);
+
+ videoWidth = width;
+ videoHeight = height;
+
+ /*
+ * convert to yv12 if necessary
+ */
+
+ switch (format)
+ {
+ case XINE_IMGFMT_YUY2:
+ {
+ uint8_t *yuy2 = yuv;
+
+ yuv = new uint8_t[(width * height * 2)];
+ if (yuv == NULL)
+ {
+ errorOut("Not enough memory to make screenshot!");
+ return;
+ }
+ y = yuv;
+ u = yuv + width * height;
+ v = yuv + width * height * 5 / 4;
+
+ yuy2Toyv12 (y, u, v, yuy2, width, height);
+
+ delete [] yuy2;
+ }
+ break;
+ case XINE_IMGFMT_YV12:
+ y = yuv;
+ u = yuv + width * height;
+ v = yuv + width * height * 5 / 4;
+
+ break;
+ default:
+ {
+ warningOut(QString("Screenshot: Format %1 not supportet!").arg((char*)&format));
+ delete [] yuv;
+ return;
+ }
+ }
+
+ /*
+ * convert to rgb
+ */
+
+ rgb32BitData = yv12ToRgb (y, u, v, width, height);
+
+
+ // image_ratio = (double) height / (double) width;
+
+ /*
+ switch (ratio)
+ {
+ case XINE_VO_ASPECT_ANAMORPHIC:
+ debugOut("Screenshot: got video aspect: anamorphic");
+ desired_ratio = 16.0 /9.0;
+ break;
+ case XINE_VO_ASPECT_DVB:
+ debugOut("Screenshot: got video aspect: 2.11:1");
+ desired_ratio = 2.11/1.0;
+ break;
+ case XINE_VO_ASPECT_4_3:
+ debugOut("Screenshot: got video aspect: 4:3");
+ desired_ratio = 4.0 / 3.0;
+ break;
+ default:
+ warningOut(QString("Screenshot: Unknown aspect ratio: %1 - using 4:3").arg(ratio));
+ case XINE_VO_ASPECT_SQUARE:
+ debugOut("Screenshot: got video aspect: 1:1");
+ desired_ratio = image_ratio;
+ break;
+ }
+ */
+
+ debugOut(QString("Screenshot: using scale factor: %1").arg(m_videoAspect));
+ scaleFactor = m_videoAspect;
+
+ delete [] yuv;
+}
+
+
+/************************************************
+ * HELPER FUNCTIONS *
+ ************************************************/
+
+QTime KXineWidget::msToTime(int msec)
+{
+ QTime t;
+ t = t.addMSecs(msec);
+ return t;
+}
+
+#ifdef USE_QT_ONLY
+QString KXineWidget::i18n(const char *text)
+{
+ return QApplication::tr(text);
+}
+#endif
+
+void KXineWidget::debugOut (QString qsDebug)
+{
+#ifdef USE_QT_ONLY
+ QString qsDebugging = QString ("Debug: ") + qsDebug +"\n";
+ printf ((const char *)qsDebugging);
+#else
+ kdDebug() << "KXineWidget: " << (const char *)qsDebug.ascii() << "\n";
+#endif
+}
+void KXineWidget::errorOut (QString qsError)
+{
+#ifdef USE_QT_ONLY
+ QString qsErroring = QString ("Error: ") + qsError+ "\n";
+ printf ((const char *)qsErroring);
+#else
+ kdError() << "KXineWidget: " << (const char *)qsError.ascii() << "\n";
+#endif
+}
+void KXineWidget::warningOut (QString qsWarning)
+{
+#ifdef USE_QT_ONLY
+ QString qsWarninging = QString ("Warning: ") + qsWarning + "\n";
+ printf ((const char *)qsWarninging);
+#else
+ kdWarning() << "KXineWidget: " << (const char *)qsWarning.ascii() << "\n";
+#endif
+}
+
+
+/************************************************************
+ * Helpers to convert yuy and yv12 frames to rgb *
+ * code from gxine modified for 32bit output *
+ * Copyright (C) 2000-2003 the xine project *
+ ************************************************************/
+
+void KXineWidget::yuy2Toyv12 (uint8_t *y, uint8_t *u, uint8_t *v, uint8_t *input, int width, int height)
+{
+
+ int i, j, w2;
+
+ w2 = width / 2;
+
+ for (i = 0; i < height; i += 2)
+ {
+ for (j = 0; j < w2; j++)
+ {
+ /*
+ * packed YUV 422 is: Y[i] U[i] Y[i+1] V[i]
+ */
+ *(y++) = *(input++);
+ *(u++) = *(input++);
+ *(y++) = *(input++);
+ *(v++) = *(input++);
+ }
+
+ /*
+ * down sampling
+ */
+
+ for (j = 0; j < w2; j++)
+ {
+ /*
+ * skip every second line for U and V
+ */
+ *(y++) = *(input++);
+ input++;
+ *(y++) = *(input++);
+ input++;
+ }
+ }
+}
+
+
+uchar* KXineWidget::yv12ToRgb (uint8_t *src_y, uint8_t *src_u, uint8_t *src_v, int width, int height)
+{
+ /*
+ * Create rgb data from yv12
+ */
+
+#define clip_8_bit(val) \
+{ \
+ if (val < 0) \
+ val = 0; \
+ else \
+ if (val > 255) val = 255; \
+}
+
+ int i, j;
+
+ int y, u, v;
+ int r, g, b;
+
+ int sub_i_uv;
+ int sub_j_uv;
+
+ int uv_width, uv_height;
+
+ uchar *rgb;
+
+ uv_width = width / 2;
+ uv_height = height / 2;
+
+ rgb = new uchar[(width * height * 4)]; //qt needs a 32bit align
+ if (!rgb)
+ {
+ // kdError(555) << "Not enough memory!" << endl;
+ return NULL;
+ }
+
+ for (i = 0; i < height; ++i)
+ {
+ /*
+ * calculate u & v rows
+ */
+ sub_i_uv = ((i * uv_height) / height);
+
+ for (j = 0; j < width; ++j)
+ {
+ /*
+ * calculate u & v columns
+ */
+ sub_j_uv = ((j * uv_width) / width);
+
+ /***************************************************
+ *
+ * Colour conversion from
+ * http://www.inforamp.net/~poynton/notes/colour_and_gamma/ColorFAQ.html#RTFToC30
+ *
+ * Thanks to Billy Biggs <vektor@dumbterm.net>
+ * for the pointer and the following conversion.
+ *
+ * R' = [ 1.1644 0 1.5960 ] ([ Y' ] [ 16 ])
+ * G' = [ 1.1644 -0.3918 -0.8130 ] * ([ Cb ] - [ 128 ])
+ * B' = [ 1.1644 2.0172 0 ] ([ Cr ] [ 128 ])
+ *
+ * Where in xine the above values are represented as
+ *
+ * Y' == image->y
+ * Cb == image->u
+ * Cr == image->v
+ *
+ ***************************************************/
+
+ y = src_y[(i * width) + j] - 16;
+ u = src_u[(sub_i_uv * uv_width) + sub_j_uv] - 128;
+ v = src_v[(sub_i_uv * uv_width) + sub_j_uv] - 128;
+
+ r = (int)((1.1644 * (double)y) + (1.5960 * (double)v));
+ g = (int)((1.1644 * (double)y) - (0.3918 * (double)u) - (0.8130 * (double)v));
+ b = (int)((1.1644 * (double)y) + (2.0172 * (double)u));
+
+ clip_8_bit (r);
+ clip_8_bit (g);
+ clip_8_bit (b);
+
+#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
+ rgb[(i * width + j) * 4 + 0] = b;
+ rgb[(i * width + j) * 4 + 1] = g;
+ rgb[(i * width + j) * 4 + 2] = r;
+ rgb[(i * width + j) * 4 + 3] = 0;
+#else
+ rgb[(i * width + j) * 4 + 3] = b;
+ rgb[(i * width + j) * 4 + 2] = g;
+ rgb[(i * width + j) * 4 + 1] = r;
+ rgb[(i * width + j) * 4 + 0] = 0;
+#endif
+
+ }
+ }
+
+ return rgb;
+}
diff --git a/kaffeine/src/player-parts/xine-part/kxinewidget.h b/kaffeine/src/player-parts/xine-part/kxinewidget.h
new file mode 100644
index 0000000..aac81b4
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/kxinewidget.h
@@ -0,0 +1,518 @@
+/*
+ * kxinewidget.h - a kde / qt api for xine-lib
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2005-2006 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef KXINEWIDGET_H
+#define KXINEWIDGET_H
+
+/* define this if you want to use QT only - disables post plugin support (except visualization)! */
+//#define USE_QT_ONLY 1
+
+/* Usage:
+ *
+ * KXineWidget m_xine = new KXineWidget(parent);
+ * m_xine->appendToQueue("the_best_song_of_the_world.mp3");
+ *
+ * You should at least connect to signalXineFatal(const QString&)!
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+/* forward declaration */
+class QWidget;
+class QString;
+class QStringList;
+class QMouseEvent;
+class QTimerEvent;
+class QTime;
+
+#include <qtimer.h>
+#include <qptrlist.h>
+#include <qthread.h>
+#include <X11/Xlib.h>
+#include <xine.h>
+
+
+#ifndef USE_QT_ONLY
+#include "postfilter.h"
+#else
+typedef int PostFilter; /* dummy type */
+#endif
+
+#ifdef HAVE_XCB
+#include <xcb/xcb.h>
+#endif
+
+#define SUPPORTED_PROTOCOLS "file,http,mms,mmst,rtsp,rtp,tcp,pnm,cdda,vcd,vcdo,dvd,dvb,pvr,v4l,net,vdr,smb"
+
+#define DEFAULT_TVTIME_CONFIG "tvtime:method=LinearBlend,enabled=1,pulldown=none,framerate_mode=half_top,judder_correction=0,use_progressive_frame_flag=1,chroma_filter=0,cheap_mode=1"
+
+#define DEFAULT_OSD_FONT_SIZE 18
+#define DEFAULT_OSD_DURATION 5000
+#define OSD_MESSAGE_LOW_PRIORITY 1
+#define OSD_MESSAGE_NORMAL_PRIORITY 2
+
+class KXineWidget : public QWidget, public QThread
+{
+
+ Q_OBJECT
+
+public:
+ KXineWidget(QWidget *parent=0, const char *name=0,
+ const QString& pathToConfigFile = QString::null, const QString& pathToLogoFile = QString::null,
+ const QString& audioDriver = QString::null, const QString& videoDriver = QString::null,
+ bool startManual = false, bool verbose = false);
+ ~KXineWidget();
+
+ enum Speed { Normal = 0, Pause, Fast1, Fast2, Slow1, Slow2, Undefined };
+
+ bool initXine(); /* call this only if you set startManual = true in the constructor */
+ bool isXineReady() const { return m_xineReady; }
+ bool isPlaying() const;
+ Speed getSpeed() const { return m_currentSpeed; }
+ QString getXineLog() const;
+
+ void setQueue(const QStringList& urls) { m_queue = urls; }
+ void appendToQueue(const QString& url) { m_queue.append(url); } /* file to play; call slotPlay() to play queue... */
+ void clearQueue() { m_queue.clear(); }
+ bool isQueueEmpty() const { return m_queue.empty(); }
+
+ void showOSDMessage(const QString& message, uint duration = DEFAULT_OSD_DURATION /* ms */, int priority = OSD_MESSAGE_NORMAL_PRIORITY);
+
+ /* stream info */
+ const QString& getURL() const { return m_trackURL; }
+ const QString& getTitle() const { return m_trackTitle; }
+ const QString& getArtist() const { return m_trackArtist; }
+ const QString& getAlbum() const { return m_trackAlbum; }
+ const QString& getTrackNumber() const { return m_trackNumber; } //may return an empty string with xine-lib 1.0
+ const QString& getGenre() const { return m_trackGenre; }
+ const QString& getYear() const { return m_trackYear; }
+ const QString& getComment() const { return m_trackComment; }
+ const QTime& getLength() const { return m_trackLength; }
+ const QString& getVideoCodec() const { return m_trackVideoCodec; }
+ QSize getVideoSize() const { return QSize(m_videoFrameWidth, m_videoFrameHeight); }
+ int getVideoWidth();
+ int getVideoHeight();
+ uint getVideoBitrate() const { return m_trackVideoBitrate; }
+ const QString& getAudioCodec() const { return m_trackAudioCodec; }
+ uint getAudioBitrate() const { return m_trackAudioBitrate; }
+ const QString& getSubtitleURL() const { return m_trackSubtitleURL; }
+ const QString& getSaveURL() const { return m_trackSaveURL; }
+ bool hasVideo() const { return m_trackHasVideo; }
+ bool hasAudio() const { return m_trackHasAudio; }
+ bool hasChapters() const { return m_trackHasChapters; }
+ bool hasSubtitleURL() const { return !m_trackSubtitleURL.isNull(); }
+ bool hasSaveURL() const { return !m_trackSaveURL.isNull(); }
+ bool isSeekable() const { return m_trackIsSeekable; }
+
+ uint getVolume() const; /* percent */
+ bool SoftwareMixing() const;
+ QTime getPlaytime() const;
+ uint getPosition() const; /* 0..65535 */
+
+ void savePosition(const int pos) { (pos > 0) ? m_savedPos = pos : m_savedPos = 0; }
+
+ /* plugin handling */
+ QStringList getAudioDrivers() const { return m_audioDriverList; }
+ QStringList getVideoDrivers() const { return m_videoDriverList; }
+ void getAutoplayPlugins(QStringList& pluginNames) const;
+ bool getAutoplayPluginURLS(const QString& name, QStringList& urls);
+ QStringList getVisualPlugins() const;
+
+#ifndef USE_QT_ONLY
+ void createDeinterlacePlugin(const QString& configString, QWidget* parent);
+ const QString getDeinterlaceConfig() const;
+ QStringList getVideoFilterNames() const;
+ QStringList getAudioFilterNames() const;
+ QStringList getAudioFilterConfig();
+ QStringList getVideoFilterConfig();
+#endif
+
+ QString getSupportedExtensions() const; /* get mime types xine can play */
+
+ void playNextChapter() const;
+ void playPreviousChapter() const;
+
+ /* config stuff */
+ void setStreamSaveDir(const QString& dir);
+ const QString getStreamSaveDir();
+ void setBroadcasterPort(const uint port);
+ void getVideoSettings(int& hue, int& sat, int& contrast, int& bright,
+ int& avOffset, int& spuOffset) const;
+ void getspuOffset(int& spuOffset) const;
+ /* disc drives devices*/
+ QString audiocdDevice() const;
+ QString vcdDevice() const;
+ QString dvdDevice() const;
+
+ /* dvd stuff */
+ uint currentDVDTitleNumber() const;
+ uint getDVDTitleCount() const;
+ uint currentDVDChapterNumber() const;
+ uint getDVDChapterCount() const;
+ uint currentDVDAngleNumber() const;
+ uint getDVDAngleCount() const;
+
+ /* take a screenshot */
+ QImage getScreenshot() const;
+ void getScreenshot(uchar*& rgb32BitData, int& videoWidth, int& videoHeight, double& scaleFactor) const;
+
+ /* get the xine engine, needed by the xine configuration dialog */
+ const xine_t* const getXineEngine() const;
+ void saveXineConfig();
+
+ /* for fullscreen */
+ void startMouseHideTimer();
+ void stopMouseHideTimer();
+
+ void globalPosChanged(); /* call this if global pos of parent was changed */
+
+signals:
+ void signalXineFatal(const QString& message); /** initXine() not successfull! **/
+ void signalXineError(const QString& message);
+ void signalXineMessage(const QString& message);
+ void signalXineStatus(const QString& status);
+ void signalXineReady();
+ void signalXinePlaying();
+
+ void signalHasChapters(bool);
+ void signalPlaybackFinished();
+ void signalNewChannels(const QStringList& audio, const QStringList& sub, int currentAudio, int currentSub);
+ void signalNewPosition(int, const QTime&);
+
+ void signalTitleChanged();
+ void signalVideoSizeChanged();
+ void signalLengthChanged();
+
+ void signalRightClick(const QPoint&); /* right-click on video window */
+ void signalLeftClick(const QPoint&);
+ void signalMiddleClick();
+ void signalDoubleClick();
+ void signalSyncVolume();
+
+ void signalDvbOSDHidden();
+
+public slots:
+ virtual void polish();
+
+ void slotPlay();
+ void slotStop();
+
+ void slotSetVolume(int);
+ void slotToggleMute();
+ void slotSpeedPause();
+ void slotSpeedNormal();
+ void slotSpeedFaster();
+ void slotSpeedSlower();
+ void slotSetVisualPlugin(const QString& name);
+ void slotSetAudioChannel(int);
+ void slotSetSubtitleChannel(int);
+ void slotSetFileSubtitles(QString);
+ void slotStartSeeking();
+ void slotSeekToPosition(int pos);
+ void slotSeekToPositionBlocking(int pos);
+ void slotSeekToTime(const QTime&);
+ void slotStopSeeking();
+ void slotEnableVideoFilters(bool enable);
+ void slotEnableAudioFilters(bool enable);
+ void slotEject();
+ void slotEnableAutoresize(bool enable);
+ void slotAspectRatioAuto();
+ void slotAspectRatio4_3();
+ void slotAspectRatioAnamorphic(); /* 16:9 */
+ void slotAspectRatioSquare(); /* 1:1 */
+ void slotAspectRatioDVB(); /* 2.11:1 */
+ void slotZoomIn();
+ void slotZoomOut();
+ void slotZoomOff();
+ void slotZoomOutX();
+ void slotZoomInX();
+ void slotZoomOutY();
+ void slotZoomInY();
+ void slotToggleDeinterlace();
+ void slotSetDeinterlaceConfig(const QString&);
+ void slotGetInfoDelayed();
+
+ /* disc drive devices */
+ void slotSetAudiocdDevice(const QString&);
+ void slotSetVcdDevice(const QString&);
+ void slotSetDvdDevice(const QString&);
+
+ void slotSetHue(int hue);
+ void slotSetSaturation(int sat);
+ void slotSetContrast(int contrast);
+ void slotSetBrightness(int bright);
+ void slotSetAVOffset(int av);
+ void slotSetSpuOffset(int spu);
+
+ void slotSetEq30(int val);
+ void slotSetEq60(int val);
+ void slotSetEq125(int val);
+ void slotSetEq250(int val);
+ void slotSetEq500(int val);
+ void slotSetEq1k(int val);
+ void slotSetEq2k(int val);
+ void slotSetEq4k(int val);
+ void slotSetEq8k(int val);
+ void slotSetEq16k(int val);
+ void slotSetVolumeGain(bool gain);
+
+ /* DVD Menus */
+ void slotMenuToggle();
+ void slotMenuTitle();
+ void slotMenuRoot();
+ void slotMenuSubpicture();
+ void slotMenuAudio();
+ void slotMenuAngle();
+ void slotMenuPart();
+ void slotDVDMenuLeft();
+ void slotDVDMenuRight();
+ void slotDVDMenuUp();
+ void slotDVDMenuDown();
+ void slotDVDMenuSelect();
+
+ /***** postprocess filters ****/
+ void slotCreateVideoFilter(const QString& name, QWidget* parent);
+ void slotCreateAudioFilter(const QString& name, QWidget* parent);
+ void slotDeleteVideoFilter(PostFilter* filter);
+ void slotDeleteAudioFilter(PostFilter* filter);
+ void slotRemoveAllVideoFilters();
+ void slotRemoveAllAudioFilters();
+
+protected slots:
+ void slotSendPosition();
+ void slotEmitLengthInfo();
+ void slotHideMouse();
+ void slotOSDHide();
+ void slotNoRecentMessage();
+
+protected:
+ void mouseMoveEvent(QMouseEvent*);
+ void mousePressEvent(QMouseEvent*);
+ void timerEvent(QTimerEvent*);
+ void mouseDoubleClickEvent(QMouseEvent*);
+ void wheelEvent(QWheelEvent*);
+ void initOSD();
+ virtual void run();
+
+private:
+#ifndef HAVE_XCB
+ bool x11Event(XEvent *);
+#else
+ void paintEvent(QPaintEvent *);
+#endif
+ bool unhandledStreamsPresent();
+
+ /********* callbacks and threads ************/
+ static void destSizeCallback(void* p, int video_width, int video_height, double video_aspect,
+ int* dest_width, int* dest_height, double* dest_aspect);
+
+ static void frameOutputCallback(void* p, int video_width, int video_height, double video_aspect,
+ int* dest_x, int* dest_y, int* dest_width, int* dest_height,
+ double* dest_aspect, int* win_x, int* win_y);
+
+ static void videoDriverChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void audioDriverChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void audioMixerMethodChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void showOSDMessagesChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void sizeForOSDMessagesChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void fontForOSDMessagesChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void monitorXResChangedCallback(void* p, xine_cfg_entry_t* entry);
+ static void monitorYResChangedCallback(void* p, xine_cfg_entry_t* entry);
+
+ static void xineEventListener(void* p, const xine_event_t*);
+
+protected:
+ void sendXineError();
+ QTime getLengthInfo();
+#ifndef USE_QT_ONLY
+ void wireVideoFilters();
+ void unwireVideoFilters();
+ void wireAudioFilters();
+ void unwireAudioFilters();
+#endif
+
+ /* HELPER FUNCTIONS */
+public:
+#ifdef USE_QT_ONLY
+ static QString i18n(const char *text);
+#endif
+ static void debugOut(QString);
+ static void errorOut(QString);
+ static void warningOut(QString);
+ static QTime msToTime(int msec);
+ static void yuy2Toyv12(uint8_t *y, uint8_t *u, uint8_t *v, uint8_t *input, int width, int height);
+ static uchar *yv12ToRgb(uint8_t *src_y, uint8_t *src_u, uint8_t *src_v, int width, int height);
+
+protected:
+ QStringList m_queue;
+
+ int seekThreadPos;
+ int seekThreadTime;
+ bool seekThreadPause;
+ bool m_startXineManual;
+ bool m_xineReady;
+ QString m_logoFile;
+ QString m_preferedAudio;
+ QString m_preferedVideo;
+ bool m_xineVerbose;
+ QString m_configFilePath;
+ QStringList m_audioDriverList;
+ QStringList m_videoDriverList;
+
+ /*x11*/
+#ifndef HAVE_XCB
+ Display *connection;
+#else
+ xcb_connection_t *connection;
+#endif
+
+ /*xine*/
+#ifndef HAVE_XCB
+ x11_visual_t m_x11Visual;
+#else
+ xcb_visual_t m_x11Visual;
+#endif
+ xine_t* m_xineEngine;
+ xine_audio_port_t* m_audioDriver;
+ xine_video_port_t* m_videoDriver;
+ xine_stream_t* m_xineStream;
+ xine_event_queue_t* m_eventQueue;
+ xine_osd_t* m_osd;
+ bool m_osdUnscaled;
+ bool m_osdShow;
+ int m_osdSize;
+ char* m_osdFont;
+ char** m_audioChoices;
+ char* m_audioInfo;
+ char** m_videoChoices;
+ char* m_videoInfo;
+ char* m_mixerInfo;
+ char* m_osdShowInfo;
+ char** m_osdSizeOptions;
+ char* m_osdSizeInfo;
+ char* m_osdFontInfo;
+ double monitorXRes, monitorYRes;
+ char *xResInfo;
+ char *yResInfo;
+
+#ifndef USE_QT_ONLY
+ /*postfilter*/
+ QPtrList<PostFilter> m_videoFilterList;
+ bool m_videoFiltersEnabled;
+ QPtrList<PostFilter> m_audioFilterList;
+ bool m_audioFiltersEnabled;
+ PostFilter* m_deinterlaceFilter;
+ bool m_deinterlaceEnabled;
+ PostFilter* m_visualPlugin;
+#else
+ xine_post_t* m_xinePost;
+ xine_post_out_t* m_postAudioSource;
+ xine_post_in_t* m_postInput;
+#endif
+
+ QString m_audioDriverName;
+ QString m_videoDriverName;
+ QString m_visualPluginName;
+
+ int m_videoFrameWidth;
+ int m_videoFrameHeight;
+ double m_videoAspect;
+ int m_globalX;
+ int m_globalY;
+
+ Speed m_currentSpeed;
+ QString m_xineMessage;
+ QString m_xineError;
+ QString m_statusString;
+ bool m_softwareMixer;
+ bool m_volumeGain;
+ double m_displayRatio;
+ QString m_cachedCDPath, m_cachedVCDPath, m_cachedDVDPath;
+ QSize m_newParentSize;
+ int m_currentZoom;
+ int m_currentZoomX, m_currentZoomY;
+ QStringList m_audioCh;
+ QStringList m_subCh;
+ int m_currentAudio, m_currentSub;
+ int m_savedPos;
+ bool m_autoresizeEnabled;
+ bool m_DVDButtonEntered;
+ QString m_newMRLReference;
+
+ QTimer m_posTimer;
+ QTimer m_lengthInfoTimer;
+ uint m_lengthInfoTries;
+ QTimer m_mouseHideTimer;
+ QTimer m_osdTimer;
+ QTimer m_recentMessagesTimer;
+
+ QString m_trackURL;
+ QString m_trackTitle;
+ QString m_trackArtist;
+ QString m_trackAlbum;
+ QString m_trackNumber;
+ QString m_trackGenre;
+ QString m_trackYear;
+ QString m_trackComment;
+ QTime m_trackLength;
+ QString m_trackVideoCodec;
+ uint m_trackVideoBitrate;
+ QString m_trackAudioCodec;
+ uint m_trackAudioBitrate;
+ QString m_trackSubtitleURL;
+ QString m_trackSaveURL;
+ bool m_trackHasVideo;
+ bool m_trackHasAudio;
+ bool m_trackHasChapters;
+ bool m_trackIsSeekable;
+
+ /* dvb */
+signals:
+ void stopDvb();
+
+public:
+ QString TimeShiftFilename;
+
+public slots:
+ void setDvb( const QString &pipeName, const QString &chanName, int haveVideo );
+ void setDvbCurrentNext( const QString &channelName, const QStringList &list );
+ bool openDvb();
+ bool playDvb();
+ void slotPlayTimeShift();
+ void dvbShowOSD();
+ void dvbHideOSD();
+
+private:
+ QString m_dvbChannelName;
+ bool m_dvbSaveTitle;
+ int dvbHaveVideo;
+ QTimer dvbOSDHideTimer;
+ xine_osd_t *dvbOSD;
+ QStringList dvbCurrentNext;
+ unsigned int dvbColor[256];
+ unsigned char dvbTrans[256];
+ void initDvbPalette();
+};
+
+#endif /* KXINEWIDGET_H */
diff --git a/kaffeine/src/player-parts/xine-part/positionslider.cpp b/kaffeine/src/player-parts/xine-part/positionslider.cpp
new file mode 100644
index 0000000..9091dbe
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/positionslider.cpp
@@ -0,0 +1,113 @@
+/*
+ * positionslider.cpp
+ *
+ * Copyright (C) 2004-2005 Giorgos Gousios
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2004-2005 Miguel Freitas
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <math.h>
+
+#include "positionslider.h"
+#include "positionslider.moc"
+
+
+PositionSlider::PositionSlider(Qt::Orientation o, QWidget *parent, const char* name) :
+ QSlider(o, parent, name), m_userChange(false)
+{
+ connect(this, SIGNAL(sliderPressed()), this ,SLOT(slotSliderPressed()));
+ connect(this, SIGNAL(sliderReleased()), this, SLOT(slotSliderReleased()));
+ installEventFilter(this);
+}
+
+
+
+PositionSlider::~PositionSlider()
+{
+}
+
+
+
+void PositionSlider::setPosition(int val, bool changePosition)
+{
+ if(!m_userChange)
+ setValue(val);
+ if(changePosition) {
+ setValue(val);
+ emit sliderMoved(val);
+ }
+}
+
+
+
+void PositionSlider::slotSliderPressed()
+{
+ m_userChange = true;
+ emit signalStartSeeking();
+}
+
+
+
+void PositionSlider::slotSliderReleased()
+{
+ emit sliderLastMove(this->value());
+ emit signalStopSeeking();
+ m_userChange = false;
+}
+
+
+
+void PositionSlider::wheelEvent(QWheelEvent* e)
+{
+ float offset = log10( QABS(e->delta()) ) / 0.002;
+ int newVal = 0;
+ if (e->delta()>0)
+ newVal = value() - int(offset);
+ else
+ newVal = value() + int(offset);
+ if (newVal < 0) newVal = 0;
+ //setPosition(newVal, true);
+ emit sliderLastMove( newVal );
+ e->accept();
+}
+
+
+
+bool PositionSlider::eventFilter(QObject *obj, QEvent *ev)
+{
+ if( obj == this && (ev->type() == QEvent::MouseButtonPress || ev->type() == QEvent::MouseButtonDblClick) ) {
+ QMouseEvent *e = (QMouseEvent *)ev;
+ QRect r = sliderRect();
+
+ if( r.contains( e->pos() ) || e->button() != LeftButton )
+ return false;
+
+ int range = maxValue() - minValue();
+ int pos = (orientation() == Horizontal) ? e->pos().x() : e->pos().y();
+ int maxpos = (orientation() == Horizontal) ? width() : height();
+ int value = pos * range / maxpos + minValue();
+
+ if (QApplication::reverseLayout())
+ value = maxValue() - (value - minValue());
+
+ setPosition(value, true);
+ return true;
+ }
+ else {
+ return false;
+ }
+}
diff --git a/kaffeine/src/player-parts/xine-part/positionslider.h b/kaffeine/src/player-parts/xine-part/positionslider.h
new file mode 100644
index 0000000..34c78e6
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/positionslider.h
@@ -0,0 +1,55 @@
+/*
+ * positionslider.h
+ *
+ * Copyright (C) 2004-2005 Giorgos Gousios
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2004-2005 Miguel Freitas
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef POSITIONSLIDER_H
+#define POSITIONSLIDER_H
+
+#include <qslider.h>
+
+class PositionSlider : public QSlider
+{
+ Q_OBJECT
+
+ public:
+ PositionSlider(Qt::Orientation, QWidget * parent = 0, const char* name = 0);
+ virtual ~PositionSlider();
+
+ void setPosition(int, bool);
+
+signals:
+ void signalStartSeeking();
+ void signalStopSeeking();
+ void sliderLastMove(int);
+
+ protected:
+ virtual void wheelEvent(QWheelEvent* e);
+ bool eventFilter(QObject *obj, QEvent *ev);
+
+ private slots:
+ void slotSliderPressed();
+ void slotSliderReleased();
+
+ private:
+ bool m_userChange;
+};
+
+#endif /* POSITIONSLIDER_H */
diff --git a/kaffeine/src/player-parts/xine-part/postfilter.cpp b/kaffeine/src/player-parts/xine-part/postfilter.cpp
new file mode 100644
index 0000000..32c898c
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/postfilter.cpp
@@ -0,0 +1,398 @@
+/*
+ * postfilter.cpp - wrapper for xine's postprocessing filters
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2003-2005 Miguel Freitas
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <kpushbutton.h>
+#include <kseparator.h>
+#include <klocale.h>
+#include <kdebug.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qwidget.h>
+#include <qobject.h>
+#include <qstring.h>
+#include <qgroupbox.h>
+#include <qtextedit.h>
+
+#include <stdio.h>
+
+#include "postfilter.h"
+
+PostFilter::PostFilter(const QString& name, xine_t* engine, xine_audio_port_t* audioDriver,
+ xine_video_port_t* videoDriver, QWidget *parent) : QObject(parent), m_data(NULL), m_groupBox(NULL)
+{
+ m_filterName = name;
+ kdDebug() << "PostFilter: Create Postprocessing Filter: " << m_filterName << endl;
+
+ m_xineEngine = engine;
+
+ m_xinePost = xine_post_init(m_xineEngine, m_filterName.ascii(), 0, &audioDriver, &videoDriver );
+ if(m_xinePost)
+ {
+ xine_post_in_t* inputAPI = NULL;
+
+ m_groupBox = new QGroupBox(name, parent);
+ m_groupBox->setSizePolicy(QSizePolicy (QSizePolicy::Minimum, QSizePolicy::Fixed));
+ QGridLayout* grid = new QGridLayout(m_groupBox, 2, 2);
+ grid->setMargin( 20 );
+ grid->setSpacing( 5 );
+ int row = 0;
+
+ if ((inputAPI = (xine_post_in_t*)xine_post_input(m_xinePost, const_cast<char*>("parameters"))))
+ {
+ m_xinePostAPI = (xine_post_api_t*)inputAPI->data;
+ m_xinePostDescr = m_xinePostAPI->get_param_descr();
+ m_xinePostParameter = m_xinePostDescr->parameter;
+
+ m_data = new char[m_xinePostDescr->struct_size];
+ m_xinePostAPI->get_parameters(m_xinePost, m_data);
+
+ QLabel* descr;
+
+ while (m_xinePostParameter->type != POST_PARAM_TYPE_LAST)
+ {
+ kdDebug() << "PostFilter: Parameter: " << m_xinePostParameter->name << endl;
+ if (m_xinePostParameter->readonly) continue;
+
+ switch (m_xinePostParameter->type)
+ {
+ case POST_PARAM_TYPE_INT:
+ {
+ if (m_xinePostParameter->enum_values)
+ {
+ PostFilterParameterCombo* parameter = new
+ PostFilterParameterCombo(m_xinePostParameter->name, m_xinePostParameter->offset,
+ *(int*)(m_data+m_xinePostParameter->offset),
+ m_xinePostParameter->enum_values, m_groupBox );
+ connect(parameter, SIGNAL(signalIntValue(int, int)), this, SLOT(slotApplyIntValue(int, int)));
+ m_parameterList.append(parameter);
+
+ grid->addWidget(parameter->getWidget(), row, 0);
+ }
+ else
+ {
+ PostFilterParameterInt* parameter = new
+ PostFilterParameterInt(m_xinePostParameter->name, m_xinePostParameter->offset,
+ *(int*)(m_data+m_xinePostParameter->offset),
+ (int)m_xinePostParameter->range_min, (int)m_xinePostParameter->range_max,
+ m_groupBox);
+
+ connect(parameter, SIGNAL( signalIntValue(int, int)), this, SLOT( slotApplyIntValue(int, int)));
+ m_parameterList.append(parameter);
+
+ grid->addWidget(parameter->getWidget(), row, 0);
+ }
+ break;
+ }
+ case POST_PARAM_TYPE_DOUBLE:
+ {
+ PostFilterParameterDouble* parameter = new
+ PostFilterParameterDouble(m_xinePostParameter->name, m_xinePostParameter->offset,
+ *(double*)(m_data+m_xinePostParameter->offset),
+ (double)m_xinePostParameter->range_min, (double)m_xinePostParameter->range_max,
+ m_groupBox);
+
+ connect(parameter, SIGNAL(signalDoubleValue(int, double)), this, SLOT(slotApplyDoubleValue(int, double)));
+ m_parameterList.append(parameter);
+
+ grid->addWidget(parameter->getWidget(), row, 0);
+ break;
+ }
+ case POST_PARAM_TYPE_CHAR:
+ {
+ PostFilterParameterChar* parameter = new
+ PostFilterParameterChar(m_xinePostParameter->name, m_xinePostParameter->offset,
+ (char*)(m_data+m_xinePostParameter->offset), m_xinePostParameter->size,
+ m_groupBox);
+
+ connect( parameter, SIGNAL(signalCharValue(int, const QString&)), this, SLOT(slotApplyCharValue(int, const QString&)));
+ m_parameterList.append(parameter);
+
+ grid->addWidget(parameter->getWidget(), row, 0);
+ break;
+ }
+ case POST_PARAM_TYPE_STRING:
+ case POST_PARAM_TYPE_STRINGLIST: break; /* not implemented */
+ case POST_PARAM_TYPE_BOOL:
+ {
+ PostFilterParameterBool* parameter = new
+ PostFilterParameterBool(m_xinePostParameter->name, m_xinePostParameter->offset,
+ (bool) *(int*)(m_data+m_xinePostParameter->offset), m_groupBox);
+
+ connect(parameter, SIGNAL(signalIntValue(int, int)), this, SLOT(slotApplyIntValue(int, int)));
+ m_parameterList.append(parameter);
+
+ grid->addWidget(parameter->getWidget(), row, 0);
+ break;
+ }
+ default: break;
+ }
+
+ descr = new QLabel(QString::fromUtf8(m_xinePostParameter->description ), m_groupBox);
+ descr->setAlignment(QLabel::WordBreak | QLabel::AlignVCenter);
+ grid->addWidget(descr, row, 1);
+ row++;
+ m_xinePostParameter++;
+ }
+ }
+ KSeparator* sep = new KSeparator(KSeparator::Horizontal, m_groupBox);
+ grid->addMultiCellWidget(sep, row, row, 0, 1);
+ row++;
+ KPushButton* deleteButton = new KPushButton(i18n("Delete Filter"), m_groupBox);
+ deleteButton->setSizePolicy (QSizePolicy (QSizePolicy::Minimum, QSizePolicy::Fixed));
+ connect(deleteButton, SIGNAL(clicked()), this, SLOT( slotDeletePressed()));
+ grid->addWidget(deleteButton, row, 0);
+
+ if(inputAPI)
+ {
+ KPushButton* helpButton = new KPushButton(i18n("Help"), m_groupBox);
+ helpButton->setSizePolicy(QSizePolicy (QSizePolicy::Minimum, QSizePolicy::Fixed));
+ connect(helpButton, SIGNAL(clicked()), this, SLOT(slotHelpPressed()));
+ grid->addWidget(helpButton, row, 1);
+ }
+
+ if (parent)
+ m_groupBox->show();
+ }
+}
+
+PostFilter::~PostFilter()
+{
+ kdDebug() << "PostFilter: Delete Postprocessing Filter: " << m_filterName << endl;
+ if(m_xinePost)
+ {
+ delete m_groupBox;
+ delete [] m_data;
+ xine_post_dispose(m_xineEngine, m_xinePost);
+ }
+}
+
+void PostFilter::slotApplyIntValue(int offset, int val)
+{
+ kdDebug() << "PostFilter: " << m_filterName << " Apply integer value " << val << " on offset " << offset << endl;
+ *(int*)(m_data+offset) = val;
+ m_xinePostAPI->set_parameters(m_xinePost, m_data);
+}
+
+void PostFilter::slotApplyDoubleValue(int offset, double val)
+{
+ kdDebug() << "PostFilter: " << m_filterName << " Apply double value " << val << " on offset " << offset << endl;
+ *(double*)(m_data+offset) = val;
+ m_xinePostAPI->set_parameters(m_xinePost, m_data);
+}
+
+void PostFilter::slotApplyCharValue(int offset, const QString& val)
+{
+ kdDebug() << "PostFilter: " << m_filterName << " Apply char value '" << val << "' on offset " << offset << endl;
+ sprintf((char *)(m_data+offset), "%s", val.latin1());
+ m_xinePostAPI->set_parameters(m_xinePost, m_data);
+}
+
+xine_post_in_t* PostFilter::getInput() const
+{
+ xine_post_in_t* input = NULL;
+
+ kdDebug() << "PostFilter: Get input" << endl;
+ if(m_xinePost)
+ {
+ /* look for known input ports */
+ input = xine_post_input(m_xinePost, const_cast<char*>("video"));
+ if( !input )
+ input = xine_post_input(m_xinePost, const_cast<char*>("video in") );
+ if( !input )
+ input = xine_post_input(m_xinePost, const_cast<char*>("audio"));
+ if( !input )
+ input = xine_post_input(m_xinePost, const_cast<char*>("audio in"));
+ }
+ return input;
+}
+
+
+xine_post_out_t* PostFilter::getOutput() const
+{
+ xine_post_out_t* output = NULL;
+
+ kdDebug() << "PostFilter: Get output" << endl;
+
+ if(m_xinePost)
+ {
+ /* look for known output ports */
+ output = xine_post_output(m_xinePost, const_cast<char*>("video"));
+ if( !output )
+ output = xine_post_output(m_xinePost, const_cast<char*>("video out"));
+ if( !output )
+ output = xine_post_output(m_xinePost, const_cast<char*>("audio"));
+ if( !output )
+ output = xine_post_output(m_xinePost, const_cast<char*>("audio out"));
+
+ if(!output)
+ {
+ /* fallback to the first available output port.
+ * some video plugins have funky port names :)
+ */
+ const char *const *outs = xine_post_list_outputs(m_xinePost);
+ return (xine_post_out_t*)xine_post_output(m_xinePost, (char *) *outs);
+ }
+ }
+
+ return output;
+}
+
+
+void PostFilter::slotHelpPressed()
+{
+ kdDebug() << "PostFilter: Help pressed" << endl;
+
+ PostFilterHelp* filterHelp = new PostFilterHelp(NULL, m_filterName.ascii(), QString::fromUtf8(m_xinePostAPI->get_help()));
+ filterHelp->exec();
+
+ delete filterHelp;
+}
+
+
+QString PostFilter::getConfig()
+{
+ /*
+ * returns a string like "filtername:parameter=value,parameter=value,..."
+ */
+
+ QString configString;
+ QTextOStream configStream(&configString);
+
+ configStream << m_filterName << ":";
+ for (uint i = 0; i < m_parameterList.count(); i++)
+ {
+ configStream << m_parameterList.at( i )->name() << "=" << m_parameterList.at( i )->getValue();
+ if( i != m_parameterList.count()-1 )
+ configStream << ",";
+ }
+
+ kdDebug() << "PostFilter: GetConfig " << configString << endl;
+
+ return configString;
+}
+
+void PostFilter::setConfig(const QString &configString)
+{
+ /*
+ * expects a string like filtername:parameter=value,parameter=value,...
+ * or filtername:parameter="value",parameter="value",...
+ */
+
+ kdDebug() << "PostFilter: SetConfig " << configString << endl;
+
+ QString configStr;
+ if (configString.section(':',0,0) == m_filterName)
+ {
+ configStr = configString.section(':',1,1);
+ }
+ else
+ {
+ kdWarning() << "PostFilter: Config string doesn't match filter name " << m_filterName << endl;
+ kdDebug() << "PostFilter: Don't apply new configuration" << endl;
+ return;
+ }
+
+ for( int i = 0; i < configStr.contains(',') + 1; i++ )
+ {
+ QString parameterConfig = configStr.section(',', i, i);
+ QString parameterName = parameterConfig.section('=', 0, 0);
+ QString parameterValue = parameterConfig.section('=', 1, 1);
+ parameterValue = parameterValue.remove('"');
+
+ for (uint j = 0; j < m_parameterList.count(); j++)
+ {
+ if(parameterName == m_parameterList.at(j)->name())
+ {
+ kdDebug() << "PostFilter: Set parameter '" << parameterName << "' to value '" << parameterValue << "'" << endl;
+ m_parameterList.at(j)->setValue(parameterValue);
+ }
+ }
+ }
+}
+
+PostFilterParameterInt::PostFilterParameterInt(const QString& name, int offset, int value, int min, int max, QWidget* parent)
+ : PostFilterParameter (name, offset, parent )
+{
+ m_numInput = new KIntNumInput(value, parent);
+ m_numInput->setRange( min, max, 1, false);
+ connect(m_numInput, SIGNAL(valueChanged(int)), this, SLOT(slotIntValue(int)));
+}
+
+PostFilterParameterDouble::PostFilterParameterDouble(const QString& name, int offset, double value, double min, double max, QWidget* parent)
+ : PostFilterParameter (name, offset, parent )
+{
+ m_numInput = new KDoubleNumInput(parent);
+ m_numInput->setValue(value);
+ m_numInput->setRange(min, max, 0.01, false);
+ connect(m_numInput, SIGNAL(valueChanged( double)), this, SLOT(slotDoubleValue( double)));
+}
+
+PostFilterParameterChar::PostFilterParameterChar(const QString& name, int offset, char *value, int size, QWidget* parent)
+ : PostFilterParameter (name, offset, parent )
+{
+ m_charInput = new KLineEdit(value, parent);
+ m_charInput->setMaxLength(size);
+ connect(m_charInput, SIGNAL(returnPressed(const QString&)), this, SLOT(slotCharValue(const QString&)));
+}
+
+PostFilterParameterCombo::PostFilterParameterCombo(const QString& name, int offset, int value, char **enums, QWidget* parent)
+ : PostFilterParameter (name, offset, parent)
+{
+ m_comboBox = new KComboBox(parent);
+ for (int i = 0; enums[i]; i++)
+ {
+ m_comboBox->insertItem(enums[i]);
+ }
+ m_comboBox->setCurrentItem(value);
+ connect(m_comboBox, SIGNAL( activated(int)), this, SLOT( slotIntValue(int)));
+}
+
+PostFilterParameterBool::PostFilterParameterBool(const QString& name, int offset, bool value, QWidget* parent)
+ : PostFilterParameter (name, offset, parent )
+{
+ m_checkBox = new QCheckBox(parent);
+ m_checkBox->setChecked(value);
+ connect(m_checkBox, SIGNAL(toggled(bool)), this, SLOT(slotBoolValue( bool)));
+}
+
+PostFilterHelp::PostFilterHelp(QWidget *parent, const char *name, const QString& text)
+ : KDialogBase( parent, name, true, QString(name) + " - " + i18n("Help"), KDialogBase::Close )
+{
+ setInitialSize( QSize(500,500) );
+
+ QWidget* mainWidget = makeMainWidget();
+ QGridLayout* grid = new QGridLayout( mainWidget, 1, 1 );
+ grid->setSpacing( 5 );
+
+ //QString help = QString::fromUtf8(text);
+ m_textEdit = new QTextEdit(text, QString::null, mainWidget, name);
+ m_textEdit->setReadOnly(true);
+ grid->addWidget(m_textEdit, 0, 0);
+}
+
+
+PostFilterHelp::~PostFilterHelp()
+{
+ delete m_textEdit;
+}
+
+#include "postfilter.moc"
diff --git a/kaffeine/src/player-parts/xine-part/postfilter.h b/kaffeine/src/player-parts/xine-part/postfilter.h
new file mode 100644
index 0000000..ce04359
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/postfilter.h
@@ -0,0 +1,229 @@
+/*
+ * postfilter.h - wrapper for xine's postprocessing filters
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2003-2005 Miguel Freitas
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef POSTFILTER_H
+#define POSTFILTER_H
+
+/* forward declaration */
+class QWidget;
+class QObject;
+class QString;
+class QGroupBox;
+class QTextEdit;
+class KPushButton;
+
+#include <klineedit.h>
+#include <knuminput.h>
+#include <kcombobox.h>
+#include <kdialogbase.h>
+
+#include <qcheckbox.h>
+
+#include <xine.h>
+
+
+class PostFilterParameter : public QObject
+{
+ Q_OBJECT
+public:
+ PostFilterParameter(const QString& name, int offset, QWidget* parent)
+ : QObject(parent, name.ascii()), m_offset(offset)
+ {}
+ ~PostFilterParameter() {};
+
+ virtual void setValue( const QString& ) = 0;
+ virtual QString getValue() = 0;
+ virtual QWidget *getWidget() = 0;
+
+protected:
+ int m_offset;
+};
+
+
+class PostFilterParameterInt : public PostFilterParameter
+{
+ Q_OBJECT
+public:
+ PostFilterParameterInt(const QString& name, int offset, int value, int min, int max, QWidget* parent);
+ ~PostFilterParameterInt() {};
+
+ void setValue( const QString &value )
+ { int i = value.toInt(); m_numInput->setValue(i); slotIntValue(i); }
+ QString getValue()
+ { QString s; s.sprintf("%d", m_numInput->value()); return s; }
+ QWidget *getWidget() { return m_numInput; }
+
+signals:
+ void signalIntValue( int, int );
+
+public slots:
+ void slotIntValue(int val) { emit signalIntValue(m_offset, val); }
+
+private:
+ KIntNumInput* m_numInput;
+};
+
+
+class PostFilterParameterDouble : public PostFilterParameter
+{
+ Q_OBJECT
+public:
+ PostFilterParameterDouble(const QString& name, int offset, double value, double min, double max, QWidget* parent);
+ ~PostFilterParameterDouble() {};
+
+ void setValue( const QString &value )
+ { double d = value.toDouble(); m_numInput->setValue(d); slotDoubleValue(d); }
+ QString getValue()
+ { QString s; s.sprintf("%lf",m_numInput->value()); return s; }
+ QWidget *getWidget() { return m_numInput; }
+
+signals:
+ void signalDoubleValue(int, double);
+
+public slots:
+ void slotDoubleValue(double val) { emit signalDoubleValue(m_offset, val); }
+
+private:
+ KDoubleNumInput* m_numInput;
+};
+
+
+class PostFilterParameterChar : public PostFilterParameter
+{
+ Q_OBJECT
+public:
+ PostFilterParameterChar(const QString& name, int offset, char *value, int size, QWidget* parent);
+ ~PostFilterParameterChar() {};
+
+ void setValue(const QString &value)
+ { m_charInput->setText(value); slotCharValue(value); }
+ QString getValue() { return m_charInput->text(); }
+ QWidget *getWidget() { return m_charInput; }
+
+signals:
+ void signalCharValue(int, const QString&);
+
+public slots:
+ void slotCharValue(const QString& val) { emit signalCharValue(m_offset, val); }
+
+private:
+ KLineEdit* m_charInput;
+};
+
+
+class PostFilterParameterCombo : public PostFilterParameter
+{
+ Q_OBJECT
+public:
+ PostFilterParameterCombo(const QString& name, int offset, int value, char **enums, QWidget* parent);
+ ~PostFilterParameterCombo() {};
+
+ void setValue(const QString &value) { m_comboBox->setCurrentItem(value); slotIntValue(m_comboBox->currentItem()); }
+ QString getValue() { return m_comboBox->currentText(); }
+ QWidget *getWidget() { return m_comboBox; }
+
+signals:
+ void signalIntValue(int, int);
+
+public slots:
+ void slotIntValue(int val) { emit signalIntValue(m_offset, val); }
+
+private:
+ KComboBox* m_comboBox;
+};
+
+
+class PostFilterParameterBool : public PostFilterParameter
+{
+ Q_OBJECT
+public:
+ PostFilterParameterBool(const QString& name, int offset, bool value, QWidget* parent);
+ ~PostFilterParameterBool() {};
+
+ void setValue(const QString &value)
+ { bool b = (bool)value.toInt(); m_checkBox->setChecked(b); slotBoolValue(b); }
+ QString getValue()
+ { QString s; s.sprintf("%d",(int)m_checkBox->isOn()); return s; }
+ QWidget *getWidget() { return m_checkBox; }
+
+signals:
+ void signalIntValue(int, int);
+
+public slots:
+ void slotBoolValue(bool val) { emit signalIntValue(m_offset, (int)val); }
+
+private:
+ QCheckBox* m_checkBox;
+};
+
+
+class PostFilterHelp : public KDialogBase
+{
+ Q_OBJECT
+public:
+ PostFilterHelp(QWidget *parent=0, const char *name=0, const QString& text = QString::null);
+ ~PostFilterHelp();
+
+private:
+ QTextEdit *m_textEdit;
+};
+
+
+class PostFilter : public QObject
+{
+ Q_OBJECT
+public:
+ PostFilter(const QString& name, xine_t* engine, xine_audio_port_t* audioDriver,
+ xine_video_port_t* videoDriver, QWidget *parent);
+ ~PostFilter();
+
+ xine_post_in_t* getInput() const;
+ xine_post_out_t* getOutput() const;
+ void setConfig(const QString &);
+ QString getConfig();
+
+
+signals:
+ void signalDeleteMe( PostFilter* me );
+
+
+private slots:
+ void slotDeletePressed() { emit signalDeleteMe(this); }
+ void slotApplyIntValue(int offset, int val);
+ void slotApplyDoubleValue(int offset, double val);
+ void slotApplyCharValue(int offset, const QString& val);
+ void slotHelpPressed();
+
+private:
+ xine_t* m_xineEngine;
+ xine_post_t* m_xinePost;
+ xine_post_api_t* m_xinePostAPI;
+ xine_post_api_descr_t* m_xinePostDescr;
+ xine_post_api_parameter_t* m_xinePostParameter;
+ char* m_data;
+
+ QGroupBox* m_groupBox;
+ QString m_filterName;
+
+ QPtrList<PostFilterParameter> m_parameterList;
+};
+
+#endif /* POSTFILTER_H */
diff --git a/kaffeine/src/player-parts/xine-part/screenshotpreview.cpp b/kaffeine/src/player-parts/xine-part/screenshotpreview.cpp
new file mode 100644
index 0000000..300ff83
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/screenshotpreview.cpp
@@ -0,0 +1,70 @@
+/*
+ * screenshotpreview.cpp
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <kglobalsettings.h>
+
+#include <qpainter.h>
+#include <qwidget.h>
+#include <qimage.h>
+
+#include "screenshotpreview.h"
+#include "screenshotpreview.moc"
+
+
+ScreenshotPreview::ScreenshotPreview(const QImage& img, QWidget *parent, const char *name )
+ : KPreviewWidgetBase(parent,name)
+{
+ setMinimumWidth(200);
+ m_previewImg = img.copy(); /* deep copy */
+}
+
+ScreenshotPreview::~ScreenshotPreview()
+{
+}
+
+void ScreenshotPreview::showPreview(const KURL&) /* reimplemented to do nothing */
+{
+}
+
+void ScreenshotPreview::clearPreview() /* reimplemented to do nothing */
+{
+}
+
+/* show preview picture */
+
+void ScreenshotPreview::paintEvent(QPaintEvent*)
+{
+ int imgHeight, posy;
+
+ imgHeight = (int)((double) m_previewImg.height() / m_previewImg.width() * (width()-5));
+ posy = (height() - imgHeight) / 2;
+
+ QString info = QString::number(m_previewImg.width()) + "x" + QString::number(m_previewImg.height());
+
+ QFont font = KGlobalSettings::generalFont();
+ font.setPointSize(10);
+ QFontMetrics met(font);
+
+ QPainter painter(this);
+ painter.drawImage(QRect(5, posy, width(), imgHeight), m_previewImg);
+
+ painter.setFont(font);
+ painter.drawText((width()-met.width(info))/2, posy + imgHeight + 20, info);
+}
diff --git a/kaffeine/src/player-parts/xine-part/screenshotpreview.h b/kaffeine/src/player-parts/xine-part/screenshotpreview.h
new file mode 100644
index 0000000..d3a62de
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/screenshotpreview.h
@@ -0,0 +1,52 @@
+/*
+ * screenshotpreview.h
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SCREENSHOTPREVIEW_H
+#define SCREENSHOTPREVIEW_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kpreviewwidgetbase.h>
+
+class QImage;
+class QWidget;
+
+class ScreenshotPreview : public KPreviewWidgetBase
+{
+ Q_OBJECT
+public:
+ ScreenshotPreview(const QImage& img, QWidget *parent=0, const char *name=0);
+ ~ScreenshotPreview();
+
+public slots:
+ virtual void showPreview(const KURL&);
+ virtual void clearPreview();
+
+protected:
+ virtual void paintEvent(QPaintEvent*);
+
+private:
+ QImage m_previewImg;
+
+};
+
+#endif /* SCREENSHOTPREVIEW_H */
diff --git a/kaffeine/src/player-parts/xine-part/videosettings.cpp b/kaffeine/src/player-parts/xine-part/videosettings.cpp
new file mode 100644
index 0000000..e552df7
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/videosettings.cpp
@@ -0,0 +1,129 @@
+/*
+ * videosettings.cpp
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <klocale.h>
+
+#include <qslider.h>
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qnamespace.h>
+#include <qgroupbox.h>
+
+#include "videosettings.h"
+#include "videosettings.moc"
+
+
+VideoSettings::VideoSettings(int hue, int sat, int contrast, int bright,
+ int avOffset, int spuOffset, QWidget *parent, const char *name)
+ : KDialogBase(KDialogBase::Plain, i18n("Video Settings"), KDialogBase::Default | KDialogBase::Close, KDialogBase::Close, parent, name, false)
+{
+ reparent(parent, pos(), false);
+ setInitialSize(QSize(450,250), true);
+ QWidget* page = plainPage();
+
+ QVBoxLayout* b = new QVBoxLayout(page);
+
+ QGroupBox *videoGroup = new QGroupBox(QString::null, page);
+ b->addWidget(videoGroup);
+
+ QGridLayout* videoGrid = new QGridLayout(videoGroup, 6, 2);
+ videoGrid->setSpacing(5);
+ videoGrid->setMargin(10);
+
+ QLabel* hueText = new QLabel(i18n("Hue"), videoGroup);
+ hueText->setAlignment(AlignRight);
+ m_hueSlider = new QSlider(Qt::Horizontal, videoGroup);
+ m_hueSlider->setRange(0, 65535);
+ m_hueSlider->setSteps(10, 1000);
+ m_hueSlider->setValue(hue);
+ connect(m_hueSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewHue(int)));
+ videoGrid->addWidget(hueText, 0, 0);
+ videoGrid->addWidget(m_hueSlider, 0, 1);
+
+ QLabel* satText = new QLabel(i18n("Saturation"), videoGroup);
+ satText->setAlignment(AlignRight);
+ m_satSlider = new QSlider(Qt::Horizontal, videoGroup);
+ m_satSlider->setRange(0, 65535);
+ m_satSlider->setSteps(10, 1000);
+ m_satSlider->setValue(sat);
+ connect(m_satSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewSaturation(int)));
+ videoGrid->addWidget(satText, 1, 0);
+ videoGrid->addWidget(m_satSlider, 1, 1);
+
+ QLabel* contrastText = new QLabel(i18n("Contrast"), videoGroup);
+ contrastText->setAlignment(AlignRight);
+ m_contrastSlider = new QSlider(Qt::Horizontal, videoGroup);
+ m_contrastSlider->setRange(0, 65535);
+ m_contrastSlider->setSteps(10, 1000);
+ m_contrastSlider->setValue(contrast);
+ connect(m_contrastSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewContrast(int)));
+ videoGrid->addWidget(contrastText, 2, 0);
+ videoGrid->addWidget(m_contrastSlider, 2, 1);
+
+ QLabel* brightText = new QLabel(i18n("Brightness"), videoGroup);
+ brightText->setAlignment(AlignRight);
+ m_brightSlider = new QSlider(Qt::Horizontal, videoGroup);
+ m_brightSlider->setRange(0, 65535);
+ m_brightSlider->setSteps(10, 1000);
+ m_brightSlider->setValue(bright);
+ connect(m_brightSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewBrightness(int)));
+ videoGrid->addWidget(brightText, 3, 0);
+ videoGrid->addWidget(m_brightSlider, 3, 1);
+
+ QLabel* avOffsetText = new QLabel(i18n("Audio/Video Offset"), videoGroup);
+ avOffsetText->setAlignment(AlignRight);
+ m_avOffsetSlider = new QSlider(Qt::Horizontal, videoGroup);
+ m_avOffsetSlider->setRange(-90000, 90000); // +/- 1 sec
+ m_avOffsetSlider->setSteps(100, 10000);
+ m_avOffsetSlider->setValue(avOffset);
+ connect(m_avOffsetSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewAVOffset(int)));
+ videoGrid->addWidget(avOffsetText, 4, 0);
+ videoGrid->addWidget(m_avOffsetSlider, 4, 1);
+
+ QLabel* spuOffsetText = new QLabel(i18n("Subtitle Offset"), videoGroup);
+ spuOffsetText->setAlignment(AlignRight);
+ m_spuOffsetSlider = new QSlider(Qt::Horizontal, videoGroup);
+ m_spuOffsetSlider->setRange(-90000, 90000); // +/- 1 sec
+ m_spuOffsetSlider->setSteps(100, 10000);
+ m_spuOffsetSlider->setValue(spuOffset);
+ connect(m_spuOffsetSlider, SIGNAL(valueChanged(int)), this, SIGNAL(signalNewSpuOffset(int)));
+ videoGrid->addWidget(spuOffsetText, 5, 0);
+ videoGrid->addWidget(m_spuOffsetSlider, 5, 1);
+
+ connect(this, SIGNAL(defaultClicked()), this, SLOT(slotSetDefaultValues()));
+}
+
+
+
+VideoSettings::~VideoSettings()
+{
+
+}
+
+
+void VideoSettings::slotSetDefaultValues()
+{
+ m_hueSlider->setValue(32768);
+ m_satSlider->setValue(32768);
+ m_contrastSlider->setValue(32768);
+ m_brightSlider->setValue(32768);
+ m_avOffsetSlider->setValue(0);
+ m_spuOffsetSlider->setValue(0);
+}
diff --git a/kaffeine/src/player-parts/xine-part/videosettings.h b/kaffeine/src/player-parts/xine-part/videosettings.h
new file mode 100644
index 0000000..7641bf8
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/videosettings.h
@@ -0,0 +1,65 @@
+/*
+ * videosettings.h
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef VIDEOSETTINGS_H
+#define VIDEOSETTINGS_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kdialogbase.h>
+
+class QSlider;
+
+class VideoSettings : public KDialogBase
+{
+
+ Q_OBJECT
+
+public:
+ VideoSettings(int hue, int sat, int contrast, int bright, int avOffset,
+ int spuOffset, QWidget *parent=0, const char *name=0);
+ ~VideoSettings();
+
+signals:
+ void signalNewHue(int);
+ void signalNewSaturation(int);
+ void signalNewContrast(int);
+ void signalNewBrightness(int);
+ void signalNewAVOffset(int);
+ void signalNewSpuOffset(int);
+
+private slots:
+
+ void slotSetDefaultValues();
+
+
+private:
+ QSlider* m_hueSlider;
+ QSlider* m_satSlider;
+ QSlider* m_contrastSlider;
+ QSlider* m_brightSlider;
+ QSlider* m_avOffsetSlider;
+ QSlider* m_spuOffsetSlider;
+
+};
+
+#endif /* VIDEOSETTINGS_H */
diff --git a/kaffeine/src/player-parts/xine-part/xine_part.cpp b/kaffeine/src/player-parts/xine-part/xine_part.cpp
new file mode 100644
index 0000000..920a2ac
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/xine_part.cpp
@@ -0,0 +1,2111 @@
+/*
+ * xine_part.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "xine_part.h"
+
+#include <kapplication.h>
+#include <kinstance.h>
+#include <kiconloader.h>
+#include <kaction.h>
+#include <kstdaction.h>
+#include <kfiledialog.h>
+#include <kmessagebox.h>
+#include <kinputdialog.h>
+#include <kxmlguifactory.h>
+#include <kpopupmenu.h>
+#include <kparts/genericfactory.h>
+#include <kprogress.h>
+#include <kio/netaccess.h>
+#include <kstandarddirs.h>
+#include <dcopclient.h>
+#include <kprocess.h>
+#include <kprotocolinfo.h>
+#include <ktoolbar.h>
+
+#include <qvbox.h>
+#include <qlabel.h>
+#include <qpushbutton.h>
+#include <qimage.h>
+#include <qfontmetrics.h>
+#include <qregexp.h>
+#include <qtooltip.h>
+#include <qdatetimeedit.h>
+
+#include <xine/xineutils.h>
+
+#include "mrl.h"
+#include "kxinewidget.h"
+#include "videosettings.h"
+#include "equalizer.h"
+#include "deinterlacequality.h"
+#include "filterdialog.h"
+#include "screenshotpreview.h"
+#include "xineconfig.h"
+#include "positionslider.h"
+#include "playlistimport.h"
+#include "version.h"
+
+typedef KParts::GenericFactory<XinePart> XinePartFactory;
+K_EXPORT_COMPONENT_FACTORY (libxinepart, XinePartFactory)
+
+
+XinePart::XinePart(QWidget* parentWidget, const char* widgetName, QObject* parent, const char* name, const QStringList& args)
+ : DCOPObject("XinePartIface"),
+ KaffeinePart(parent, name ? name : "XinePart"),
+ m_current(0), m_xine(NULL), m_pictureSettings(NULL), m_deinterlacerConfigWidget(NULL),
+ m_filterDialog(NULL), m_embeddedContext(NULL)
+{
+ kdDebug() << "XinePart: Creating new XinePart..." << endl;
+
+ /*
+ * Parsing parameter given by kaffeine (audiodriver, videodriver, verbose)
+ * or parameters of <embed>...</embed>
+ *
+ * format: param="value"
+ */
+ QString audioDriver = QString::null;
+ QString videoDriver = QString::null;
+ bool verbose = false;
+ TimeShiftFilename = "";
+
+ for (uint i=0; i<args.count(); i++)
+ {
+ kdDebug() << "XinePart: Argument: " << args[i] << endl;
+ if (args[i].left(11).lower() == "audiodriver")
+ {
+ audioDriver = args[i].section( '"',1, 1 );
+ kdDebug() << "XinePart: Found audiodriver parameter, value: " << audioDriver << endl;
+
+ }
+ if (args[i].left(11).lower() == "videodriver")
+ {
+ videoDriver = args[i].section( '"',1, 1 );
+ kdDebug() << "XinePart: Found videodriver parameter, value: " << videoDriver << endl;
+ }
+ if (args[i].left(7).lower() == "verbose")
+ {
+ if (args[i].section( '"', 1, 1 ).lower() == "true")
+ {
+ kdDebug() << "XinePart: Found parameter verbose, set xine engine verbosity to max..." << endl;
+ verbose = true;
+ }
+ }
+ }
+
+ // we need an instance
+ setInstance(XinePartFactory::instance());
+
+ // be careful - we may be embedded
+ QString configPath = locate("data", "kaffeine/xine-config");
+ QString logoPath = locate("data", "kaffeine/logo");
+
+ kdDebug() << "XinePart: Using xine-config file: " << configPath << endl;
+
+ m_xine = new KXineWidget(parentWidget, widgetName, configPath, logoPath,
+ audioDriver, videoDriver, /* start xine manual*/true, verbose);
+ connect(m_xine, SIGNAL(signalXineFatal(const QString&)), this, SIGNAL(canceled(const QString&)));
+ connect(m_xine, SIGNAL(stopDvb()), this, SIGNAL(stopDvb()));
+ connect(m_xine, SIGNAL(signalDvbOSDHidden()), this, SIGNAL(dvbOSDHide()));
+ m_xine->setFocusPolicy(QWidget::ClickFocus);
+ setWidget(m_xine);
+
+ // set our XML-UI resource file
+ setXMLFile("xine_part.rc");
+ initActions();
+ initConnections();
+
+ QTimer::singleShot(0, this, SLOT(slotDisableAllActions()));
+ m_oldPosition = m_xine->mapToGlobal(QPoint(0,0));
+ m_posCheckTimer.start(333);
+}
+
+XinePart::~XinePart()
+{
+ kdDebug() << "XinePart: destructor" << endl;
+ kdDebug() << "XinePart destructor: calling saveConfig()" << endl;
+ saveConfig();
+ if (m_embeddedContext)
+ delete m_embeddedContext;
+}
+
+KAboutData *XinePart::createAboutData()
+{
+ KAboutData* aboutData = new KAboutData( "kaffeine", I18N_NOOP("XinePart"),
+ KAFFEINE_VERSION, I18N_NOOP("A xine based player part for Kaffeine."),
+ KAboutData::License_GPL,
+ "(c) 2003-2004, Jürgen Kofler.", 0, "http://kaffeine.sourceforge.net");
+ aboutData->addAuthor("Jürgen Kofler.",0, "kaffeine@gmx.net");
+
+ return aboutData;
+}
+
+bool XinePart::openURL(const MRL& mrl)
+{
+ kdDebug() << "XinePart::openURL(): " << mrl.url() << endl;
+
+ // if (!mrl.kurl().isValid())
+ // return false;
+
+ m_mrl = mrl;
+ m_playlist.clear();
+ m_current = 0;
+ bool playlist = false;
+
+ QString ext = m_mrl.kurl().fileName();
+ ext = ext.remove( 0 , ext.findRev('.')+1 ).lower();
+
+ if (!m_mrl.mime().isNull())
+ {
+ KMimeType::Ptr mime = KMimeType::findByURL(m_mrl.kurl().path());
+ m_mrl.setMime(mime->name());
+ }
+
+ /* is m_mrl a playlist? */
+ if ((m_mrl.mime() == "text/plain") || (m_mrl.mime() == "text/xml") || (m_mrl.mime() == "application/x-kaffeine")
+ || (m_mrl.mime() == "audio/x-scpls") || (m_mrl.mime() == "audio/x-mpegurl") || (m_mrl.mime() == "audio/mpegurl")
+ || (m_mrl.mime() == "application/smil")
+ || (ext == "asx") || (ext == "asf") || (ext == "wvx") || (ext == "wax")) /* windows meta files */
+ {
+ kdDebug() << "XinePart: Check for kaffeine/noatun/m3u/pls/asx playlist\n";
+ QString localFile;
+ if (KIO::NetAccess::download(m_mrl.kurl(), localFile, widget()))
+ {
+ QFile file(localFile);
+ file.open(IO_ReadOnly);
+ QTextStream stream(&file);
+ QString firstLine = stream.readLine();
+ QString secondLine = stream.readLine();
+ file.close();
+
+ if (secondLine.contains("kaffeine", false))
+ {
+ kdDebug() << "KafeinePart: Try loading kaffeine playlist\n";
+ playlist = PlaylistImport::kaffeine(localFile, m_playlist);
+ }
+ if (secondLine.contains("noatun", false))
+ {
+ kdDebug() << "XinePart: Try loading noatun playlist\n";
+ playlist = PlaylistImport::noatun(localFile, m_playlist);
+ }
+ if (firstLine.contains("asx", false))
+ {
+ kdDebug() << "XinePart: Try loading asx playlist\n";
+ playlist = PlaylistImport::asx(localFile, m_playlist);
+ }
+ if (firstLine.contains("smil", false))
+ {
+ kdDebug() << "XinePart: Try loading smil playlist\n";
+ if (KMessageBox::warningYesNo(0, i18n("SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\nXinePart can now try to playback contained video sources without any layout. Proceed?"), QString::null, KStdGuiItem::yes(), KStdGuiItem::no(), "smil_warning") == KMessageBox::Yes)
+ {
+ if (!PlaylistImport::smil(localFile, m_mrl, m_playlist))
+ {
+ emit signalTrackFinished();
+ return false;
+ }
+ }
+ else
+ return false;
+ }
+ if (firstLine.contains("[playlist]", false))
+ {
+ kdDebug() << "XinePart: Try loading pls playlist\n";
+ playlist = PlaylistImport::pls(localFile, m_playlist);
+ }
+ if (ext == "m3u") //indentify by extension
+ {
+ kdDebug() << "XinePart: Try loading m3u playlist\n";
+ playlist = PlaylistImport::m3u(localFile, m_playlist);
+ }
+ }
+ else
+ kdError() << "XinePart: " << KIO::NetAccess::lastErrorString() << endl;
+ }
+ /* check for ram playlist */
+ if ( (ext == "ra") || (ext == "rm") || (ext == "ram") || (ext == "lsc") || (ext == "pl") )
+ {
+ kdDebug() << "XinePart: Try loading ram playlist\n";
+ playlist = PlaylistImport::ram(m_mrl, m_playlist, widget());
+ }
+ /* urls from audiocd kio-slave */
+ if (m_mrl.kurl().protocol() == "audiocd")
+ {
+ QString audioTrack = QString::number(m_mrl.kurl().fileName().remove( QRegExp("\\D" ) ).left(2).toUInt());
+ m_mrl = MRL(audioTrack.prepend( "cdda:/" ));
+ }
+
+ if (!playlist)
+ {
+ kdDebug() << "XinePart: Got single track\n";
+ m_playlist.append(m_mrl);
+ }
+
+ slotPlay(true);
+
+ return true;
+}
+
+bool XinePart::closeURL()
+{
+ kdDebug() << "XinePart::closeURL()" << endl;
+ // m_playlist.clear();
+ // m_mrl = MRL();
+ slotStop();
+
+ return true;
+}
+
+void XinePart::slotPlay(bool forcePlay)
+{
+ kdDebug() << "XinePart::slotPlay()" << endl;
+
+ m_pauseButton->setChecked(false);
+ if (m_xine->isPlaying())
+ {
+ if ( (m_xine->getSpeed() != KXineWidget::Normal) && !forcePlay )
+ {
+ m_xine->slotSpeedNormal();
+ slotEnablePlayActions();
+ return;
+ }
+ else
+ emit stopDvb();
+ }
+
+ if (m_playlist.count() == 0)
+ {
+ emit signalRequestCurrentTrack();
+ return;
+ }
+
+ MRL mrl = m_playlist[m_current];
+
+ /*
+ * is protocol supported by xine or not known by KIO?
+ */
+ if ((QString(SUPPORTED_PROTOCOLS).contains(mrl.kurl().protocol()))
+ || (!KProtocolInfo::isKnownProtocol(mrl.kurl())))
+ {
+ QString sub;
+ if ((!mrl.subtitleFiles().isEmpty()) && (mrl.currentSubtitle() > -1))
+ sub = QString("#subtitle:%1").arg(mrl.subtitleFiles()[mrl.currentSubtitle()]);
+
+ m_xine->clearQueue();
+ m_xine->appendToQueue(mrl.url() + sub );
+ if (!m_xine->isXineReady())
+ {
+ if (!m_xine->initXine())
+ return;
+ }
+ else
+ QTimer::singleShot(0, m_xine, SLOT(slotPlay()));
+ }
+ else
+ {
+ kdDebug() << "XinePart: Protocol not supported by xine, try to download it..." << endl;
+
+ QString localFile;
+ if (KIO::NetAccess::download(mrl.kurl(), localFile, widget()))
+ {
+ m_xine->clearQueue();
+ m_xine->appendToQueue(localFile);
+ if (!m_xine->isXineReady())
+ {
+ if (!m_xine->initXine())
+ return;
+ }
+ else
+ QTimer::singleShot(0, m_xine, SLOT(slotPlay()));
+ }
+ else
+ kdError() << "XinePart: " << KIO::NetAccess::lastErrorString() << endl;
+ }
+}
+
+void XinePart::slotStop()
+{
+ if (!m_xine->isXineReady())
+ return;
+
+ emit stopDvb();
+
+ /* if we play a DVD we cache current title and chapter */
+ if (m_playlist[m_current].url().startsWith("dvd:/"))
+ {
+ uint title = m_xine->currentDVDTitleNumber();
+ uint chapter = m_xine->currentDVDChapterNumber();
+
+ m_playlist[m_current] = MRL("dvd://" + QString::number(title) + "." + QString::number(chapter));
+ }
+
+ QTimer::singleShot(0, m_xine, SLOT(slotStop()));
+ stateChanged("not_playing");
+ m_pauseButton->setChecked(false);
+ m_playTime->setText("0:00:00");
+ emit setWindowCaption("");
+}
+
+void XinePart::slotNext()
+{
+ if (m_xine->hasChapters())
+ {
+ m_xine->playNextChapter();
+ return;
+ }
+
+ if ((m_playlist.count() > 0) && (m_current < m_playlist.count()-1))
+ {
+ m_current++;
+ slotPlay();
+ }
+ else
+ {
+ emit signalRequestNextTrack();
+ }
+}
+
+void XinePart::slotPrevious()
+{
+ if (m_xine->hasChapters())
+ {
+ m_xine->playPreviousChapter();
+ return;
+ }
+
+ if (m_current > 0)
+ {
+ m_current--;
+ slotPlay();
+ }
+ else
+ {
+ emit signalRequestPreviousTrack();
+ }
+}
+
+void XinePart::requestForOSD( const QString &text, int duration, int priority )
+{
+ m_xine->showOSDMessage( text, duration, priority );
+}
+
+void XinePart::setDvbCurrentNext( const QString &channelName, const QStringList &list )
+{
+ m_xine->setDvbCurrentNext( channelName, list );
+}
+
+void XinePart::slotDvbOpen( const QString &filename, const QString &chanName, int haveVideo )
+{
+ if (!m_xine->isXineReady())
+ if (!m_xine->initXine())
+ return;
+ m_playlist.clear();
+ m_xine->setDvb( filename, chanName, haveVideo );
+ QTimer::singleShot(0, m_xine, SLOT(openDvb()));
+ //m_xine->openDvb( filename, chanName, haveVideo );
+}
+
+void XinePart::getTimeShiftFilename( const QString &filename )
+{
+ TimeShiftFilename = filename;
+ m_xine->TimeShiftFilename = TimeShiftFilename;
+}
+
+void XinePart::slotTogglePause( bool pauseLive )
+{
+ kdDebug() << "slotSpeedPause()" << endl;
+ if (!m_xine->isXineReady())
+ return;
+
+ if (m_xine->getSpeed() == KXineWidget::Pause)
+ {
+ m_xine->slotSpeedNormal();
+ slotEnablePlayActions();
+ m_pauseButton->setChecked(false);
+ }
+ else
+ {
+ if ( pauseLive )
+ emit playerPause();
+ m_xine->slotSpeedPause();
+ // kdDebug() << "XinePart: Set state to paused" << endl;
+ stateChanged("paused");
+ m_pauseButton->setChecked(true);
+ }
+}
+
+void XinePart::speedFaster()
+{
+ slotFastForward();
+}
+
+void XinePart::slotFastForward()
+{
+ if (m_xine->getSpeed() == KXineWidget::Pause)
+ {
+ m_pauseButton->setChecked(false);
+ slotEnablePlayActions();
+ }
+ m_xine->slotSpeedFaster();
+}
+
+void XinePart::speedSlower()
+{
+ slotSlowMotion();
+}
+
+void XinePart::slotSlowMotion()
+{
+ if (m_xine->getSpeed() == KXineWidget::Pause)
+ {
+ m_pauseButton->setChecked(false);
+ slotEnablePlayActions();
+ }
+
+ m_xine->slotSpeedSlower();
+}
+
+void XinePart::slotMute()
+{
+ if (!m_xine->isXineReady())
+ return;
+
+ m_xine->slotToggleMute();
+}
+
+void XinePart::slotVolumeUp()
+{
+ int newVol = volume() + 5;
+ if (newVol >100)
+ newVol = 100;
+ slotSetVolume(newVol);
+}
+
+void XinePart::slotVolumeDown()
+{
+ int newVol = volume() - 5;
+ if (newVol <0)
+ newVol = 0;
+ slotSetVolume(newVol);
+}
+
+void XinePart::slotPosPlusSmall()
+{
+ slotJumpIncrement( 20 );
+}
+
+void XinePart::slotPosMinusSmall()
+{
+ slotJumpIncrement( -20 );
+}
+
+void XinePart::slotPosPlusMedium()
+{
+ slotJumpIncrement( 60 );
+}
+
+void XinePart::slotPosMinusMedium()
+{
+ slotJumpIncrement( -60 );
+}
+
+void XinePart::slotPosPlusLarge()
+{
+ slotJumpIncrement( 600 );
+}
+
+void XinePart::slotPosMinusLarge()
+{
+ slotJumpIncrement( -600 );
+}
+
+void XinePart::slotJumpIncrement(int increment)
+{
+ if (!m_xine->isSeekable())
+ return;
+
+ QTime timeNow;
+ QTime projectedTime;
+ QTime startTime;
+
+ if (!m_xine->getLength().isNull())
+ {
+ timeNow = m_xine->getPlaytime();
+ if ( increment < 0 && timeNow.msecsTo(startTime) > increment * 1000 )
+ {
+ m_xine->slotSeekToTime(startTime);
+ }
+ else
+ {
+ projectedTime = timeNow.addSecs(increment);
+ m_xine->slotSeekToTime(projectedTime);
+ }
+ }
+}
+
+void XinePart::slotAdvanceSubTitle()
+{
+ int spuOffset;
+ m_xine->getspuOffset(spuOffset);
+ m_xine->slotSetSpuOffset(spuOffset+45000);
+}
+
+void XinePart::slotDelaySubTitle()
+{
+ int spuOffset;
+ m_xine->getspuOffset(spuOffset);
+ m_xine->slotSetSpuOffset(spuOffset-45000);
+}
+
+void XinePart::slotSaveStream()
+{
+ if (m_mrl.isEmpty())
+ return;
+
+ QString saveDir = m_xine->getStreamSaveDir();
+
+ KURL kurl = KFileDialog::getSaveURL(saveDir + "/" + m_playlist[m_current].kurl().fileName(), QString::null, 0, i18n("Save Stream As"));
+ if (!kurl.isValid())
+ return;
+
+ if ( saveDir != kurl.directory() )
+ m_xine->setStreamSaveDir(kurl.directory());
+
+ m_xine->clearQueue();
+ m_xine->appendToQueue(m_playlist[m_current].url() + "#save:" + kurl.path());
+ QTimer::singleShot(0, m_xine, SLOT(slotPlay()));
+ m_pauseButton->setChecked(false);
+}
+
+void XinePart::slotSetSubtitle(int channel)
+{
+ if (m_playlist[m_current].subtitleFiles().isEmpty())
+ {
+ m_xine->slotSetSubtitleChannel(channel);
+ }
+ else
+ {
+ m_playlist[m_current].setCurrentSubtitle(channel - 1);
+ emit signalNewMeta(m_mrl);
+ m_xine->savePosition(m_xine->getPosition()-200);
+ slotPlay(true); //force load of new subtitle
+ }
+ emit setStatusBarText(i18n("Subtitle") + ": " + m_subtitles->items()[channel]);
+ m_xine->showOSDMessage(i18n("Subtitle") + ": " + m_subtitles->items()[channel], DEFAULT_OSD_DURATION);
+}
+
+void XinePart::slotAddSubtitle(void)
+{
+ QString subtitleURL = KFileDialog::getOpenURL(m_mrl.kurl().directory(),
+ i18n("*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n*.*|All Files"),
+ 0, i18n("Select Subtitle File")).path();
+
+ if (!(subtitleURL.isEmpty()))
+ {
+ if (!m_playlist[m_current].subtitleFiles().contains(subtitleURL))
+ {
+ m_playlist[m_current].addSubtitleFile(subtitleURL);
+ }
+
+ int subchannel = m_playlist[m_current].subtitleFiles().size() - 1;
+ m_playlist[m_current].setCurrentSubtitle(subchannel);
+ emit signalNewMeta(m_mrl);
+ m_xine->savePosition(m_xine->getPosition()-200);
+ slotPlay(true); //force load of new subtitle
+
+ emit setStatusBarText(i18n("Subtitle") + ": " + m_subtitles->items()[subchannel]);
+ m_xine->showOSDMessage(i18n("Subtitle") + ": " + m_subtitles->items()[subchannel], DEFAULT_OSD_DURATION);
+ }
+
+}
+
+void XinePart::slotSetAudioChannel(int channel)
+{
+ m_xine->slotSetAudioChannel(channel);
+ emit setStatusBarText(i18n("Audiochannel") + ": " + m_audioChannels->items()[channel]);
+ m_xine->showOSDMessage(i18n("Audiochannel") + ": " + m_audioChannels->items()[channel], DEFAULT_OSD_DURATION);
+}
+
+void XinePart::slotSetDVDTitle(const QString& titleStr)
+{
+ bool ok;
+ uint title = titleStr.toInt(&ok);
+ if (ok && title > 0 && title <= m_xine->getDVDTitleCount())
+ {
+ KURL url = m_mrl.kurl();
+ url.addPath(QString::number(title));
+ m_playlist[m_current] = MRL(url);
+ slotPlay(true);
+ }
+}
+
+void XinePart::slotSetDVDChapter(const QString& chapterStr)
+{
+ bool ok;
+ uint chapter = chapterStr.toInt(&ok);
+ if (ok)
+ setDVDChapter(chapter);
+}
+
+void XinePart::slotSetDVDAngle(const QString& angleStr)
+{
+ bool ok;
+ uint angle = angleStr.toInt(&ok);
+ if (ok && angle > 0 && angle <= m_xine->getDVDAngleCount())
+ {
+ uint title = m_xine->currentDVDTitleNumber();
+ uint chapter = m_xine->currentDVDChapterNumber();
+ KURL url = m_mrl.kurl();
+
+ url.addPath(QString::number(title) + "." + QString::number(chapter) + "." + QString::number(angle));
+ m_playlist[m_current] = MRL(url);
+ slotPlay(true);
+ }
+}
+
+void XinePart::setDVDChapter(uint chapter)
+{
+ if (chapter > 0 && chapter <= m_xine->getDVDChapterCount())
+ {
+ uint title = m_xine->currentDVDTitleNumber();
+ KURL url = m_mrl.kurl();
+
+ url.addPath(QString::number(title) + "." + QString::number(chapter));
+ m_playlist[m_current] = MRL(url);
+ slotPlay(true);
+ }
+}
+
+void XinePart::slotChannelInfo(const QStringList& audio, const QStringList& sub, int currentAudio, int currentSub)
+{
+ kdDebug() << "XinePart: slotChannelInfo: currentAudio="<<currentAudio<< " currentSub="<<currentSub<<"\n";
+ m_audioChannels->setItems(audio);
+ m_audioChannels->setCurrentItem(currentAudio+1);
+
+ if (m_playlist[m_current].subtitleFiles().isEmpty())
+ {
+ m_subtitles->setItems(sub);
+ m_subtitles->setCurrentItem(currentSub+1);
+ }
+ else
+ {
+ QStringList subFiles = m_playlist[m_current].subtitleFiles();
+ QStringList subs(i18n("off"));
+ QString sub;
+ QStringList::ConstIterator end(subFiles.end());
+ for (QStringList::ConstIterator it = subFiles.begin(); it != end; ++it)
+ {
+ sub = (*it);
+ sub = sub.remove(0 , sub.findRev('/')+1);
+ subs.append(sub);
+ }
+ m_subtitles->setItems(subs);
+ m_subtitles->setCurrentItem(m_playlist[m_current].currentSubtitle() + 1);
+ }
+
+ /* if we play a DVD enable and fill menus */
+ if (m_playlist[m_current].url().startsWith("dvd:/"))
+ {
+ QStringList titles;
+ QStringList chapters;
+ QStringList angles;
+ uint titlesCount = m_xine->getDVDTitleCount();
+ uint chaptersCount = m_xine->getDVDChapterCount();
+ uint anglesCount = m_xine->getDVDAngleCount();
+
+ for (uint i = 1; i <= titlesCount; i++)
+ titles.append(QString::number(i));
+ for (uint i = 1; i <= chaptersCount; i++)
+ chapters.append(QString::number(i));
+ for (uint i = 1; i <= anglesCount; i++)
+ angles.append(QString::number(i));
+
+ m_dvdTitles->setItems(titles);
+ m_dvdTitles->setCurrentItem(m_xine->currentDVDTitleNumber() - 1);
+ m_dvdChapters->setItems(chapters);
+ m_dvdChapters->setCurrentItem(m_xine->currentDVDChapterNumber() - 1);
+ m_dvdAngles->setItems(angles);
+ m_dvdAngles->setCurrentItem(m_xine->currentDVDAngleNumber() - 1);
+ stateChanged("dvd_playback");
+ }
+ else
+ {
+ stateChanged("dvd_playback", StateReverse);
+ }
+}
+
+void XinePart::slotNewPosition(int pos, const QTime& playtime)
+{
+ QTime length = m_xine->getLength();
+ QTime calcLength;
+
+ //if (!m_xine->isSeekable() || length.isNull() || length < playtime)
+ if (!m_xine->isSeekable() )
+ {
+ m_position->setPosition(0,false);
+ m_position->setEnabled(false);
+ }
+ else
+ {
+ m_position->setPosition(pos, false);
+ m_position->setEnabled(true);
+ }
+
+ if (m_timerDirection == BACKWARD_TIMER && !length.isNull() && length >= playtime)
+ calcLength = length.addSecs(-playtime.second()-playtime.minute()*60-playtime.hour()*60*60);
+ else
+ calcLength = playtime;
+
+ if (m_timerDirection == BACKWARD_TIMER)
+ m_playTime->setText("-" + calcLength.toString("h:mm:ss"));
+ else
+ m_playTime->setText(calcLength.toString("h:mm:ss"));
+
+ QString timeMessage;
+ if (m_isOsdTimer)
+ {
+ if (m_timerDirection == BACKWARD_TIMER || length.isNull() || length < playtime)
+ {
+ timeMessage = calcLength.toString("h:mm:ss");
+ m_xine->showOSDMessage("-" + timeMessage, 600, OSD_MESSAGE_LOW_PRIORITY);
+ }
+ else
+ {
+ timeMessage = i18n("%1 of %2").arg(calcLength.toString("h:mm:ss")).arg(length.toString("h:mm:ss"));
+ m_xine->showOSDMessage(timeMessage, 600, OSD_MESSAGE_LOW_PRIORITY);
+ }
+ }
+ currentPosition = (playtime.hour()*3600)+(playtime.minute()*60)+playtime.second();
+}
+
+QString XinePart::screenShot()
+{
+ QString filename = QDir::homeDirPath()+"/kaffeinedcopshot.jpg";
+ QImage shot = m_xine->getScreenshot();
+ if ( shot.save( filename, "JPEG" ) )
+ return filename;
+ else
+ return "";
+}
+
+void XinePart::slotScreenshot()
+{
+ QImage shot = m_xine->getScreenshot();
+
+ KFileDialog dlg(":kaffeineMain_Screenshot", i18n("*.png|PNG-File\n*.bmp|BMP-File\n*.xbm|XBM-File"),
+ 0, "save screenshot", true);
+ dlg.setOperationMode(KFileDialog::Saving);
+ dlg.setCaption(i18n("Save Screenshot As"));
+ dlg.setSelection("screenshot.png");
+
+ ScreenshotPreview* prev = new ScreenshotPreview(shot, &dlg);
+ dlg.setPreviewWidget(prev);
+
+ dlg.exec();
+ QString fileName = dlg.selectedFile();
+
+ if (fileName.isEmpty())
+ return;
+
+ QString type = dlg.currentFilter();
+ type = (type.remove(0,2)).upper();
+
+ kdDebug() << "XinePart: Save screenshot as " << type << "\n";
+ if (!shot.save(fileName, type.ascii()))
+ kdError() << "XinePart: Screenshot not saved successfully!" << endl;
+}
+
+void XinePart::slotFilterDialog()
+{
+ if (!m_filterDialog)
+ {
+ m_filterDialog = new FilterDialog(m_xine->getAudioFilterNames(), m_xine->getVideoFilterNames());
+ connect(m_filterDialog, SIGNAL(signalCreateAudioFilter(const QString&, QWidget*)),
+ m_xine, SLOT(slotCreateAudioFilter(const QString&, QWidget*)));
+ connect(m_filterDialog, SIGNAL(signalCreateVideoFilter(const QString&, QWidget*)),
+ m_xine, SLOT(slotCreateVideoFilter(const QString&, QWidget*)));
+ connect(m_filterDialog, SIGNAL(signalRemoveAllAudioFilters()), m_xine, SLOT(slotRemoveAllAudioFilters()));
+ connect(m_filterDialog, SIGNAL(signalRemoveAllVideoFilters()), m_xine, SLOT(slotRemoveAllVideoFilters()));
+ connect(m_filterDialog, SIGNAL(signalUseAudioFilters(bool)), m_xine, SLOT(slotEnableAudioFilters(bool)));
+ connect(m_filterDialog, SIGNAL(signalUseVideoFilters(bool)), m_xine, SLOT(slotEnableVideoFilters(bool)));
+ }
+ m_filterDialog->show();
+ m_filterDialog->raise();
+}
+
+void XinePart::slotDeinterlaceQuality()
+{
+ if (!m_deinterlacerConfigWidget)
+ return;
+ DeinterlaceQuality* deinterlaceQuality = new DeinterlaceQuality((QWidget*)m_deinterlacerConfigWidget);
+ deinterlaceQuality->setQuality(m_lastDeinterlaceQuality);
+ connect(deinterlaceQuality, SIGNAL(signalSetDeinterlaceConfig(const QString&)),
+ m_xine, SLOT(slotSetDeinterlaceConfig(const QString&)));
+
+ deinterlaceQuality->exec();
+
+ m_lastDeinterlaceQuality = deinterlaceQuality->getQuality();
+ m_lastDeinterlacerConfig = m_xine->getDeinterlaceConfig();
+ delete deinterlaceQuality;
+}
+
+void XinePart::slotSetHue( int i )
+{
+ m_hue = i;
+ if ( i==-1 )
+ return;
+ m_xine->slotSetHue( i );
+}
+
+void XinePart::slotSetSaturation( int i )
+{
+ m_saturation = i;
+ if ( i==-1 )
+ return;
+ m_xine->slotSetSaturation( i );
+}
+
+void XinePart::slotSetContrast( int i )
+{
+ m_contrast = i;
+ if ( i==-1 )
+ return;
+ m_xine->slotSetContrast( i );
+}
+
+void XinePart::slotSetBrightness( int i )
+{
+ m_brightness = i;
+ if ( i==-1 )
+ return;
+ m_xine->slotSetBrightness( i );
+}
+
+void XinePart::slotPictureSettings()
+{
+ if (!m_pictureSettings)
+ {
+ int hue, sat, contrast, bright, avOffset, spuOffset;
+ m_xine->getVideoSettings(hue, sat, contrast, bright, avOffset, spuOffset);
+ m_pictureSettings = new VideoSettings(hue, sat, contrast, bright, avOffset, spuOffset);
+ connect(m_pictureSettings, SIGNAL(signalNewHue(int)), this, SLOT(slotSetHue(int)));
+ connect(m_pictureSettings, SIGNAL(signalNewSaturation(int)), this, SLOT(slotSetSaturation(int)));
+ connect(m_pictureSettings, SIGNAL(signalNewContrast(int)), this, SLOT(slotSetContrast(int)));
+ connect(m_pictureSettings, SIGNAL(signalNewBrightness(int)), this, SLOT(slotSetBrightness(int)));
+ connect(m_pictureSettings, SIGNAL(signalNewAVOffset(int)), m_xine, SLOT(slotSetAVOffset(int)));
+ connect(m_pictureSettings, SIGNAL(signalNewSpuOffset(int)), m_xine, SLOT(slotSetSpuOffset(int)));
+ }
+ m_pictureSettings->show();
+ m_pictureSettings->raise();
+}
+
+void XinePart::slotEqualizer()
+{
+ m_equalizer->show();
+ m_equalizer->raise();
+}
+
+void XinePart::slotToggleBroadcastSend()
+{
+ bool ok = false;
+
+ if (m_broadcastSend->isChecked())
+ {
+ m_broadcastPort = (uint)KInputDialog::getInteger( QString::null, i18n("Broadcasting port:"), m_broadcastPort, 0, 1000000, 1, &ok);
+ if (!ok)
+ {
+ m_broadcastSend->setChecked(false);
+ return;
+ }
+ m_xine->setBroadcasterPort(m_broadcastPort);
+ }
+ else
+ {
+ m_xine->setBroadcasterPort(0); /* disable */
+ }
+}
+
+void XinePart::slotBroadcastReceive()
+{
+ if (!m_xine->isXineReady())
+ {
+ if (!m_xine->initXine())
+ return;
+ }
+
+ KDialogBase* dialog = new KDialogBase(0, "configmaster", true, i18n("Configure Receive Broadcast Stream"), KDialogBase::Ok|KDialogBase::Cancel);
+ QVBox* page = dialog->makeVBoxMainWidget();
+ new QLabel(i18n("Sender address:"), page);
+ KLineEdit* address = new KLineEdit(m_broadcastAddress, page);
+ new QLabel(i18n("Port:"), page);
+ QSpinBox* port = new QSpinBox(0, 1000000, 1, page);
+ port->setValue(m_broadcastPort);
+
+ if (dialog->exec() == KDialogBase::Accepted)
+ {
+ m_broadcastPort = port->value();
+ m_broadcastAddress = address->text();
+ openURL(MRL(QString("slave://") + m_broadcastAddress + ":" + QString::number(m_broadcastPort)));
+ }
+ delete dialog;
+}
+
+void XinePart::slotJumpToPosition()
+{
+ if (!m_xine->isSeekable())
+ return;
+
+ KDialogBase* dialog = new KDialogBase( 0, "configmaster", true, QString::null, KDialogBase::Ok|KDialogBase::Cancel );
+ QVBox* page = dialog->makeVBoxMainWidget();
+ page->setMargin(5);
+ page->setSpacing(5);
+ dialog->disableResize();
+ new QLabel(i18n("Jump to position:"), page);
+ QTimeEdit* timeEdit = new QTimeEdit(page);
+ if (!m_xine->getLength().isNull())
+ {
+ timeEdit->setMaxValue(m_xine->getLength());
+ timeEdit->setTime(m_xine->getPlaytime());
+ }
+
+ if (dialog->exec() == KDialogBase::Accepted)
+ {
+ m_xine->slotSeekToTime(timeEdit->time());
+ }
+ delete dialog;
+}
+
+void XinePart::slotButtonTimerPressed()
+{
+ m_osdTimerEnabler.start(500, true); /* Long Click is 500ms */
+}
+
+void XinePart::slotButtonTimerReleased()
+{
+ if (!m_osdTimerEnabler.isActive())
+ return; /* If short click toggle timer Mode*/
+ m_osdTimerEnabler.stop();
+ //kdDebug() << "XinePart: Toggling forward/backward Timer." << endl;
+ QTime length = m_xine->getLength();
+
+ if (!length.isNull()) /* if length not available counting backwards has no meaning */
+ {
+ if (m_timerDirection == FORWARD_TIMER)
+ m_timerDirection = BACKWARD_TIMER;
+ else
+ m_timerDirection = FORWARD_TIMER;
+ slotNewPosition(m_xine->getPosition(),m_xine->getPlaytime());
+ }
+}
+
+void XinePart::slotToggleOsdTimer()
+{
+ kdDebug() << "XinePart: Toggling Osd Timer." << endl;
+ m_isOsdTimer = !m_isOsdTimer;
+}
+
+void XinePart::slotConfigXine()
+{
+ if (!m_xine->isXineReady())
+ {
+ if (!m_xine->initXine())
+ return;
+ }
+
+ XineConfig* xineConfigDialog = new XineConfig(m_xine->getXineEngine());
+ xineConfigDialog->exec();
+ delete xineConfigDialog;
+}
+
+void XinePart::slotError(const QString& errMessage)
+{
+ if ((m_playlist.count() > 0) && (m_current < m_playlist.count() - 1))
+ {
+ slotNext(); // try next before aborting playback; e.g. we play a PLS playlist, primary server is full, now try secondary
+ }
+ else
+ {
+ //KMessageBox::detailedError(0, errMessage, m_xine->getXineLog(), i18n("xine Error"));
+ stateChanged("not_playing");
+ KMessageBox::detailedError(0, errMessage, m_xine->getXineLog(), i18n("xine Error"));
+ emit signalPlaybackFailed();
+ }
+}
+
+void XinePart::slotMessage(const QString& message)
+{
+ QString msg = message;
+ if ( msg.startsWith("@") ) {
+ if ( m_xine->isPlaying() && m_xine->getURL().contains("#") ) // do not warn for url containing #
+ return;
+ msg.remove(0,1);
+ }
+ KMessageBox::information(0, msg, i18n("xine Message"));
+}
+
+void XinePart::slotStatus(const QString& status)
+{
+ emit setStatusBarText(status);
+ if ((status != i18n("Ready")) && (status != i18n("Playing")))
+ {
+ m_xine->showOSDMessage(status, DEFAULT_OSD_DURATION);
+ }
+}
+
+void XinePart::slotTrackPlaying()
+{
+ QString caption;
+
+ kdDebug() << "XinePart: xine is playing" << endl;
+ m_pauseButton->setChecked(false);
+ QTimer::singleShot(100, this, SLOT(slotEnablePlayActions()));
+
+ if ( m_xine->getURL()=="DVB" )
+ {
+ caption = m_xine->getTitle();
+ emit setWindowCaption(caption);
+ m_xine->showOSDMessage(caption, DEFAULT_OSD_DURATION);
+ return;
+ }
+
+ /* fill current mrl with meta info */
+ MRL mrl = m_playlist[m_current];
+
+ if (mrl.length().isNull()) /* no meta */
+ {
+ if ((!m_xine->getTitle().isEmpty()) && (!m_xine->getTitle().contains('/'))
+ && (m_xine->getTitle().contains(QRegExp("\\w")) > 2) && (m_xine->getTitle().left(5).lower() != "track"))
+ mrl.setTitle(m_xine->getTitle());
+ if ((mrl.artist().isEmpty()) && (!m_xine->getArtist().isEmpty()))
+ mrl.setArtist(m_xine->getArtist());
+ if ((mrl.album().isEmpty()) && (!m_xine->getAlbum().isEmpty()))
+ mrl.setAlbum(m_xine->getAlbum());
+ if ((mrl.year().isEmpty()) && (!m_xine->getYear().isEmpty()))
+ mrl.setYear(m_xine->getYear());
+ if ((mrl.genre().isEmpty()) && (!m_xine->getGenre().isEmpty()))
+ mrl.setGenre(m_xine->getGenre());
+ if ((mrl.comment().isEmpty()) && (!m_xine->getComment().isEmpty()))
+ mrl.setComment(m_xine->getComment());
+ mrl.setLength(m_xine->getLength());
+ m_playlist[m_current] = mrl;
+ }
+ /* if we don't have a playlist emit signalNewMeta() */
+ if (mrl.url() == m_mrl.url())
+ {
+ m_mrl = mrl;
+ emit signalNewMeta(m_mrl);
+ }
+
+ caption = mrl.title();
+ if (!mrl.artist().isEmpty())
+ caption.append(QString(" (") + mrl.artist() + ")");
+ emit setWindowCaption(caption);
+ m_xine->showOSDMessage(caption, DEFAULT_OSD_DURATION);
+ //emit signalNewFrameSize(m_xine->getVideoSize());
+}
+
+void XinePart::slotPlaybackFinished()
+{
+ if ((m_playlist.count() > 0) && (m_current < m_playlist.count()-1))
+ {
+ slotNext();
+ }
+ else
+ {
+ stateChanged("not_playing");
+ emit signalTrackFinished();
+ }
+}
+
+void XinePart::slotNewLength()
+{
+ m_mrl.setLength(m_xine->getLength());
+ emit signalNewMeta(m_mrl);
+}
+
+void XinePart::slotNewTitle()
+{
+ m_mrl.setTitle(m_xine->getTitle());
+ emit signalNewMeta(m_mrl);
+ emit setWindowCaption(m_mrl.title());
+}
+
+void XinePart::slotNewFrameSize()
+{
+ kdDebug() << "XinePart: got new frame size from xine" << endl;
+ emit signalNewFrameSize(m_xine->getVideoSize());
+}
+
+void XinePart::slotContextMenu(const QPoint& pos)
+{
+ if (factory())
+ {
+ KPopupMenu *pop = (KPopupMenu*)factory()->container("context_menu", this);
+ if (pop)
+ pop->popup(pos);
+ }
+ else
+ {
+ if (m_embeddedContext)
+ m_embeddedContext->popup(pos);
+ }
+}
+
+void XinePart::slotDVDMenuLeft()
+{
+ if (m_xine)
+ m_xine->slotDVDMenuLeft();
+}
+
+void XinePart::slotDVDMenuRight()
+{
+ if (m_xine)
+ m_xine->slotDVDMenuRight();
+}
+
+void XinePart::slotDVDMenuUp()
+{
+ if (m_xine)
+ m_xine->slotDVDMenuUp();
+}
+
+void XinePart::slotDVDMenuDown()
+{
+ if (m_xine)
+ m_xine->slotDVDMenuDown();
+}
+
+void XinePart::slotDVDMenuSelect()
+{
+ if (m_xine)
+ m_xine->slotDVDMenuSelect();
+}
+
+void XinePart::slotInfo()
+{
+ MRL mrl;
+ if ( m_xine->getURL()=="DVB" )
+ mrl=MRL( QString("DVB"), m_xine->getTitle() );
+ else
+ {
+ if ((m_mrl.isEmpty()) || (m_xine->getTitle().isNull()))
+ return;
+ mrl = m_playlist[m_current];
+ }
+
+ QString info;
+ QTextStream ts(&info, IO_WriteOnly);
+ ts << "<qt><table width=\"90%\">";
+ ts << "<tr><td colspan=\"2\"><center><b>" << mrl.title() << "</b></center></td></tr>";
+ if (!mrl.artist().isNull())
+ ts << "<tr><td><b>" << i18n("Artist") << ":</b></td><td> " << mrl.artist() << "</td></tr>";
+ if (!mrl.album().isNull())
+ ts << "<tr><td><b>" << i18n("Album") << ":</b></td><td> " << mrl.album() << "</td></tr>";
+ if (!mrl.track().isNull())
+ ts << "<tr><td><b>" << i18n("Track") << ":</b></td><td> " << mrl.track() << "</td></tr>";
+ if (!mrl.year().isNull())
+ ts << "<tr><td><b>" << i18n("Year") << ":</b></td><td> " << mrl.year() << "</td></tr>";
+ if (!mrl.genre().isNull())
+ ts << "<tr><td><b>" << i18n("Genre") << ":</b></td><td> " << mrl.genre() << "</td></tr>";
+ if (!(mrl.length().isNull()))
+ ts << "<tr><td><b>" << i18n("Length") << ":</b></td><td> " << mrl.length().toString("h:mm:ss") << "</td></tr>";
+
+ ts << "<br>";
+ ts << "<tr><td><b>" << i18n("Mime") << ":</b></td><td> " << mrl.mime() << "</td></tr>";
+ if (m_xine->hasAudio())
+ ts << "<tr><td><b>" << i18n("Audio") << ":</b></td><td> " << m_xine->getAudioCodec() << " " << QString::number(m_xine->getAudioBitrate()/1000)
+ << "kb/s</td></tr>";
+ if (m_xine->hasVideo())
+ ts << "<tr><td><b>" << i18n("Video") << ":</b></td><td> " << m_xine->getVideoCodec() << " " << m_xine->getVideoSize().width() << "x"
+ << m_xine->getVideoSize().height() << "(" << m_xine->getVideoWidth() << "x" << m_xine->getVideoHeight() << ")"<< "</td></tr>";
+
+ ts << "<br>";
+ if (m_xine->hasSubtitleURL())
+ ts << "<tr><td><b>" << i18n("Subtitle File") << ":</b></td><td> " << m_xine->getSubtitleURL() << "</td></tr>";
+ if (m_xine->hasSaveURL())
+ ts << "<tr><td><b>" << i18n("Save Stream as") << ":</b></td><td> " << m_xine->getSaveURL() << "</td></tr>";
+
+ ts << "<tr><td></td><td></td></tr>"; // added for better layout
+ ts << "</table></qt>";
+ KMessageBox::information(0, info, i18n("Track info") );
+}
+
+void XinePart::slotFinalize()
+{
+ if (factory())
+ {
+ KToolBar *pos = (KToolBar*)factory()->container("positionToolBar", this);
+ if (pos)
+ {
+ // pos->alignItemRight(pos->idAt(1), true); //align time widget right
+ pos->setItemAutoSized(pos->idAt(0), true); //set position slider to maximum width
+ }
+ else
+ kdWarning("Position toolbar not found");
+ }
+ else
+ {
+ kdDebug() << "XinePart: no xmlguifactory, will create a simple context menu..." << endl;
+ KAction* action = NULL;
+ m_embeddedContext = new KPopupMenu(0);
+ m_embeddedContext->insertTitle(instance()->iconLoader()->loadIcon("kaffeine", KIcon::Small), i18n("Kaffeine Player"));
+ actionCollection()->action("player_play")->plug(m_embeddedContext);
+ actionCollection()->action("player_pause")->plug(m_embeddedContext);
+ actionCollection()->action("player_stop")->plug(m_embeddedContext);
+ actionCollection()->action("volume_increase")->plug(m_embeddedContext);
+ actionCollection()->action("volume_decrease")->plug(m_embeddedContext);
+ actionCollection()->action("audio_mute")->plug(m_embeddedContext);
+ m_embeddedContext->insertSeparator();
+ actionCollection()->action("player_track_info")->plug(m_embeddedContext);
+ m_embeddedContext->insertSeparator();
+ actionCollection()->action("file_save_screenshot")->plug(m_embeddedContext);
+ actionCollection()->action("file_save_stream")->plug(m_embeddedContext);
+ m_embeddedContext->insertSeparator();
+ action = new KAction(i18n("Copy URL to Clipboard"), "editcopy", 0, this, SLOT(slotCopyToClipboard()), actionCollection(), "copy_to_clipboard");
+ action->plug(m_embeddedContext);
+ action = new KAction(i18n("Play in Kaffeine Externally"), "gear", 0, this, SLOT(slotLaunchExternally()), actionCollection(), "play_externally");
+ action->plug(m_embeddedContext);
+ }
+
+ QStringList visuals = m_xine->getVisualPlugins();
+ visuals.prepend("none");
+ m_audioVisual->setItems(visuals);
+
+ loadConfig();
+ QTimer::singleShot(0, this, SLOT(slotEnableAllActions()));
+}
+
+void XinePart::slotCopyToClipboard()
+{
+ kdDebug() << "XinePart: Send URL to klipper: " << m_mrl.url() << endl;
+ DCOPClient* client = KApplication::dcopClient();
+ if (!client->send("klipper", "klipper", "setClipboardContents(QString)", m_mrl.url()))
+ kdError() << "Can't send current URL to klipper" << endl;
+}
+
+void XinePart::slotLaunchExternally()
+{
+ slotStop();
+
+ QTimer::singleShot(1000, this, SLOT(slotLaunchDelayed()));
+}
+
+void XinePart::slotLaunchDelayed()
+{
+ kdDebug() << "XinePart: Start Kaffeine with argument: " << m_mrl.url() << endl;
+ KProcess process;
+ process << "kaffeine" << m_mrl.url();
+ kdDebug() << "XinePart: Launching Kaffeine externaly..." << endl;
+ process.start(KProcess::DontCare);
+ process.detach();
+}
+
+void XinePart::initActions()
+{
+ KAction* action = NULL;
+ /* file menu */
+ m_broadcastSend = new KToggleAction(i18n("&Send Broadcast Stream..."), 0, 0, this, SLOT(slotToggleBroadcastSend()), actionCollection(), "network_send");
+ new KAction(i18n("&Receive Broadcast Stream..."), "network", 0, this, SLOT(slotBroadcastReceive()), actionCollection(), "network_receive");
+ new KAction(i18n("&Save Screenshot..."), "frame_image", CTRL|Key_S, this, SLOT(slotScreenshot()), actionCollection(), "file_save_screenshot");
+ action = new KAction(i18n("Save Stream..."), "player_record", Key_R, this, SLOT(slotSaveStream()), actionCollection(), "file_save_stream");
+ action->setWhatsThis(i18n("Saves current stream to harddisc. This feature was disabled for some formats (e.g. Real Media) to prevent potential legal problems."));
+
+ /* player menu */
+
+ new KAction(i18n("Toggle Minimal Mode"), 0, 0, this, SIGNAL(signalToggleMinimalMode()), actionCollection(), "player_minimal_mode");
+
+ new KAction(i18n("Play"), "player_play", 0, this, SLOT(slotPlay()), actionCollection(), "player_play");
+ m_pauseButton = new KToggleAction(i18n("Pause"), "player_pause", Key_Space, this, SLOT(slotTogglePause()), actionCollection(), "player_pause");
+ new KAction(i18n("&Next"), "player_end", Key_PageDown, this, SLOT(slotNext()), actionCollection(), "player_next");
+ new KAction(i18n("&Previous"), "player_start", Key_PageUp, this, SLOT(slotPrevious()), actionCollection(), "player_previous");
+ new KAction(i18n("Stop"), "player_stop", Key_Backspace, this, SLOT(slotStop()), actionCollection(), "player_stop");
+
+ new KAction(i18n("&Fast Forward"), "player_fwd", ALT|Key_Right, this, SLOT(slotFastForward()), actionCollection(), "player_ff");
+ new KAction(i18n("Slow &Motion"), 0, ALT|Key_Left, this, SLOT(slotSlowMotion()), actionCollection(), "player_slowmotion");
+
+ new KAction(i18n("Skip Forward (20s)"), NULL, Key_Right, this, SLOT(slotPosPlusSmall()), actionCollection(), "player_posplus_small");
+ new KAction(i18n("Skip Backward (20s)"), NULL, Key_Left, this, SLOT(slotPosMinusSmall()), actionCollection(), "player_posminus_small");
+ new KAction(i18n("Skip Forward (1m)"), NULL, CTRL|Key_PageUp, this, SLOT(slotPosPlusMedium()), actionCollection(), "player_posplus_medium");
+ new KAction(i18n("Skip Backward (1m)"), NULL, CTRL|Key_PageDown, this, SLOT(slotPosMinusMedium()), actionCollection(), "player_posminus_medium");
+ new KAction(i18n("Skip Forward (10m)"), NULL, ALT|Key_PageUp, this, SLOT(slotPosPlusLarge()), actionCollection(), "player_posplus_large");
+ new KAction(i18n("Skip Backward (10m)"), NULL, ALT|Key_PageDown, this, SLOT(slotPosMinusLarge()), actionCollection(), "player_posminus_large");
+ new KAction(i18n("Jump to Position..."), "goto", CTRL|Key_J, this, SLOT(slotJumpToPosition()), actionCollection(), "player_jump_to");
+
+ new KAction(i18n("DVD Menu Left"), 0, CTRL|Key_Left, this, SLOT(slotDVDMenuLeft()), actionCollection(), "dvdmenuleft");
+ new KAction(i18n("DVD Menu Right"), 0, CTRL|Key_Right, this, SLOT(slotDVDMenuRight()), actionCollection(), "dvdmenuright");
+ new KAction(i18n("DVD Menu Up"), 0, CTRL|Key_Up, this, SLOT(slotDVDMenuUp()), actionCollection(), "dvdmenuup");
+ new KAction(i18n("DVD Menu Down"), 0, CTRL|Key_Down, this, SLOT(slotDVDMenuDown()), actionCollection(), "dvdmenudown");
+ new KAction(i18n("DVD Menu Select"), 0, CTRL|Key_Return, this, SLOT(slotDVDMenuSelect()), actionCollection(), "dvdmenuselect");
+
+ m_audioChannels = new KSelectAction(i18n("Audio Channel"), 0, actionCollection(), "audio_channels");
+ m_audioChannels->setToolTip(i18n("Select audio channel"));
+ m_audioChannels->setComboWidth( 50 );
+ connect(m_audioChannels, SIGNAL(activated(int)), this, SLOT(slotSetAudioChannel(int )));
+ new KAction(i18n("&Next Audio Channel"), 0, 0, this, SLOT(slotNextAudioChannel()), actionCollection(), "next_audio_channels");
+ m_audioVisual = new KSelectAction(i18n("Audio &Visualization"), 0, actionCollection(), "audio_visualization");
+ connect(m_audioVisual, SIGNAL(activated(const QString&)), m_xine, SLOT(slotSetVisualPlugin(const QString&)));
+ new KAction(i18n("&Mute"), "player_mute", Key_U, this, SLOT(slotMute()), actionCollection(), "audio_mute");
+ new KAction(i18n("Volume Up"), NULL, Key_Plus, this, SLOT(slotVolumeUp()), actionCollection(), "volume_increase");
+ new KAction(i18n("Volume Down"), NULL, Key_Minus, this, SLOT(slotVolumeDown()), actionCollection(), "volume_decrease");
+
+ m_deinterlaceEnabled = new KToggleAction(i18n("&Deinterlace"), 0, Key_I, m_xine, SLOT(slotToggleDeinterlace()), actionCollection(), "video_deinterlace");
+ m_deinterlaceEnabled->setWhatsThis(i18n("Activate this for interlaced streams, some DVD's for example."));
+ new KAction(i18n("&Auto"), "viewmagfit", Key_F5, m_xine, SLOT(slotAspectRatioAuto()), actionCollection(), "aspect_auto");
+ new KAction(i18n("&4:3"), "viewmagfit", Key_F6, m_xine, SLOT(slotAspectRatio4_3()), actionCollection(), "aspect_43");
+ new KAction(i18n("A&namorphic"), "viewmagfit", Key_F7, m_xine, SLOT(slotAspectRatioAnamorphic()), actionCollection(), "aspect_anamorphic");
+ new KAction(i18n("&DVB"), "viewmagfit", Key_F8, m_xine, SLOT(slotAspectRatioDVB()), actionCollection(), "aspect_dvb");
+ new KAction(i18n("&Square"), "viewmagfit", Key_F9, m_xine, SLOT(slotAspectRatioSquare()), actionCollection(), "aspect_square");
+ KStdAction::zoomIn(m_xine, SLOT(slotZoomIn()), actionCollection(), "zoom_in");
+ KStdAction::zoomOut(m_xine, SLOT(slotZoomOut()), actionCollection(), "zoom_out");
+ KStdAction::fitToPage(m_xine, SLOT(slotZoomOff()), actionCollection(), "zoom_off");
+ new KAction(i18n("Zoom In Horizontal"), NULL, CTRL|Key_H, m_xine, SLOT(slotZoomInX()), actionCollection(), "zoom_in_x");
+ new KAction(i18n("Zoom Out Horizontal"), NULL, CTRL|SHIFT|Key_H, m_xine, SLOT(slotZoomOutX()), actionCollection(), "zoom_out_x");
+ new KAction(i18n("Zoom In Vertical"), NULL, CTRL|Key_V, m_xine, SLOT(slotZoomInY()), actionCollection(), "zoom_in_y");
+ new KAction(i18n("Zoom Out Vertical"), NULL, CTRL|SHIFT|Key_V, m_xine, SLOT(slotZoomOutY()), actionCollection(), "zoom_out_y");
+ new KAction(i18n("Deinterlace &Quality"), "blend", CTRL|Key_I, this, SLOT(slotDeinterlaceQuality()), actionCollection(), "video_deinterlace_quality");
+ new KAction(i18n("&Video Settings"), "configure", Key_V, this, SLOT(slotPictureSettings()), actionCollection(), "video_picture");
+ new KAction(i18n("&Equalizer"), NULL, Key_E, this, SLOT(slotEqualizer()), actionCollection(), "equalizer");
+
+
+ m_subtitles = new KSelectAction(i18n("Subtitle"), 0, actionCollection(), "player_subtitles");
+ m_subtitles->setToolTip(i18n("Select Subtitle"));
+ m_subtitles->setComboWidth( 50 );
+ connect(m_subtitles, SIGNAL(activated(int)), this, SLOT(slotSetSubtitle(int)));
+ new KAction(i18n("&Next Subtitle Channel"), 0, 0, this, SLOT(slotNextSubtitleChannel()), actionCollection(), "next_player_subtitles");
+ new KAction(i18n("Delay Subtitle"), 0, CTRL|ALT|Key_Left, this, SLOT(slotDelaySubTitle()), actionCollection(), "adv_sub");
+ new KAction(i18n("Advance Subtitle"), 0, CTRL|ALT|Key_Right, this, SLOT(slotAdvanceSubTitle()), actionCollection(), "delay_sub");
+ new KAction(i18n("Add subtitle..."), 0, 0, this, SLOT(slotAddSubtitle()), actionCollection(), "add_subtitle");
+
+ new KAction(i18n("&Menu Toggle"), "view_detailed", Key_D, m_xine, SLOT(slotMenuToggle()), actionCollection(), "dvd_toggle");
+ new KAction(i18n("&Title"), NULL, 0, m_xine, SLOT(slotMenuTitle()), actionCollection(), "dvd_title");
+ new KAction(i18n("&Root"), NULL, 0, m_xine, SLOT(slotMenuRoot()), actionCollection(), "dvd_root");
+ new KAction(i18n("&Subpicture"), NULL, 0, m_xine, SLOT(slotMenuSubpicture()), actionCollection(), "dvd_subpicture");
+ new KAction(i18n("&Audio"), NULL, 0, m_xine, SLOT(slotMenuAudio()), actionCollection(), "dvd_audio");
+ new KAction(i18n("An&gle"), NULL, 0, m_xine, SLOT(slotMenuAngle()), actionCollection(), "dvd_angle");
+ new KAction(i18n("&Part"), NULL, 0, m_xine, SLOT(slotMenuPart()), actionCollection(), "dvd_part");
+
+ m_dvdTitles = new KSelectAction(i18n("Titles"), 0, actionCollection(), "dvd_title_menu");
+ connect(m_dvdTitles, SIGNAL(activated(const QString&)), this, SLOT(slotSetDVDTitle(const QString&)));
+ m_dvdChapters = new KSelectAction(i18n("Chapters"), 0, actionCollection(), "dvd_chapter_menu");
+ connect(m_dvdChapters, SIGNAL(activated(const QString&)), this, SLOT(slotSetDVDChapter(const QString&)));
+ m_dvdAngles = new KSelectAction(i18n("Angles"), 0, actionCollection(), "dvd_angle_menu");
+ connect(m_dvdAngles, SIGNAL(activated(const QString&)), this, SLOT(slotSetDVDAngle(const QString&)));
+
+ new KAction(i18n("Track &Info"), "info", 0 , this, SLOT(slotInfo()), actionCollection(), "player_track_info");
+ new KAction(i18n("Effect &Plugins..."), "filter", Key_X, this, SLOT(slotFilterDialog()), actionCollection(), "player_post_filters");
+
+ /* settings menu */
+ new KAction(i18n("&xine Engine Parameters"), "edit", 0, this, SLOT(slotConfigXine()), actionCollection(), "settings_xine_parameter");
+
+ m_volume = new VolumeSlider();
+ QToolTip::add
+ (m_volume, i18n("Volume"));
+ m_volume->setRange(0, 100);
+ m_volume->setSteps(1, 10);
+ m_volume->setFocusPolicy(QWidget::NoFocus);
+ m_volume->setFixedWidth(75);
+ connect(m_volume, SIGNAL(valueChanged(int)), this, SLOT(slotVolumeChanged(int)));
+ connect(m_xine, SIGNAL(signalSyncVolume()), this, SLOT(slotSyncVolume()));
+ new KWidgetAction(m_volume, i18n("Volume"), 0, 0, 0, actionCollection(), "audio_volume");
+
+ m_position = new PositionSlider(Horizontal);
+ QToolTip::add
+ (m_position, i18n("Position"));
+ m_position->setRange(0, 65535);
+ m_position->setSteps(100, 1000);
+ m_position->setTracking(false);
+ m_position->setFocusPolicy(QWidget::NoFocus);
+ m_position->setMinimumWidth(180);
+ connect(m_position, SIGNAL(sliderMoved(int)), m_xine, SLOT(slotSeekToPosition(int)));
+ connect(m_position, SIGNAL(sliderLastMove(int)), m_xine, SLOT(slotSeekToPositionBlocking(int)));
+ connect(m_position, SIGNAL(signalStartSeeking()), m_xine, SLOT(slotStartSeeking()));
+ connect(m_position, SIGNAL(signalStopSeeking()), m_xine, SLOT(slotStopSeeking()));
+ new KWidgetAction(m_position, i18n("Position"), 0, 0, 0, actionCollection(), "player_position");
+
+ m_playTime = new QPushButton(0);
+ QToolTip::add
+ (m_playTime, i18n("Short click: Toggle Timer Forward/Backward\nLong click: Toggle Timer OSD"));
+ QFontMetrics met(KGlobalSettings::generalFont());
+ m_playTime->setFixedWidth(met.width("-55:55:55") + 6);
+ m_playTime->setSizePolicy(QSizePolicy (QSizePolicy::Fixed, QSizePolicy::Fixed));
+ m_playTime->setFocusPolicy(QWidget::NoFocus);
+ new KWidgetAction(m_playTime, i18n("Playtime"), 0, 0, 0, actionCollection(), "player_playtime");
+ connect(m_playTime, SIGNAL(pressed()), this, SLOT(slotButtonTimerPressed()));
+ connect(m_playTime, SIGNAL(released()), this, SLOT(slotButtonTimerReleased()));
+ m_playTime->setText("0:00:00");
+
+ m_equalizer = new Equalizer();
+ connect(m_equalizer, SIGNAL(signalNewEq30(int)), m_xine, SLOT(slotSetEq30(int)));
+ connect(m_equalizer, SIGNAL(signalNewEq60(int)), m_xine, SLOT(slotSetEq60(int)));
+ connect(m_equalizer, SIGNAL(signalNewEq125(int)), m_xine, SLOT(slotSetEq125(int)));
+ connect(m_equalizer, SIGNAL(signalNewEq250(int)), m_xine, SLOT(slotSetEq250(int)));
+ connect(m_equalizer, SIGNAL(signalNewEq500(int)), m_xine, SLOT(slotSetEq500(int)));
+ connect(m_equalizer, SIGNAL(signalNewEq1k(int)), m_xine, SLOT(slotSetEq1k(int)));
+ connect(m_equalizer, SIGNAL(signalNewEq2k(int)), m_xine, SLOT(slotSetEq2k(int)));
+ connect(m_equalizer, SIGNAL(signalNewEq4k(int)), m_xine, SLOT(slotSetEq4k(int)));
+ connect(m_equalizer, SIGNAL(signalNewEq8k(int)), m_xine, SLOT(slotSetEq8k(int)));
+ connect(m_equalizer, SIGNAL(signalNewEq16k(int)), m_xine, SLOT(slotSetEq16k(int)));
+ connect(m_equalizer, SIGNAL(signalSetVolumeGain(bool)), m_xine, SLOT(slotSetVolumeGain(bool)));
+
+}
+
+void XinePart::initConnections()
+{
+ connect(&m_posCheckTimer, SIGNAL(timeout()), this, SLOT(slotCheckMoved()));
+ connect(&m_osdTimerEnabler, SIGNAL(timeout()), this, SLOT(slotToggleOsdTimer()));
+ connect(m_xine, SIGNAL(signalXineReady()), this, SLOT(slotFinalize()));
+ connect(m_xine, SIGNAL(signalNewChannels(const QStringList&, const QStringList&, int, int )),
+ this, SLOT(slotChannelInfo(const QStringList&, const QStringList&, int, int )));
+ connect(m_xine, SIGNAL(signalXinePlaying()), this, SLOT(slotTrackPlaying()));
+ connect(m_xine, SIGNAL(signalNewPosition(int, const QTime&)), this, SLOT(slotNewPosition(int, const QTime&)));
+ connect(m_xine, SIGNAL(signalXineStatus(const QString&)), this, SLOT(slotStatus(const QString&)));
+ connect(m_xine, SIGNAL(signalXineError(const QString&)), this, SLOT(slotError(const QString&)));
+ connect(m_xine, SIGNAL(signalXineMessage(const QString&)), this, SLOT(slotMessage(const QString&)));
+ connect(m_xine, SIGNAL(signalPlaybackFinished()), this, SLOT(slotPlaybackFinished()));
+ connect(m_xine, SIGNAL(signalTitleChanged()), this, SLOT(slotNewTitle()));
+ connect(m_xine, SIGNAL(signalLengthChanged()), this, SLOT(slotNewLength()));
+ connect(m_xine, SIGNAL(signalVideoSizeChanged()), this, SLOT(slotNewFrameSize()));
+ connect(m_xine, SIGNAL(signalRightClick(const QPoint&)), this, SLOT(slotContextMenu(const QPoint&)));
+}
+
+void XinePart::loadConfig()
+{
+ kdDebug() << "XinePart: load config" << endl;
+
+ KConfig* config = instance()->config();
+
+ config->setGroup("General Options");
+ if (m_xine->SoftwareMixing())
+ {
+ int vol = config->readNumEntry("Volume", 70);
+ slotSetVolume(vol);
+ }
+ else
+ slotSyncVolume();
+ m_timerDirection = config->readNumEntry("Timer Direction", FORWARD_TIMER);
+ m_isOsdTimer = config->readBoolEntry("Osd Timer", false);
+
+ config->setGroup("Visualization");
+ QString visual = config->readEntry("Visual Plugin", "goom");
+ m_audioVisual->setCurrentItem(m_audioVisual->items().findIndex(visual));
+ m_xine->slotSetVisualPlugin(visual);
+
+ config->setGroup("Deinterlace");
+ m_lastDeinterlaceQuality = config->readNumEntry("Quality Level", 4);
+ m_lastDeinterlacerConfig = config->readEntry("Config String", DEFAULT_TVTIME_CONFIG);
+ DeinterlacerConfigDialog* deinterlacerConfigDialog = new DeinterlacerConfigDialog();
+ m_xine->createDeinterlacePlugin(m_lastDeinterlacerConfig, deinterlacerConfigDialog->getMainWidget());
+ m_deinterlacerConfigWidget = (QWidget*)deinterlacerConfigDialog;
+ bool deinterlaceEnabled = config->readBoolEntry("Enabled", true);
+ if (deinterlaceEnabled)
+ {
+ m_deinterlaceEnabled->setChecked(deinterlaceEnabled);
+ m_xine->slotToggleDeinterlace();
+ }
+
+ config->setGroup("Broadcasting Options");
+ m_broadcastPort = config->readNumEntry("Port", 8080);
+ m_broadcastAddress = config->readEntry("Master Address", "localhost");
+
+ config->setGroup( "Video Settings" );
+ slotSetHue(config->readNumEntry( "Hue", -1));
+ slotSetSaturation(config->readNumEntry( "Saturation", -1));
+ slotSetContrast(config->readNumEntry( "Contrast", -1));
+ slotSetBrightness(config->readNumEntry( "Brigthness", -1));
+
+ m_equalizer->ReadValues(config);
+}
+
+void XinePart::saveConfig()
+{
+ if (!m_audioVisual->items().count()) // no config loaded
+ return;
+
+ kdDebug() << "XinePart: save config" << endl;
+
+ KConfig* config = instance()->config();
+
+ config->setGroup("General Options");
+ config->writeEntry("Volume", m_volume->value());
+ config->writeEntry("Timer Direction", m_timerDirection);
+ config->writeEntry("Osd Timer", m_isOsdTimer);
+
+ config->setGroup("Visualization");
+ config->writeEntry("Visual Plugin", m_audioVisual->currentText());
+
+ config->setGroup("Deinterlace");
+ config->writeEntry("Quality Level", m_lastDeinterlaceQuality);
+ config->writeEntry("Config String", m_lastDeinterlacerConfig);
+ config->writeEntry("Enabled", m_deinterlaceEnabled->isChecked());
+
+ config->setGroup("Broadcasting Options");
+ config->writeEntry("Port", m_broadcastPort);
+ config->writeEntry("Master Address", m_broadcastAddress);
+
+ config->setGroup( "Video Settings" );
+ config->writeEntry( "Hue", m_hue );
+ config->writeEntry( "Saturation", m_saturation );
+ config->writeEntry( "Contrast", m_contrast );
+ config->writeEntry( "Brigthness", m_brightness );
+
+ m_equalizer->SaveValues(config);
+}
+
+/* check if shell was moved, send new global position
+ of the part to xine */
+void XinePart::slotCheckMoved()
+{
+ QPoint newPos = m_xine->mapToGlobal(QPoint(0,0));
+ if (newPos != m_oldPosition)
+ {
+ m_xine->globalPosChanged();
+ m_oldPosition = newPos;
+ }
+}
+
+bool XinePart::isPlaying()
+{
+ return m_xine->isPlaying();
+}
+
+bool XinePart::isPaused()
+{
+ return (m_xine->getSpeed() == KXineWidget::Pause);
+}
+
+#if 0
+void XinePart::audiocdMRLS(MRL::List& mrls, bool& ok, bool& supported, const QString& device)
+{
+ if (!m_xine->isXineReady())
+ {
+ if (!m_xine->initXine())
+ {
+ supported = false;
+ return;
+ }
+ }
+ supported = true;
+
+ if (!device.isNull())
+ m_xine->slotSetAudiocdDevice(device);
+
+ QStringList list;
+ if (!m_xine->getAutoplayPluginURLS("CD", list))
+ {
+ ok = false;
+ return;
+ }
+
+ MRL mrl;
+ /* use xine to connect to CDDB */
+ xine_stream_t* xineStreamForMeta = xine_stream_new((xine_t*)m_xine->getXineEngine(), NULL, NULL);
+
+ KProgressDialog* progress = new KProgressDialog(0, "cddbprogress", QString::null, i18n("Looking for CDDB entries..."));
+ progress->progressBar()->setTotalSteps(list.count());
+ progress->show();
+ QString title;
+ bool cddb = true;
+ for (uint i = 0; i < list.count(); i++)
+ {
+ mrl = MRL(list[i]);
+ mrl.setTitle(i18n("AudioCD Track %1").arg(i+1));
+ mrl.setTrack(QString::number(i+1));
+ if (xine_open(xineStreamForMeta, QFile::encodeName(mrl.url())))
+ {
+ if (cddb)
+ {
+ title = QString::fromUtf8(xine_get_meta_info(xineStreamForMeta, XINE_META_INFO_TITLE));
+ if ((!title.isNull()) && (!title.isEmpty()) ) //no meta info
+ {
+ mrl.setTitle(title);
+ mrl.setArtist(QString::fromUtf8(xine_get_meta_info(xineStreamForMeta, XINE_META_INFO_ARTIST)));
+ mrl.setAlbum(QString::fromUtf8(xine_get_meta_info(xineStreamForMeta, XINE_META_INFO_ALBUM)));
+ mrl.setYear(QString::fromUtf8(xine_get_meta_info(xineStreamForMeta, XINE_META_INFO_YEAR)));
+ mrl.setGenre(QString::fromUtf8(xine_get_meta_info(xineStreamForMeta, XINE_META_INFO_GENRE)));
+ mrl.setTrack(QString::number(i+1));
+ }
+ else
+ cddb = false;
+ }
+
+ int pos, time, len;
+ int t = 0, ret = 0;
+ while(((ret = xine_get_pos_length(xineStreamForMeta, &pos, &time, &len)) == 0) && (++t < 5))
+ xine_usec_sleep(100000);
+ if ( ( ret != 0 ) && (len > 0) )
+ mrl.setLength(QTime().addMSecs(len));
+
+ xine_close( xineStreamForMeta );
+ }
+
+ mrl.setMime("audio/cd");
+ mrls.append(mrl);
+ if (progress->wasCancelled())
+ break;
+ progress->progressBar()->setProgress(i+1);
+ KApplication::kApplication()->processEvents();
+ }
+
+ xine_dispose(xineStreamForMeta);
+ delete progress;
+ if (mrls.count())
+ ok = true;
+}
+
+void XinePart::vcdMRLS(MRL::List& mrls, bool& ok, bool& supported, const QString& device)
+{
+ if (!m_xine->isXineReady())
+ {
+ if (!m_xine->initXine())
+ {
+ supported = false;
+ return;
+ }
+ }
+ supported = true;
+
+ if (!device.isNull())
+ m_xine->slotSetVcdDevice(device);
+
+ QStringList list;
+ if (!m_xine->getAutoplayPluginURLS("VCD", list))
+ {
+ if (!m_xine->getAutoplayPluginURLS("VCDO", list))
+ {
+ ok = false;
+ return;
+ }
+ }
+
+ MRL mrl;
+ for (uint i = 0; i < list.count(); i++)
+ {
+ mrl = MRL(list[i]);
+ mrl.setMime("video/vcd");
+ mrl.setTrack(QString::number(i+1));
+ mrl.setTitle(i18n("VCD Track %1").arg(i+1));
+ mrls.append(mrl);
+ }
+ if (mrls.count())
+ ok = true;
+}
+
+void XinePart::dvdMRLS(MRL::List& mrls, bool& ok, bool& supported, const QString& device)
+{
+ if (!m_xine->isXineReady())
+ {
+ if (!m_xine->initXine())
+ {
+ supported = false;
+ return;
+ }
+ }
+ supported = true;
+
+ if (!device.isNull())
+ m_xine->slotSetDvdDevice(device);
+
+ QStringList list;
+ if (!m_xine->getAutoplayPluginURLS("DVD", list))
+ {
+ ok = false;
+ return;
+ }
+
+ MRL mrl;
+ for (uint i = 0; i < list.count(); i++)
+ {
+ mrl = MRL(list[i]);
+ mrl.setMime("video/dvd");
+ mrl.setTitle("DVD");
+ mrl.setTrack(QString::number(i+1));
+ mrls.append(mrl);
+ }
+ if (mrls.count())
+ ok = true;
+}
+#endif
+
+bool XinePart::hasChapters()
+{
+ if (m_xine->isXineReady())
+ return m_xine->hasChapters();
+ else
+ return false;
+}
+
+bool XinePart::hasVideo()
+{
+ return m_xine->hasVideo();
+}
+
+void XinePart::playNextChapter()
+{
+ if (m_xine->isXineReady())
+ m_xine->playNextChapter();
+}
+
+void XinePart::playPreviousChapter()
+{
+ if (m_xine->isXineReady())
+ m_xine->playPreviousChapter();
+}
+
+void XinePart::slotPrepareForFullscreen(bool fullscreen)
+{
+ if (fullscreen)
+ m_xine->startMouseHideTimer();
+ else
+ m_xine->stopMouseHideTimer();
+}
+
+uint XinePart::volume() const
+{
+ if (!m_xine->isXineReady())
+ return 0;
+
+ return m_xine->getVolume();
+}
+
+uint XinePart::position() const
+{
+ if (!m_xine->isXineReady())
+ return 0;
+
+ if ( m_xine->isPlaying() )
+ return currentPosition;
+ else
+ return 0;
+}
+
+void XinePart::slotSetVolume(uint vol)
+{
+ if (!m_xine->isXineReady())
+ return;
+
+ kdDebug() << "Set volume to: " << vol << endl;
+ m_volume->setValue(vol);
+}
+
+void XinePart::slotVolumeChanged(int vol)
+{
+ m_xine->slotSetVolume(vol);
+}
+
+void XinePart::slotSyncVolume()
+{
+ if (!m_xine->isXineReady())
+ return;
+
+ uint vol = volume();
+ slotSetVolume(vol);
+}
+
+void XinePart::slotSetPosition(uint pos)
+{
+ if (!m_xine->isXineReady())
+ return;
+
+ m_xine->slotSeekToPosition((int)(pos * 655.35));
+}
+
+QString XinePart::supportedExtensions()
+{
+ if (!m_xine->isXineReady())
+ return QString::null;
+
+ QString ext = m_xine->getSupportedExtensions();
+ ext = ext.remove("txt");
+ ext = "*." + ext;
+ ext.append(" smil");
+ ext = ext.replace( ' ', " *." );
+ ext = ext + " " + ext.upper();
+
+ return ext;
+}
+
+void* XinePart::engine()
+{
+ if (!m_xine->isXineReady())
+ return NULL;
+
+ return (void*)m_xine->getXineEngine();
+}
+
+void XinePart::slotDisableAllActions()
+{
+ stateChanged("xine_not_ready");
+}
+
+void XinePart::slotEnableAllActions()
+{
+ stateChanged("xine_not_ready", StateReverse);
+ stateChanged("not_playing");
+}
+
+void XinePart::slotEnablePlayActions()
+{
+ if ((m_playlist.count() > 1) || (m_xine->hasChapters())) // we need next/previous buttons
+ stateChanged("play_multiple_tracks");
+ else
+ stateChanged("play_single_track");
+}
+
+void XinePart::slotNextAudioChannel()
+{
+ nextAudioChannel();
+}
+
+void XinePart::slotNextSubtitleChannel()
+{
+ nextSubtitleChannel();
+}
+
+/********* DCOP INTERFACE *********/
+
+void XinePart::nextAudioChannel()
+{
+ int num = m_audioChannels->items().count();
+ int index = m_audioChannels->currentItem()+1;
+ if ( index>=num )
+ index = 0;
+ m_audioChannels->setCurrentItem( index );
+ slotSetAudioChannel( index );
+}
+
+void XinePart::nextSubtitleChannel()
+{
+ int num = m_subtitles->items().count();
+ int index = m_subtitles->currentItem()+1;
+ if ( index>=num )
+ index = 0;
+ m_subtitles->setCurrentItem( index );
+ slotSetSubtitle( index );
+}
+
+int XinePart::getContrast()
+{
+ int hue, sat, contrast, bright, avOffset, spuOffset;
+ if (!m_xine->isXineReady())
+ return -1;
+ m_xine->getVideoSettings(hue, sat, contrast, bright, avOffset, spuOffset);
+ return contrast;
+}
+
+void XinePart::setContrast(int c)
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotSetContrast(c);
+}
+
+int XinePart::getBrightness()
+{
+ int hue, sat, contrast, bright, avOffset, spuOffset;
+ if (!m_xine->isXineReady())
+ return -1;
+ m_xine->getVideoSettings(hue, sat, contrast, bright, avOffset, spuOffset);
+ return bright;
+}
+
+void XinePart::setBrightness(int b)
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotSetBrightness(b);
+}
+
+void XinePart::dvdMenuUp()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotDVDMenuUp();
+}
+
+void XinePart::dvdMenuDown()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotDVDMenuDown();
+}
+
+void XinePart::dvdMenuLeft()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotDVDMenuLeft();
+}
+
+void XinePart::dvdMenuRight()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotDVDMenuRight();
+}
+
+void XinePart::dvdMenuSelect()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotDVDMenuSelect();
+}
+
+void XinePart::dvdMenuToggle()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotMenuToggle();
+}
+
+void XinePart::aspectRatioAuto()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotAspectRatioAuto();
+}
+
+void XinePart::aspectRatio4_3()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotAspectRatio4_3();
+}
+
+void XinePart::aspectRatioAnamorphic()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotAspectRatioAnamorphic();
+}
+
+void XinePart::aspectRatioSquare()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotAspectRatioSquare();
+}
+
+void XinePart::aspectRatioDVB()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotAspectRatioDVB();
+}
+
+void XinePart::zoomInX()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotZoomInX();
+}
+
+void XinePart::zoomOutX()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotZoomOutX();
+}
+
+void XinePart::zoomInY()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotZoomInY();
+}
+
+void XinePart::zoomOutY()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotZoomOutY();
+}
+
+void XinePart::zoomIn()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotZoomIn();
+}
+
+void XinePart::zoomOut()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotZoomOut();
+}
+
+void XinePart::zoomOff()
+{
+ if (!m_xine->isXineReady())
+ return;
+ m_xine->slotZoomOff();
+}
+
+
+
+/********** volume slider ****************/
+
+
+VolumeSlider::VolumeSlider() : QSlider(Horizontal, 0)
+{
+ installEventFilter(this);
+}
+
+VolumeSlider::~VolumeSlider()
+{}
+
+void VolumeSlider::wheelEvent(QWheelEvent* e)
+{
+ int newVal = value();
+ if (e->delta() > 0)
+ newVal -= 5;
+ else if (e->delta() < 0)
+ newVal += 5;
+ setValue(newVal);
+ e->accept();
+}
+
+/*bool VolumeSlider::eventFilter(QObject *obj, QEvent *ev)
+{
+ if( obj == this && (ev->type() == QEvent::MouseButtonPress ||
+ ev->type() == QEvent::MouseButtonDblClick) )
+ {
+ QMouseEvent *e = (QMouseEvent *)ev;
+ QRect r = sliderRect();
+
+ if( r.contains( e->pos() ) || e->button() != LeftButton )
+ return FALSE;
+
+ int range = maxValue() - minValue();
+ int pos = (orientation() == Horizontal) ? e->pos().x() : e->pos().y();
+ int maxpos = (orientation() == Horizontal) ? width() : height();
+ int value = pos * range / maxpos + minValue();
+
+ if (QApplication::reverseLayout())
+ value = maxValue() - (value - minValue());
+
+ setValue(value);
+ return TRUE;
+ }
+ else
+ {
+ return FALSE;
+ }
+}*/
+
+#include "xine_part.moc"
diff --git a/kaffeine/src/player-parts/xine-part/xine_part.desktop b/kaffeine/src/player-parts/xine-part/xine_part.desktop
new file mode 100644
index 0000000..ce9f2ab
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/xine_part.desktop
@@ -0,0 +1,43 @@
+[Desktop Entry]
+Encoding=UTF-8
+Icon=kaffeine
+MimeType=application/x-ogg;video/x-matroska;audio/x-matroska;video/mpeg;video/msvideo;video/quicktime;video/vnd.rn-realvideo;video/x-avi;video/x-fli;video/x-flic;video/x-ms-asf;video/x-ms-wmv;video/x-msvideo;application/x-mplayer2;application/smil;application/x-kaffeine;audio/x-musepack;
+Name=Kaffeine-Xine
+Name[nb]=Kaffeine Xine
+Name[pa]=ਕੈਫੀਨ-ਜ਼ਾਇਨ
+Name[se]=Kaffeine Xine
+Name[xx]=xxKaffeine-Xinexx
+Comment=A Kaffeine engine based on xine.
+Comment[af]='n Kaffeine enjin wat op Xine gebaseer is.
+Comment[bg]=Ядро за Kaffeine, базирано на xine.
+Comment[ca]=Una part de reproductor basada en xine.
+Comment[cs]=Část přehrávače založená na xine.
+Comment[da]=En Kaffeine-grænseflade baseret på Xine.
+Comment[de]=Ein auf Xine basierendes Programmmodul.
+Comment[el]=Μία μηχανή του Kaffeine βασισμένη στο xine.
+Comment[et]=Kaffeine mootor xine põhjal.
+Comment[ga]=Inneall Kaffeine bunaithe ar xine.
+Comment[gl]=Un motor para Kaffeine baseado en Xine.
+Comment[hu]=Xine-alapú Kaffeine-alrendszer.
+Comment[it]=Un motore di Kaffeine basato su xine.
+Comment[ja]=xine に基づく Kaffeine エンジン
+Comment[lt]=Kaffeine variklis, paremtas Xine.
+Comment[nb]=En spillermotor basert på xine.
+Comment[nl]=Een Kaffeine-engine gebaseerd op xine.
+Comment[pa]=ਜ਼ਾਈਨ ਅਧਾਰਤ ਇੱਕ ਕੈਫ਼ੀਨ ਇੰਜਣ ਹੈ।
+Comment[pl]=Moduł odtwarzacza do Kaffeine bazujący na xine.
+Comment[pt]=Um motor Kaffeine no xine.
+Comment[pt_BR]=Um componente de reprodução Kaffeine baseado no xine.
+Comment[se]=Čuojanmohtor vuođđoduvvon xineáis.
+Comment[sr]=Кафеинов мотор заснован на Xine-у.
+Comment[sr@Latn]=Кафеинов мотор заснован на Xine-у.
+Comment[sv]=En Kaffeine-gränssnitt baserad på Xine.
+Comment[tg]=Барномаи Kaffeine дар асоси xine.
+Comment[th]=โปรแกรมประมวลผลของ Kaffeine โดยใช้ xine
+Comment[tr]=xine tabanlı bir Kaffeine motoru.
+Comment[uk]=Рушій Kaffeine, оснований на xine.
+Comment[xx]=xxA Kaffeine engine based on xine.xx
+ServiceTypes=KParts/ReadOnlyPart,KaffeinePart
+Type=Service
+X-KDE-Library=libxinepart
+InitialPreference=9
diff --git a/kaffeine/src/player-parts/xine-part/xine_part.h b/kaffeine/src/player-parts/xine-part/xine_part.h
new file mode 100644
index 0000000..71769d3
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/xine_part.h
@@ -0,0 +1,276 @@
+/*
+ * xine_part.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef XINEPART_H
+#define XINEPART_H
+
+
+#include <kparts/factory.h>
+
+#include <qtimer.h>
+
+#include "kaffeinepart.h"
+#include "xine_part_iface.h"
+
+#define FORWARD_TIMER 0
+#define BACKWARD_TIMER 1
+
+class QWidget;
+class QSlider;
+class QLabel;
+class QPushButton;
+class MRL;
+class KXineWidget;
+class QPoint;
+class KSelectAction;
+class KToggleAction;
+class Equalizer;
+class VideoSettings;
+class FilterDialog;
+class PositionSlider;
+class KProgressDialog;
+class KPopupMenu;
+
+/**
+ * Kaffeine Part - xine based player part
+ * @author Jürgen Kofler <kaffeine@gmx.net>
+ *
+ */
+class XinePart : public KaffeinePart, public XinePartIface
+{
+ Q_OBJECT
+public:
+ XinePart(QWidget*, const char*, QObject*, const char*, const QStringList&);
+ virtual ~XinePart();
+
+ /*
+ *Reimplemented from KaffeinePart
+ */
+ bool isPlaying();
+ bool isPaused();
+
+ bool hasChapters(); /* e.g. DVD */
+ void playNextChapter();
+ void playPreviousChapter();
+ void setDVDChapter(uint chapter);
+
+ bool hasVideo();
+ QString supportedExtensions();
+ void* engine();
+ uint volume() const; /* percent */
+ uint position() const; /* percent */
+
+ bool closeURL(); /* stops playback and shows kaffeine logo */
+ static KAboutData* createAboutData();
+
+ /*
+ * DCOP functions...
+ */
+ int getContrast();
+ void setContrast(int c);
+ int getBrightness();
+ void setBrightness(int b);
+ void dvdMenuUp();
+ void dvdMenuDown();
+ void dvdMenuLeft();
+ void dvdMenuRight();
+ void dvdMenuSelect();
+ void dvdMenuToggle();
+ void aspectRatioAuto();
+ void aspectRatio4_3();
+ void aspectRatioAnamorphic();
+ void aspectRatioSquare();
+ void aspectRatioDVB();
+ void zoomInX();
+ void zoomOutX();
+ void zoomInY();
+ void zoomOutY();
+ void zoomIn();
+ void zoomOut();
+ void zoomOff();
+ QString screenShot();
+ void nextAudioChannel();
+ void nextSubtitleChannel();
+ void speedFaster();
+ void speedSlower();
+
+public slots:
+ /*
+ * Reimplemented from KaffeinePart
+ */
+ bool openURL(const MRL& mrl);
+ void slotPrepareForFullscreen(bool);
+ void slotPlay(bool forcePlay=false);
+ void slotTogglePause(bool pauseLive=true);
+ void slotSetVolume(uint); /* percent */
+ void slotSetPosition(uint); /* percent */
+ void slotPosPlusSmall();
+ void slotPosMinusSmall();
+ void slotSyncVolume();
+ void slotStop();
+ void slotMute(); /* toggle mute */
+
+ void slotVolumeUp();
+ void slotVolumeDown();
+ void slotPosPlusMedium();
+ void slotPosMinusMedium();
+ void slotPosPlusLarge();
+ void slotPosMinusLarge();
+ void slotJumpIncrement(int);
+ void slotDelaySubTitle();
+ void slotAdvanceSubTitle();
+ void slotAddSubtitle();
+ void slotNextAudioChannel();
+ void slotNextSubtitleChannel();
+ /***************** Private ********************/
+
+private slots:
+ void slotFinalize();
+ void slotTrackPlaying();
+ void slotCheckMoved();
+ void slotNext();
+ void slotPrevious();
+ void slotSaveStream();
+ void slotChannelInfo(const QStringList&, const QStringList&, int, int);
+ void slotSetSubtitle(int);
+ void slotSetAudioChannel(int);
+ void slotNewPosition(int, const QTime&);
+ void slotVolumeChanged(int);
+ void slotPictureSettings();
+ void slotEqualizer();
+ void slotDeinterlaceQuality();
+ void slotFilterDialog();
+ void slotInfo();
+ void slotToggleBroadcastSend();
+ void slotBroadcastReceive();
+ void slotJumpToPosition();
+ void slotButtonTimerPressed();
+ void slotButtonTimerReleased();
+ void slotToggleOsdTimer();
+ void slotScreenshot();
+ void slotConfigXine();
+ void slotError(const QString&);
+ void slotMessage(const QString&);
+ void slotStatus(const QString&);
+ void slotNewTitle();
+ void slotNewLength();
+ void slotNewFrameSize();
+ void slotPlaybackFinished();
+ void slotContextMenu(const QPoint&);
+ void slotDisableAllActions();
+ void slotEnableAllActions();
+ void slotEnablePlayActions();
+ void slotCopyToClipboard();
+ void slotLaunchExternally();
+ void slotLaunchDelayed();
+ void slotFastForward();
+ void slotSlowMotion();
+ void slotSetDVDTitle(const QString&);
+ void slotSetDVDChapter(const QString&);
+ void slotSetDVDAngle(const QString&);
+ void slotDVDMenuLeft();
+ void slotDVDMenuRight();
+ void slotDVDMenuUp();
+ void slotDVDMenuDown();
+ void slotDVDMenuSelect();
+ void slotSetHue(int);
+ void slotSetSaturation(int);
+ void slotSetContrast(int);
+ void slotSetBrightness(int);
+
+private:
+ void initActions();
+ void initConnections();
+ void loadConfig();
+ void saveConfig();
+
+private:
+ QPoint m_oldPosition;
+ QTimer m_posCheckTimer;
+ QTimer m_osdTimerEnabler; /* Provide Long click on timer button */
+ bool m_isOsdTimer; /* Status of Osd Timer (on/off) */
+ int m_timerDirection; /* Counting Up or Down */
+ int m_brightness, m_hue, m_contrast, m_saturation;
+
+ MRL m_mrl;
+ QValueList<MRL> m_playlist;
+ uint m_current;
+ uint m_lastDeinterlaceQuality;
+ QString m_lastDeinterlacerConfig;
+ uint m_broadcastPort;
+ QString m_broadcastAddress;
+
+ QSlider* m_volume;
+ PositionSlider* m_position;
+ QPushButton* m_playTime;
+ uint currentPosition;
+
+ KSelectAction* m_audioChannels;
+ KSelectAction* m_audioVisual;
+ KSelectAction* m_subtitles;
+ KSelectAction* m_dvdChapters;
+ KSelectAction* m_dvdTitles;
+ KSelectAction* m_dvdAngles;
+ KToggleAction* m_deinterlaceEnabled;
+ KToggleAction* m_broadcastSend;
+ KToggleAction* m_pauseButton;
+
+ KXineWidget* m_xine;
+ VideoSettings* m_pictureSettings;
+ Equalizer* m_equalizer;
+ QWidget* m_deinterlacerConfigWidget;
+ FilterDialog* m_filterDialog;
+
+ KPopupMenu* m_embeddedContext;
+
+ /* dvb */
+public:
+ QString TimeShiftFilename;
+
+public slots:
+ void slotDvbOpen( const QString &filename, const QString &chanName, int haveVideo );
+ void getTimeShiftFilename( const QString &filename );
+ void requestForOSD( const QString &text, int duration, int priority );
+ void setDvbCurrentNext( const QString &channelname, const QStringList &list );
+
+signals:
+ void stopDvb();
+ void playerPause();
+ void dvbOSDHide();
+};
+
+
+#include <qslider.h>
+
+class VolumeSlider : public QSlider
+{
+
+public:
+
+ VolumeSlider();
+ ~VolumeSlider();
+
+protected:
+
+ void wheelEvent(QWheelEvent* e);
+ //bool eventFilter(QObject *obj, QEvent *ev);
+};
+
+#endif /* XINEPART_H */
diff --git a/kaffeine/src/player-parts/xine-part/xine_part.rc b/kaffeine/src/player-parts/xine-part/xine_part.rc
new file mode 100644
index 0000000..8d4c1a7
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/xine_part.rc
@@ -0,0 +1,347 @@
+<!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
+<kpartgui name="xine_part" version="21">
+<MenuBar>
+ <Menu name="file">
+ <Menu name="network_broadcasting"><text>&amp;Network Broadcasting</text>
+ <Action name="network_send"/>
+ <Action name="network_receive"/>
+ </Menu>
+ <Separator/>
+ <Action name="file_save_stream"/>
+ <Action name="file_save_screenshot"/>
+ </Menu>
+ <Menu name="player"><text>&amp;Player</text>
+ <Action name="player_play"/>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ <Separator/>
+ <Action name="player_ff"/>
+ <Action name="player_slowmotion"/>
+ <Separator/>
+ <Action name="player_jump_to"/>
+ <Menu name="navigation"><text>&amp;Navigation</text>
+ <Action name="player_posplus_small"/>
+ <Action name="player_posminus_small"/>
+ <Action name="player_posplus_medium"/>
+ <Action name="player_posminus_medium"/>
+ <Action name="player_posplus_large"/>
+ <Action name="player_posminus_large"/>
+ </Menu>
+ <Separator/>
+ <Menu name="dvd"><text>&amp;DVD</text>
+ <Menu name="dvdnav"><text>&amp;Navigation</text>
+ <Action name="dvdmenuleft"/>
+ <Action name="dvdmenuright"/>
+ <Action name="dvdmenuup"/>
+ <Action name="dvdmenudown"/>
+ <Action name="dvdmenuselect"/>
+ </Menu>
+ <Menu name="dvdmenus"><text>&amp;DVD Menus</text>
+ <Action name="dvd_toggle"/>
+ <Separator/>
+ <Action name="dvd_title"/>
+ <Action name="dvd_root"/>
+ <Action name="dvd_subpicture"/>
+ <Action name="dvd_audio"/>
+ <Action name="dvd_angle"/>
+ <Action name="dvd_part"/>
+ </Menu>
+ <Action name="dvd_title_menu"/>
+ <Action name="dvd_chapter_menu"/>
+ <Action name="dvd_angle_menu"/>
+ </Menu>
+ <Separator/>
+ <Menu name="audio"><text>&amp;Audio</text>
+ <Action name="audio_channels"/>
+ <Action name="next_audio_channels"/>
+ <Action name="audio_visualization"/>
+ <Action name="equalizer"/>
+ <Action name="audio_mute"/>
+ <Action name="volume_increase"/>
+ <Action name="volume_decrease"/>
+ </Menu>
+ <Menu name="video"><text>&amp;Video</text>
+ <Action name="video_deinterlace"/>
+ <Menu name="video_aspect"><text>&amp;Aspect Ratio</text>
+ <Action name="aspect_auto"/>
+ <Action name="aspect_43"/>
+ <Action name="aspect_anamorphic"/>
+ <Action name="aspect_dvb"/>
+ <Action name="aspect_square"/>
+ </Menu>
+ <Menu name="video_zoom"><text>&amp;Zoom</text>
+ <Action name="zoom_off"/>
+ <Action name="zoom_in"/>
+ <Action name="zoom_out"/>
+ <Action name="zoom_in_x"/>
+ <Action name="zoom_out_x"/>
+ <Action name="zoom_in_y"/>
+ <Action name="zoom_out_y"/>
+ </Menu>
+ <Separator/>
+ <Action name="video_deinterlace_quality"/>
+ <Action name="video_picture"/>
+ </Menu>
+ <Menu name="subtitles"><text>&amp;Subtitles</text>
+ <Action name="adv_sub"/>
+ <Action name="delay_sub"/>
+ <Action name="player_subtitles"/>
+ <Action name="next_player_subtitles"/>
+ <Action name="add_subtitle"/>
+ </Menu>
+ <Separator/>
+ <Action name="player_track_info"/>
+ <Action name="player_post_filters"/>
+ </Menu>
+ <Menu name="settings">
+ <Action name="settings_xine_parameter"/>
+ </Menu>
+</MenuBar>
+
+<ToolBar name="snapshotToolBar" hidden="true"><text>Screenshot Toolbar</text>
+ <Action name="file_save_screenshot"/>
+</ToolBar>
+<ToolBar name="controlsToolBar" position="Bottom"><text>Controls Toolbar</text>
+ <Action name="player_previous"/>
+ <Action name="player_play"/>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_next"/>
+ <Action name="audio_channels"/>
+ <Action name="player_subtitles"/>
+</ToolBar>
+<ToolBar name="volumeToolBar" position="Bottom"><text>Volume Toolbar</text>
+ <Action name="audio_volume"/>
+ <Action name="audio_mute"/>
+</ToolBar>
+<ToolBar name="positionToolBar" fullWidth="true" position="Bottom"><text>Position Toolbar</text>
+ <Action name="player_position"/>
+ <Separator/>
+ <Action name="player_playtime"/>
+</ToolBar>
+
+<Menu name="context_menu">
+ <Action name="player_minimal_mode"/>
+ <Separator/>
+ <Action name="player_play"/>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ <Action name="file_save_stream"/>
+ <Separator/>
+ <Action name="player_ff"/>
+ <Action name="player_slowmotion"/>
+ <Separator/>
+ <Action name="player_jump_to"/>
+ <Menu name="navigation"><text>&amp;Navigation</text>
+ <Action name="player_posplus_small"/>
+ <Action name="player_posminus_small"/>
+ <Action name="player_posplus_medium"/>
+ <Action name="player_posminus_medium"/>
+ <Action name="player_posplus_large"/>
+ <Action name="player_posminus_large"/>
+ </Menu>
+ <Separator/>
+ <Menu name="dvd"><text>&amp;DVD</text>
+ <Menu name="dvdmenus"><text>&amp;DVD Menus</text>
+ <Action name="dvd_toggle"/>
+ <Separator/>
+ <Action name="dvd_title"/>
+ <Action name="dvd_root"/>
+ <Action name="dvd_subpicture"/>
+ <Action name="dvd_audio"/>
+ <Action name="dvd_angle"/>
+ <Action name="dvd_part"/>
+ </Menu>
+ <Action name="dvd_title_menu"/>
+ <Action name="dvd_chapter_menu"/>
+ <Action name="dvd_angle_menu"/>
+ </Menu>
+ <Separator/>
+ <Action name="audio_channels"/>
+ <Action name="audio_visualization"/>
+ <Action name="audio_mute"/>
+ <Separator/>
+ <Menu name="subtitles"><text>&amp;Subtitles</text>
+    <Action name="adv_sub"/>
+    <Action name="delay_sub"/>
+    <Action name="player_subtitles"/>
+    <Action name="add_subtitle"/>
+   </Menu>
+ <Separator/>
+ <Action name="player_track_info"/>
+</Menu>
+
+<State name="xine_not_ready">
+ <enable>
+ <Action name="player_play"/>
+ </enable>
+ <disable>
+ <Action name="network_send"/>
+ <Action name="file_save_stream"/>
+ <Action name="file_save_screenshot"/>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ <Action name="player_ff"/>
+ <Action name="player_slowmotion"/>
+ <Action name="audio_channels"/>
+ <Action name="audio_visualization"/>
+ <Action name="audio_volume"/>
+ <Action name="audio_mute"/>
+ <Action name="player_position"/>
+ <Action name="player_posplus_small"/>
+ <Action name="player_posminus_small"/>
+ <Action name="player_posplus_medium"/>
+ <Action name="player_posminus_medium"/>
+ <Action name="player_posplus_large"/>
+ <Action name="player_posminus_large"/>
+ <Action name="player_jump_to"/>
+ <Action name="player_playtime"/>
+ <Action name="aspect_auto"/>
+ <Action name="aspect_43"/>
+ <Action name="aspect_anamorphic"/>
+ <Action name="aspect_dvb"/>
+ <Action name="aspect_square"/>
+ <Action name="zoom_off"/>
+ <Action name="zoom_in"/>
+ <Action name="zoom_out"/>
+ <Action name="zoom_in_x"/>
+ <Action name="zoom_out_x"/>
+ <Action name="zoom_in_y"/>
+ <Action name="zoom_out_y"/>
+ <Action name="video_deinterlace"/>
+ <Action name="video_deinterlace_quality"/>
+ <Action name="video_picture"/>
+ <Action name="equalizer"/>
+ <Action name="player_subtitles"/>
+ <Action name="add_subtitle"/>
+ <Action name="dvd_toggle"/>
+ <Action name="dvd_title"/>
+ <Action name="dvd_root"/>
+ <Action name="dvd_subpicture"/>
+ <Action name="dvd_audio"/>
+ <Action name="dvd_angle"/>
+ <Action name="dvd_part"/>
+ <Action name="dvd_title_menu"/>
+ <Action name="dvd_chapter_menu"/>
+ <Action name="dvd_angle_menu"/>
+ <Action name="dvdmenuleft"/>
+ <Action name="dvdmenuright"/>
+ <Action name="dvdmenuup"/>
+ <Action name="dvdmenudown"/>
+ <Action name="dvdmenuselect"/>
+ <Action name="player_track_info"/>
+ <Action name="player_post_filters"/>
+ </disable>
+</State>
+<State name="not_playing">
+ <enable>
+ <Action name="player_play"/>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ </enable>
+ <disable>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_ff"/>
+ <Action name="player_slowmotion"/>
+ <Action name="player_position"/>
+ <Action name="player_posplus_small"/>
+ <Action name="player_posminus_small"/>
+ <Action name="player_posplus_medium"/>
+ <Action name="player_posminus_medium"/>
+ <Action name="player_posplus_large"/>
+ <Action name="player_posminus_large"/>
+ <Action name="player_jump_to"/>
+ <Action name="player_playtime"/>
+ <Action name="dvd_toggle"/>
+ <Action name="dvd_title"/>
+ <Action name="dvd_root"/>
+ <Action name="dvd_subpicture"/>
+ <Action name="dvd_audio"/>
+ <Action name="dvd_angle"/>
+ <Action name="dvd_part"/>
+ <Action name="dvd_title_menu"/>
+ <Action name="dvd_chapter_menu"/>
+ <Action name="dvd_angle_menu"/>
+ <Action name="dvdmenuleft"/>
+ <Action name="dvdmenuright"/>
+ <Action name="dvdmenuup"/>
+ <Action name="dvdmenudown"/>
+ <Action name="dvdmenuselect"/>
+ </disable>
+</State>
+<State name="play_single_track">
+ <enable>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_ff"/>
+ <Action name="player_slowmotion"/>
+ <Action name="player_position"/>
+ <Action name="player_posplus_small"/>
+ <Action name="player_posminus_small"/>
+ <Action name="player_posplus_medium"/>
+ <Action name="player_posminus_medium"/>
+ <Action name="player_posplus_large"/>
+ <Action name="player_posminus_large"/>
+ <Action name="player_jump_to"/>
+ <Action name="player_playtime"/>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ </enable>
+ <disable>
+ <Action name="player_play"/>
+ </disable>
+</State>
+<State name="play_multiple_tracks">
+ <enable>
+ <Action name="player_pause"/>
+ <Action name="player_stop"/>
+ <Action name="player_next"/>
+ <Action name="player_previous"/>
+ <Action name="player_ff"/>
+ <Action name="player_slowmotion"/>
+ <Action name="player_position"/>
+ <Action name="player_posplus_small"/>
+ <Action name="player_posminus_small"/>
+ <Action name="player_posplus_medium"/>
+ <Action name="player_posminus_medium"/>
+ <Action name="player_posplus_large"/>
+ <Action name="player_posminus_large"/>
+ <Action name="player_jump_to"/>
+ <Action name="player_playtime"/>
+ </enable>
+ <disable>
+ <Action name="player_play"/>
+ </disable>
+</State>
+<State name="paused">
+ <enable>
+ <Action name="player_play"/>
+ </enable>
+</State>
+<State name="dvd_playback">
+ <enable>
+ <Action name="dvd_toggle"/>
+ <Action name="dvd_title"/>
+ <Action name="dvd_root"/>
+ <Action name="dvd_subpicture"/>
+ <Action name="dvd_audio"/>
+ <Action name="dvd_angle"/>
+ <Action name="dvd_part"/>
+ <Action name="dvd_title_menu"/>
+ <Action name="dvd_chapter_menu"/>
+ <Action name="dvd_angle_menu"/>
+ <Action name="dvdmenuleft"/>
+ <Action name="dvdmenuright"/>
+ <Action name="dvdmenuup"/>
+ <Action name="dvdmenudown"/>
+ <Action name="dvdmenuselect"/>
+ </enable>
+</State>
+</kpartgui>
diff --git a/kaffeine/src/player-parts/xine-part/xine_part_iface.h b/kaffeine/src/player-parts/xine-part/xine_part_iface.h
new file mode 100644
index 0000000..4380a84
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/xine_part_iface.h
@@ -0,0 +1,135 @@
+/*
+ * xine_part_iface.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef XINE_PART_IFACE_H
+#define XINE_PART_IFACE_H
+
+#include <dcopobject.h>
+
+class XinePartIface : virtual public DCOPObject
+{
+ K_DCOP
+public:
+
+k_dcop:
+ /*
+ * Returns the contrast value (0 - 65535).
+ */
+ virtual int getContrast() = 0;
+
+ /*
+ * Set the contrast (0 - 65535).
+ */
+ virtual void setContrast(int c) = 0;
+
+ /*
+ * Returns the brightness value (0 - 65535).
+ */
+ virtual int getBrightness() = 0;
+
+ /*
+ * Set the brightness (0 - 65535).
+ */
+ virtual void setBrightness(int b) = 0;
+
+ /*
+ * Move the menu cursor upwards.
+ */
+ virtual void dvdMenuUp() = 0;
+
+ /*
+ * Move the menu cursor downwards.
+ */
+ virtual void dvdMenuDown() = 0;
+
+ /*
+ * Move the menu cursor to the left.
+ */
+ virtual void dvdMenuLeft() = 0;
+
+ /*
+ * Move the menu cursor to the right.
+ */
+ virtual void dvdMenuRight() = 0;
+
+ /*
+ * Select the menu item pointed by the cursor.
+ */
+ virtual void dvdMenuSelect() = 0;
+
+ /*
+ *Toggle DVD menu on/off
+ */
+ virtual void dvdMenuToggle() = 0;
+
+ /*
+ * Set the aspect ratio automatically.
+ */
+ virtual void aspectRatioAuto() = 0;
+
+ /*
+ * Set the aspect ratio to 4:3.
+ */
+ virtual void aspectRatio4_3() = 0;
+
+ /*
+ * Set the aspect ration to 16:9.
+ */
+ virtual void aspectRatioAnamorphic() = 0;
+
+ /*
+ * Set the aspect ratio to 1:1.
+ */
+ virtual void aspectRatioSquare() = 0;
+
+ /*
+ * Set the aspect ratio to 2.11:1.
+ */
+ virtual void aspectRatioDVB() = 0;
+
+ /*
+ * Zoom in.
+ */
+ virtual void zoomIn() = 0;
+
+ /*
+ * Zoom out.
+ */
+ virtual void zoomOut() = 0;
+
+ /*
+ * Zoom off.
+ */
+ virtual void zoomOff() = 0;
+
+ virtual void zoomInX() = 0;
+ virtual void zoomOutX() = 0;
+ virtual void zoomInY() = 0;
+ virtual void zoomOutY() = 0;
+
+ virtual QString screenShot() = 0;
+
+ virtual void nextAudioChannel() = 0;
+ virtual void nextSubtitleChannel() = 0;
+ virtual void speedFaster() = 0;
+ virtual void speedSlower() = 0;
+};
+
+#endif /* XINE_PART_IFACE_H */
diff --git a/kaffeine/src/player-parts/xine-part/xineconfig.cpp b/kaffeine/src/player-parts/xine-part/xineconfig.cpp
new file mode 100644
index 0000000..55ec752
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/xineconfig.cpp
@@ -0,0 +1,404 @@
+/*
+ * xineconfig.cpp - config dialog for xine parameters
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klineedit.h>
+#include <kcombobox.h>
+#include <kpushbutton.h>
+#include <kdialogbase.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kseparator.h>
+
+#include <qcolor.h>
+#include <qfont.h>
+#include <qwidget.h>
+#include <qlayout.h>
+#include <qtabwidget.h>
+#include <qvbox.h>
+#include <qcheckbox.h>
+#include <qspinbox.h>
+#include <qptrlist.h>
+#include <qstringlist.h>
+#include <qlabel.h>
+#include <qscrollview.h>
+#include <qsignalmapper.h>
+
+#include "xineconfig.h"
+#include "xineconfig.moc"
+
+#define NON_EXPERT_OPTIONS_DEPRECATED "audio.speaker_arrangement;audio.driver;audio.mixer_software;video.driver;dxr3.device_number;dxr3.enc_add_bars;dxr3.enc_alt_play_mode;input.dvd_language;input.dvd_region;input.cdda_device;input.cdda_use_cddb;input.drive_slowdown;input.dvd_device;input.vcd_device;input.http_no_proxy;input.http_proxy_host;input.http_proxy_password;input.http_proxy_port;input.http_proxy_user;codec.real_codecs_path;codec.win32_path;post.goom_fps;post.goom_height;post.goom_width;misc.spu_subtitle_size;misc.spu_vertical_offset;misc.spu_src_encoding;misc.sub_timeout;osd.osd_messages;vcd.default_device;"
+
+#define NON_EXPERT_OPTIONS_NEW "audio.output.speaker_arrangement;audio.driver;audio.mixer_software;video.driver;dxr3.device_number;dxr3.encoding.add_bars;dxr3.encoding.alt_play_mode;media.dvd.language;media.dvd.region;media.audio_cd.device;media.audio_cd.use_cddb;media.audio_cd.drive_slowdown;media.dvd.device;media.vcd.device;media.network.http_no_proxy;media.network.http_proxy_host;media.network.http_proxy_password;media.network.http_proxy_port;media.network.http_proxy_user;decoder.external.real_codecs_path;decoder.external.win32_codecs_path;effects.goom.csc_method;effects.goom.fps;effects.goom.height;effects.goom.width;subtitles.separate.subtitle_size;subtitles.separate.vertical_offset;subtitles.separate.src_encoding;subtitles.separate.timeout;media.vcd.device;osd.osd_messages;osd.osd_size"
+
+#define NON_EXPERT_OPTIONS NON_EXPERT_OPTIONS_NEW NON_EXPERT_OPTIONS_DEPRECATED
+
+XineConfigEntry::XineConfigEntry(QWidget* parent, QGridLayout* grid, int row, xine_cfg_entry_t* entry) :
+ m_valueChanged(false), m_key(QString(entry->key)), m_numValue(entry->num_value),
+ m_numDefault(entry->num_default), m_stringValue(entry->str_value), m_stringDefault(entry->str_default),
+ m_stringEdit(NULL), m_enumEdit(NULL), m_numEdit(NULL), m_boolEdit(NULL)
+{
+ switch (entry->type)
+ {
+ case XINE_CONFIG_TYPE_UNKNOWN:
+ break;
+ case XINE_CONFIG_TYPE_STRING:
+ {
+ m_stringEdit = new KLineEdit(entry->str_value, parent);
+ if (!strcmp(entry->str_value,entry->str_default))
+ m_stringEdit->setPaletteForegroundColor(QColor(darkMagenta));
+ else
+ m_stringEdit->setPaletteForegroundColor(QColor(black));
+ grid->addWidget(m_stringEdit, row ,0);
+ connect(m_stringEdit, SIGNAL(textChanged(const QString&)), this, SLOT(slotStringChanged(const QString&)));
+ break;
+ }
+ case XINE_CONFIG_TYPE_ENUM:
+ {
+ m_enumEdit = new KComboBox(parent);
+ int i = 0;
+ while (entry->enum_values[i])
+ {
+ m_enumEdit->insertItem(entry->enum_values[i]);
+ i++;
+ }
+ m_enumEdit->setCurrentItem(entry->num_value);
+ if (entry->num_value == entry->num_default)
+ m_enumEdit->setPaletteForegroundColor(QColor(darkMagenta));
+ else
+ m_enumEdit->setPaletteForegroundColor(QColor(black));
+ grid->addWidget(m_enumEdit, row, 0);
+ connect(m_enumEdit, SIGNAL(activated(int)), this, SLOT(slotNumChanged(int)));
+ break;
+ }
+ case XINE_CONFIG_TYPE_NUM:
+ {
+ m_numEdit = new QSpinBox(-999999, 999999, 1, parent);
+ m_numEdit->setValue(entry->num_value);
+ if (entry->num_value == entry->num_default)
+ m_numEdit->setPaletteForegroundColor(QColor(darkMagenta));
+ else
+ m_numEdit->setPaletteForegroundColor(QColor(black));
+ grid->addWidget(m_numEdit, row, 0);
+ connect(m_numEdit, SIGNAL(valueChanged(int)), this, SLOT(slotNumChanged(int)));
+ break;
+ }
+ case XINE_CONFIG_TYPE_RANGE:
+ {
+ m_numEdit = new QSpinBox(parent);
+ m_numEdit->setValue(entry->num_value);
+ m_numEdit->setRange(entry->range_min, entry->range_max);
+ if (entry->num_value == entry->num_default)
+ m_numEdit->setPaletteForegroundColor(QColor(darkMagenta));
+ else
+ m_numEdit->setPaletteForegroundColor(QColor(black));
+ grid->addWidget(m_numEdit, row, 0);
+ connect(m_numEdit, SIGNAL(valueChanged(int)), this, SLOT(slotNumChanged(int)));
+ break;
+ }
+ case XINE_CONFIG_TYPE_BOOL:
+ {
+ m_boolEdit = new QCheckBox(parent);
+ m_boolEdit->setChecked(entry->num_value);
+ if (entry->num_value == entry->num_default)
+ m_boolEdit->setPaletteForegroundColor(QColor(darkMagenta));
+ else
+ m_boolEdit->setPaletteForegroundColor(QColor(black));
+ grid->addWidget(m_boolEdit, row, 0);
+ connect(m_boolEdit, SIGNAL(toggled(bool)), this, SLOT(slotBoolChanged(bool)));
+ break;
+ }
+ }
+
+ QString m_keyName(entry->key);
+ m_keyName.remove( 0, m_keyName.find(".") + 1 );
+
+ QLabel* description = new QLabel(m_keyName + "\n" + QString::fromLocal8Bit(entry->description), parent);
+ description->setAlignment( QLabel::WordBreak | QLabel::AlignVCenter );
+ grid->addWidget(description, row, 1);
+
+ KSeparator* separator = new KSeparator(KSeparator::Horizontal, parent);
+ grid->addMultiCellWidget(separator, row+1, row+1, 0, 1);
+}
+
+XineConfigEntry::~XineConfigEntry()
+{}
+
+void XineConfigEntry::slotNumChanged(int val)
+{
+ m_numValue = val;
+ m_valueChanged = true;
+
+ if (m_numValue == m_numDefault)
+ {
+ if (m_numEdit)
+ {
+ m_numEdit->setPaletteForegroundColor(darkMagenta);
+ m_numEdit->update();
+ }
+ else
+ {
+ m_enumEdit->setPaletteForegroundColor(darkMagenta);
+ m_enumEdit->update();
+ }
+ }
+ else
+ {
+ if (m_numEdit)
+ {
+ m_numEdit->setPaletteForegroundColor(black);
+ m_numEdit->update();
+ }
+ else
+ {
+ m_enumEdit->setPaletteForegroundColor(black);
+ m_enumEdit->update();
+ }
+ }
+}
+
+void XineConfigEntry::slotBoolChanged(bool val)
+{
+ m_numValue = val;
+ m_valueChanged = true;
+ if (m_numValue == m_numDefault)
+ {
+ m_boolEdit->setPaletteForegroundColor(QColor(darkMagenta));
+ m_boolEdit->update();
+ }
+ else
+ {
+ m_boolEdit->setPaletteForegroundColor(QColor(black));
+ m_boolEdit->update();
+ }
+}
+
+void XineConfigEntry::slotStringChanged(const QString& val)
+{
+ m_stringValue = val;
+ m_valueChanged = true;
+ if (m_stringValue == m_stringDefault)
+ {
+ m_stringEdit->setPaletteForegroundColor(QColor(darkMagenta));
+ m_stringEdit->update();
+ }
+ else
+ {
+ m_stringEdit->setPaletteForegroundColor(QColor(black));
+ m_stringEdit->update();
+ }
+}
+
+bool XineConfigEntry::valueChanged() const
+{
+ return m_valueChanged;
+}
+
+const QString& XineConfigEntry::getKey() const
+{
+ return m_key;
+}
+
+int XineConfigEntry::getNumValue() const
+{
+ return m_numValue;
+}
+
+const QString& XineConfigEntry::getStringValue() const
+{
+ return m_stringValue;
+}
+
+
+/************** XINE CONFIG CLASS **************************/
+
+XineConfig::XineConfig(const xine_t* const xine) :
+ KDialogBase(KDialogBase::IconList, i18n("xine Engine Parameters"),
+ KDialogBase::Ok|KDialogBase::Apply|KDialogBase::Cancel, KDialogBase::Cancel)
+
+{
+ setInitialSize(QSize(650,500), true);
+
+ m_xine = (xine_t*)xine;
+
+ QStringList cats = getCategories();
+ QTabWidget* tabWidget = NULL;
+ QFrame* xineFrame = NULL;
+ QVBoxLayout* xineLayout = NULL;
+ QVBox* xineBeginnerPage = NULL;
+ QVBox* xineExpertPage = NULL;
+ QString icon;
+
+ QStringList::ConstIterator end ( cats.end());
+ for (QStringList::ConstIterator it = cats.begin(); it != end; ++it)
+ {
+ // kdDebug() << "XineConfig: add page: " << *it << endl;
+ if (*it == "audio")
+ icon = "sound";
+ else if (*it == "video")
+ icon = "video";
+ else if (*it == "vcd")
+ icon = "cdrom_unmount";
+ else if (*it == "input")
+ icon = "connect_established";
+ else if (*it == "effects")
+ icon = "wizard";
+ else if (*it == "media")
+ icon = "cdrom_unmount";
+ else if (*it == "subtitles")
+ icon = "font_bitmap";
+ else if (*it == "osd")
+ icon = "font_bitmap";
+ else if (*it == "engine")
+ icon = "exec";
+ else
+ icon = "edit";
+
+ xineFrame = addPage(*it, i18n("%1 Options").arg(*it), KGlobal::iconLoader()->loadIcon(icon, KIcon::Panel,
+ KIcon::SizeMedium));
+ xineLayout = new QVBoxLayout(xineFrame, marginHint(), spacingHint());
+ tabWidget = new QTabWidget(xineFrame);
+ xineLayout->addWidget(tabWidget);
+ xineBeginnerPage = new QVBox(tabWidget);
+ xineBeginnerPage->setMargin(5);
+ tabWidget->addTab(xineBeginnerPage, i18n("Beginner Options"));
+ createPage(*it, false, xineBeginnerPage);
+ xineExpertPage = new QVBox(tabWidget);
+ xineExpertPage->setMargin(5);
+ tabWidget->addTab(xineExpertPage, i18n("Expert Options"));
+ createPage(*it, true, xineExpertPage);
+ }
+
+ connect(this, SIGNAL(okClicked()), SLOT(slotOkPressed()));
+ connect(this, SIGNAL(applyClicked()), SLOT(slotApplyPressed()));
+}
+
+XineConfig::~XineConfig()
+{
+ m_entries.setAutoDelete(true);
+ m_entries.clear();
+ kdDebug() << "XineConfig: destructed" << endl;
+}
+
+void XineConfig::createPage(const QString& cat, bool expert, QWidget* parent)
+{
+ xine_cfg_entry_t* ent;
+
+ QScrollView* sv = new QScrollView(parent);
+ sv->setResizePolicy(QScrollView::AutoOneFit);
+ parent = new QWidget(sv->viewport());
+ sv->addChild(parent);
+
+ QGridLayout* grid = new QGridLayout(parent, 20 ,2);
+ grid->setColStretch(1,8);
+ grid->setSpacing(10);
+ grid->setMargin(10);
+
+ uint row = 0;
+ QString entCat;
+
+ /*********** read in xine config entries ***********/
+ ent = new xine_cfg_entry_t;
+ xine_config_get_first_entry(m_xine, ent);
+
+ do
+ {
+ entCat = QString(ent->key);
+ entCat = entCat.left(entCat.find("."));
+ if (entCat == cat)
+ {
+ if (((!expert) && (QString(NON_EXPERT_OPTIONS).contains(ent->key))) ||
+ ((expert) && (!QString(NON_EXPERT_OPTIONS).contains(ent->key))))
+ {
+ m_entries.append(new XineConfigEntry(parent, grid, row, ent));
+ delete ent;
+ ent = new xine_cfg_entry_t;
+ row += 2;
+ }
+ }
+ }
+ while(xine_config_get_next_entry(m_xine, ent));
+
+ delete ent;
+}
+
+const QStringList XineConfig::getCategories()
+{
+ QStringList cats;
+ xine_cfg_entry_t* ent = new xine_cfg_entry_t;
+ if (!xine_config_get_first_entry(m_xine, ent))
+ return cats;
+ QString entCat;
+
+ do
+ {
+ entCat = QString(ent->key);
+ entCat = entCat.left(entCat.find("."));
+ if (cats.findIndex(entCat) == -1)
+ {
+ // kdDebug() << "XineConfig: new category: " << entCat << endl;
+ cats.append(entCat);
+ }
+ delete ent;
+ ent = new xine_cfg_entry_t;
+
+ }
+ while(xine_config_get_next_entry(m_xine, ent));
+
+ delete ent;
+ return cats;
+}
+
+void XineConfig::slotOkPressed()
+{
+ slotApplyPressed();
+ QDialog::close();
+}
+
+/*************** apply changed entries *****************/
+
+void XineConfig::slotApplyPressed()
+{
+ xine_cfg_entry_t *entry;
+
+
+ for(uint i = 0; i < m_entries.count(); i++) /* check all entries */
+ {
+ if (m_entries.at(i)->valueChanged()) /* changed? */
+ {
+ entry = new xine_cfg_entry_t;
+ if (xine_config_lookup_entry(m_xine, m_entries.at(i)->getKey().ascii(), entry))
+ {
+ kdDebug() << "XineConfig: Apply: " << m_entries.at(i)->getKey() << "\n";
+
+ entry->num_value = m_entries.at(i)->getNumValue();
+
+ if (m_entries.at(i)->getStringValue().ascii())
+ entry->str_value = (char*) (const char*)m_entries.at(i)->getStringValue().latin1();
+
+ xine_config_update_entry(m_xine, entry);
+ delete entry;
+
+ m_entries.at(i)->setValueUnchanged();
+ }
+ }
+ }
+}
diff --git a/kaffeine/src/player-parts/xine-part/xineconfig.h b/kaffeine/src/player-parts/xine-part/xineconfig.h
new file mode 100644
index 0000000..c3c7532
--- /dev/null
+++ b/kaffeine/src/player-parts/xine-part/xineconfig.h
@@ -0,0 +1,96 @@
+/*
+ * xineconfig.h - config dialog for xine parameters
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef XINECONFIG_H
+#define XINECONFIG_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+class KLineEdit;
+class KComboBox;
+class QWidget;
+class QHBox;
+class QCheckBox;
+class QSpinBox;
+class QStringList;
+class QGridLayout;
+
+#include <xine.h>
+
+/* stores a single config entry of the config file */
+class XineConfigEntry : public QHBox
+{
+ Q_OBJECT
+public:
+ XineConfigEntry(QWidget* parent, QGridLayout* grid, int row, xine_cfg_entry_t* entry);
+ ~XineConfigEntry();
+
+ bool valueChanged() const; /* was the value changed by user? */
+ const QString& getKey() const; /* the key (name) of the entry */
+ int getNumValue() const;
+ const QString& getStringValue() const;
+ void setValueUnchanged()
+ {
+ m_valueChanged = false;
+ }
+
+private slots:
+ void slotNumChanged(int);
+ void slotBoolChanged(bool);
+ void slotStringChanged(const QString&);
+
+private:
+ bool m_valueChanged;
+ QString m_key;
+ int m_numValue;
+ int m_numDefault;
+ QString m_stringValue;
+ QString m_stringDefault;
+
+ KLineEdit* m_stringEdit;
+ KComboBox* m_enumEdit;
+ QSpinBox* m_numEdit;
+ QCheckBox* m_boolEdit;
+};
+
+
+class XineConfig : public KDialogBase
+{
+ Q_OBJECT
+public:
+ XineConfig(const xine_t* const xine);
+ ~XineConfig();
+
+private slots:
+ void slotOkPressed();
+ void slotApplyPressed();
+
+private:
+ void createPage(const QString& cat, bool expert, QWidget* parent);
+ const QStringList getCategories();
+
+private:
+ QPtrList<XineConfigEntry> m_entries;
+ xine_t* m_xine;
+};
+
+#endif /* XINECONFIG_H */
diff --git a/kaffeine/src/pref.cpp b/kaffeine/src/pref.cpp
new file mode 100644
index 0000000..75b6ab0
--- /dev/null
+++ b/kaffeine/src/pref.cpp
@@ -0,0 +1,219 @@
+/*
+ * pref.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2005-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include "pref.h"
+#include "pref.moc"
+
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kpushbutton.h>
+#include <kfiledialog.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qspinbox.h>
+#include <qcheckbox.h>
+#include <qcombobox.h>
+#include <qgroupbox.h>
+#include <qlineedit.h>
+
+#include <qtextcodec.h>
+
+#include <kcharsets.h>
+
+KaffeinePreferences::KaffeinePreferences() : KDialogBase(IconList,i18n("Kaffeine Setup"), Ok|Apply|Cancel, Ok)
+{
+ QGroupBox *gb;
+ QVBoxLayout *vb;
+ QGridLayout *grid;
+ KIconLoader *icon = new KIconLoader();
+
+ setInitialSize(QSize(400,400), false);
+
+//-----------behavior----------------
+ QFrame *behavior = addPage(i18n("Behavior"), i18n("Behavior"), KGlobal::iconLoader()->loadIcon("kaffeine", KIcon::Panel, KIcon::SizeMedium));
+ vb = new QVBoxLayout( behavior, 6, 6 );
+ gb = new QGroupBox( "", behavior );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+ m_pauseVideo = new QCheckBox(i18n("Pause video when window is minimized"), gb);
+ grid->addMultiCellWidget(m_pauseVideo, 0, 0, 0, 1);
+ vb->addWidget( gb );
+
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+//-----------appearance--------------
+ QFrame *looknfeel = addPage(i18n("Appearance"), i18n("Appearance"),KGlobal::iconLoader()->loadIcon("looknfeel", KIcon::Panel, KIcon::SizeMedium));
+ vb = new QVBoxLayout( looknfeel, 6, 6 );
+ gb = new QGroupBox( "", looknfeel );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+ m_systemTray = new QCheckBox(i18n("Embed in system tray"), gb);
+ connect(m_systemTray, SIGNAL(toggled(bool)), this, SLOT(slotEmbedInTrayToggled(bool)));
+ grid->addMultiCellWidget(m_systemTray, 0, 0, 0, 1);
+ m_osdTimeout = new QSpinBox(gb);
+ m_osdTimeout->setMinValue(0);
+ m_osdTimeout->setMaxValue(60);
+ m_osdTimeout->setSuffix(i18n(" sec"));
+ m_osdTimeout->setSpecialValueText(i18n("off"));
+ grid->addWidget(m_osdTimeout, 1,0);
+ QLabel* osdTimeoutLabel = new QLabel(i18n("Duration of title announcement in system tray"), gb);
+ osdTimeoutLabel->setDisabled(true);
+ connect(m_systemTray, SIGNAL(toggled(bool)), osdTimeoutLabel, SLOT(setEnabled(bool)));
+ grid->addWidget(osdTimeoutLabel, 1,1);
+ vb->addWidget( gb );
+
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+//-----------dvbclient--------------
+ QFrame *dc = addPage(i18n("DVB Client"), i18n("DVB Client"),KGlobal::iconLoader()->loadIcon("network_local", KIcon::Panel, KIcon::SizeMedium));
+ vb = new QVBoxLayout( dc, 6, 6 );
+ m_dcEnabled = new QCheckBox(i18n("Enable DVB client"), dc);
+ vb->addWidget( m_dcEnabled );
+ gb = new QGroupBox( "", dc );
+ gb->setDisabled(true);
+ connect(m_dcEnabled, SIGNAL(toggled(bool)), gb, SLOT(setEnabled(bool)));
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+ QLabel *lab = new QLabel( i18n("Broadcast address:"), gb );
+ grid->addWidget( lab, 0, 0 );
+ m_dcAddress = new QLineEdit( gb );
+ grid->addWidget( m_dcAddress, 0, 1 );
+ lab = new QLabel( i18n("Broadcast port:"), gb );
+ grid->addWidget( lab, 1, 0 );
+ m_dcPort = new QSpinBox( 1, 65535, 1, gb );
+ grid->addWidget( m_dcPort, 1, 1 );
+ lab = new QLabel( i18n("Info port:"), gb );
+ grid->addWidget( lab, 2, 0 );
+ m_dcInfo = new QSpinBox( 1, 65535, 1, gb );
+ grid->addWidget( m_dcInfo, 2, 1 );
+
+ lab = new QLabel( i18n("Time shifting directory:"), gb );
+ grid->addWidget( lab, 3, 0 );
+ m_shiftDirLe = new QLineEdit( gb );
+ m_shiftDirLe->setReadOnly( true );
+ grid->addWidget( m_shiftDirLe, 3, 1 );
+ m_shiftDirBtn = new QToolButton( gb );
+ m_shiftDirBtn->setIconSet( icon->loadIconSet("fileopen", KIcon::Small) );
+ grid->addWidget( m_shiftDirBtn, 3, 2 );
+ connect( m_shiftDirBtn, SIGNAL(clicked()), this, SLOT(setShiftDir()) );
+
+ vb->addWidget( gb );
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+//-----------misc----------------
+ QFrame *misc = addPage(i18n("Misc"), i18n("Miscellaneous Options"),KGlobal::iconLoader()->loadIcon("misc", KIcon::Panel, KIcon::SizeMedium));
+ vb = new QVBoxLayout( misc, 6, 6 );
+ gb = new QGroupBox(1, Qt::Horizontal, "", misc);
+ gb->setInsideMargin(20);
+ gb->setInsideSpacing(6);
+
+ m_useAlternateEncoding = new QCheckBox(i18n("Use alternate (non-Unicode) encoding for Meta tags"), gb);
+ connect(m_useAlternateEncoding, SIGNAL(toggled(bool)), this, SLOT(slotUseAlternateEncodingToggled(bool)));
+
+ m_alternateEncoding = new QComboBox(gb);
+ QStringList codecNames = KGlobal::charsets()->descriptiveEncodingNames();
+ codecNames.sort();
+ m_alternateEncoding->insertStringList(codecNames);
+ vb->addWidget( gb );
+
+ gb = new QGroupBox( "", misc );
+ grid = new QGridLayout( gb, 1, 1, 20, 6 );
+ KPushButton* clearRecent = new KPushButton( i18n("Clear"), gb);
+ clearRecent->setSizePolicy( QSizePolicy (QSizePolicy::Minimum, QSizePolicy::Fixed));
+ connect(clearRecent, SIGNAL(clicked()), this, SIGNAL(signalClearRecent()));
+ grid->addWidget(clearRecent, 0, 0);
+ QLabel* clearLabel = new QLabel(i18n("Clear recent files list"), gb);
+ grid->addWidget(clearLabel, 0, 1);
+ vb->addWidget( gb );
+
+ vb->addItem( new QSpacerItem( 20, 20, QSizePolicy::Ignored, QSizePolicy::Ignored ) );
+
+ delete icon;
+
+ connect(this, SIGNAL(okClicked()), SLOT(slotOkPressed()));
+ connect(this, SIGNAL(applyClicked()), SLOT(slotApplyPressed()));
+}
+
+void KaffeinePreferences::setConfig(bool pauseVideo, bool tray, uint duration, bool useEncoding, const QString& encoding)
+{
+ m_osdTimeout->setValue(duration);
+ m_osdTimeout->setEnabled(tray);
+ m_systemTray->setChecked(tray);
+
+ bool m_useEncoding = false;
+ for (int i = 0; i < m_alternateEncoding->count(); ++i) {
+ if (KGlobal::charsets()->encodingForName(m_alternateEncoding->text(i)).lower() == encoding.lower()) {
+ m_useEncoding = useEncoding;
+ m_alternateEncoding->setCurrentItem(i);
+ break;
+ }
+ }
+
+ m_useAlternateEncoding->setChecked(m_useEncoding);
+ m_alternateEncoding->setEnabled(m_useEncoding);
+ m_pauseVideo->setChecked(pauseVideo);
+}
+
+void KaffeinePreferences::setDvbClient( bool enabled, const QString &address, int port, int info, const QString &tspath )
+{
+ m_dcEnabled->setChecked(enabled);
+ m_dcAddress->setText(address);
+ m_dcPort->setValue(port);
+ m_dcInfo->setValue(info);
+ m_shiftDirLe->setText(tspath);
+}
+
+void KaffeinePreferences::slotApplyPressed()
+{
+ emit signalEmbedSystemTray(m_systemTray->isChecked());
+ emit signalUseAlternateEncoding(m_useAlternateEncoding->isChecked());
+ emit signalAlternateEncoding(KGlobal::charsets()->encodingForName(m_alternateEncoding->currentText()));
+ emit signalSetOSDTimeout(m_osdTimeout->value());
+ emit signalPauseVideo(m_pauseVideo->isChecked());
+ emit signalDvbClient(m_dcEnabled->isChecked(), m_dcAddress->text().stripWhiteSpace(), m_dcPort->value(), m_dcInfo->value(), m_shiftDirLe->text() );
+}
+
+void KaffeinePreferences::slotOkPressed()
+{
+ slotApplyPressed();
+ hide();
+}
+
+void KaffeinePreferences::setShiftDir()
+{
+ QString s = KFileDialog::getExistingDirectory( m_shiftDirLe->text().stripWhiteSpace() );
+ if ( !s.isEmpty() )
+ m_shiftDirLe->setText( s );
+}
+
+void KaffeinePreferences::slotUseAlternateEncodingToggled(bool on)
+{
+ m_alternateEncoding->setEnabled(on);
+}
+
+void KaffeinePreferences::slotEmbedInTrayToggled(bool on)
+{
+ m_osdTimeout->setEnabled(on);
+}
diff --git a/kaffeine/src/pref.h b/kaffeine/src/pref.h
new file mode 100644
index 0000000..ebc842c
--- /dev/null
+++ b/kaffeine/src/pref.h
@@ -0,0 +1,78 @@
+/*
+ * pref.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef PREF_H
+#define PREF_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qtoolbutton.h>
+
+#include <kdialogbase.h>
+
+class QCheckBox;
+class QSpinBox;
+class QComboBox;
+class QLineEdit;
+
+class KaffeinePreferences : public KDialogBase
+{
+ Q_OBJECT
+
+public:
+ KaffeinePreferences();
+ virtual ~KaffeinePreferences() {}
+
+ void setConfig(bool pauseVideo, bool tray, uint duration, bool useEncoding, const QString& encoding);
+ void setDvbClient( bool enabled, const QString &address, int port, int info, const QString &tspath );
+
+signals:
+ void signalClearRecent();
+ void signalEmbedSystemTray(bool);
+ void signalUseAlternateEncoding(bool);
+ void signalAlternateEncoding(const QString&);
+ void signalSetOSDTimeout(uint);
+ void signalPauseVideo(bool);
+ void signalDvbClient(bool,const QString&,int,int,const QString&);
+
+private slots:
+ void slotOkPressed();
+ void slotApplyPressed();
+ void slotUseAlternateEncodingToggled(bool);
+ void slotEmbedInTrayToggled(bool);
+ void setShiftDir();
+
+private:
+ QCheckBox* m_systemTray;
+ QSpinBox* m_osdTimeout;
+ QCheckBox* m_useAlternateEncoding;
+ QComboBox* m_alternateEncoding;
+ QCheckBox* m_pauseVideo;
+ QCheckBox* m_dcEnabled;
+ QLineEdit* m_dcAddress;
+ QSpinBox* m_dcPort;
+ QSpinBox* m_dcInfo;
+ QLineEdit *m_shiftDirLe;
+ QToolButton *m_shiftDirBtn;
+};
+
+#endif /* PREF_H */
diff --git a/kaffeine/src/startwindow.cpp b/kaffeine/src/startwindow.cpp
new file mode 100644
index 0000000..ba859f4
--- /dev/null
+++ b/kaffeine/src/startwindow.cpp
@@ -0,0 +1,219 @@
+/*
+ * startwindow.cpp
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2006-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kdebug.h>
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <klocale.h>
+
+#include <qlayout.h>
+#include <qlabel.h>
+#include <qhbox.h>
+#include <qcolor.h>
+#include <qtooltip.h>
+
+#include "version.h"
+#include "startwindow.h"
+#include "startwindow.moc"
+
+
+
+MToolButton::MToolButton( QWidget *parent, const QString& targ ) : QToolButton( parent )
+{
+ target = targ;
+ connect( this, SIGNAL(clicked()), SLOT(mClicked()) );
+}
+
+MToolButton::~MToolButton()
+{
+}
+
+void MToolButton::mClicked()
+{
+ emit executed( target );
+}
+
+
+
+SLabel::SLabel( QWidget *parent ) : QLabel( parent )
+{
+}
+
+
+
+void SLabel::paintEvent( QPaintEvent *pe )
+{
+ QLabel::paintEvent( pe );
+ QColorGroup cg = parentWidget()->colorGroup();
+ QColor base = cg.base();
+ QColor selection = cg.highlight();
+ int r = (base.red() + selection.red()) / 2;
+ int b = (base.blue() + selection.blue()) / 2;
+ int g = (base.green() + selection.green()) / 2;
+ setPaletteBackgroundColor( QColor(r, g, b) );
+}
+
+
+
+StartWindow::StartWindow(QWidget* parent, const char* name) : QWidget(parent, name)
+{
+ QVBoxLayout* mainLayout = new QVBoxLayout(this);
+ mainLayout->setAutoAdd(true);
+ mainLayout->setSpacing(0);
+
+ label1 = new SLabel(this);
+ //label1->setPaletteBackgroundColor(QColor(238, 246, 255));
+ label1->setText("<center><font size=\"7\"><b>"+i18n("[Kaffeine Player]")+"</b></font></center>");
+ label2 = new SLabel(this);
+ //label2->setPaletteBackgroundColor(QColor(238, 246, 255));
+ label2->setText(QString("<center><font size=\"5\">") + KAFFEINE_VERSION + "</font></center>");
+
+ panel = new QWidget( this );
+ panel->setPaletteBackgroundColor(QColor("White"));
+ panel->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, QSizePolicy::MinimumExpanding ) );
+
+ buttons.setAutoDelete( true );
+}
+
+
+
+StartWindow::~StartWindow()
+{
+ buttons.clear();
+}
+
+
+
+void StartWindow::registerTarget( const QString& uiName, const QString& pixName, const QString& targetName )
+{
+ MToolButton *btn = new MToolButton( panel, targetName );
+ //QFont f = btn->font();
+ //f.setPointSize( f.pointSize()+2 );
+ //f.setBold(true);
+ //btn->setFont( f );
+ btn->setTextLabel( QString("&%1 %2").arg(buttons.count() + 1).arg(uiName));
+ QToolTip::add(btn, uiName);
+ btn->setTextPosition( QToolButton::Under );
+ btn->setUsesTextLabel( true );
+ btn->setIconSet( KGlobal::iconLoader()->loadIconSet(pixName, KIcon::Panel) );
+ QSize size = btn->sizeHint();
+ size.setHeight( size.height()+5 );
+ btn->resize( size );
+ connect( btn, SIGNAL(executed(const QString&)), this, SIGNAL(execTarget(const QString&)) );
+ buttons.append( btn );
+ btn->show();
+ arrangeButtons( QSize( width(),height() ) );
+}
+
+
+
+void StartWindow::execTarget(int index)
+{
+ if ( index<1 || index>buttons.count() )
+ return;
+ buttons.at( index-1 )->animateClick();
+}
+
+
+
+void StartWindow::unregisterTarget( const QString& targetName )
+{
+ int i;
+ MToolButton *btn;
+
+ for ( i=0; i<(int)buttons.count(); i++ ) {
+ btn = buttons.at(i);
+ if ( btn->target==targetName ) {
+ buttons.remove( btn );
+ arrangeButtons( QSize( width(),height() ) );
+ return;
+ }
+ }
+}
+
+
+
+void StartWindow::arrangeButtons( QSize e )
+{
+ MToolButton *btn;
+ int x, y;
+ int i, j, k, nb, nw, nh, mw, mh;
+ int bw=0, bh=0, iter=20;
+ int nnh;
+ int ew = e.width();
+ int eh = e.height()-label1->height()-label2->height();
+ QPtrListIterator<MToolButton> it(buttons);
+
+ nb = buttons.count();
+ if ( !nb )
+ return;
+ it.toFirst();
+ while ( it.current() ) {
+ if ( it.current()->width()>bw )
+ bw = it.current()->width();
+ if ( it.current()->height()>bh )
+ bh = it.current()->height();
+ ++it;
+ }
+
+ nw = nb;
+ nh = 1;
+ while ( (ew-(nw*(bw+iter)))<(eh-(nh*(bh+iter))) ) {
+ if ( nw==1 )
+ break;
+ --nw;
+ ++nh;
+ }
+
+ nnh=0;
+ while ( (nnh*nw)<nb )
+ ++nnh;
+
+ mh = (eh-((nnh*bh)+((nnh-1)*iter)))/2;
+ mw = (ew-((nw*bw)+((nw-1)*iter)))/2;
+
+ k = 0;
+ y = mh;
+ for ( i=0; i<nh; i++ ) {
+ x = mw;
+ for ( j=0; j<nw; j++ ) {
+ btn = buttons.at(k);
+ if ( !btn )
+ return;
+ btn->resize(bw,bh);
+ btn->move( x, y );
+ ++k;
+ x = x+iter+bw;
+ }
+ y = y+iter+bh;
+ }
+}
+
+
+
+void StartWindow::resizeEvent( QResizeEvent *e )
+{
+ arrangeButtons( e->size() );
+}
diff --git a/kaffeine/src/startwindow.h b/kaffeine/src/startwindow.h
new file mode 100644
index 0000000..e46385f
--- /dev/null
+++ b/kaffeine/src/startwindow.h
@@ -0,0 +1,93 @@
+/*
+ * startwindow.h
+ *
+ * Copyright (C) 2004-2005 Jürgen Kofler <kaffeine@gmx.net>
+ * Copyright (C) 2006-2007 Christophe Thommeret <hftom@free.fr>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef STARTWINDOW_H
+#define STARTWINDOW_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <qtoolbutton.h>
+#include <qstring.h>
+#include <qptrlist.h>
+#include <qlabel.h>
+
+class MToolButton : public QToolButton
+{
+ Q_OBJECT
+
+public:
+ MToolButton( QWidget *parent, const QString& targ );
+ ~MToolButton();
+
+ QString target;
+
+private slots:
+ void mClicked();
+
+signals:
+ void executed( const QString& );
+};
+
+
+
+class SLabel : public QLabel
+{
+ Q_OBJECT
+
+public:
+ SLabel( QWidget *parent );
+ ~SLabel() {}
+
+protected:
+ void paintEvent( QPaintEvent * );
+};
+
+
+
+class StartWindow : public QWidget
+{
+ Q_OBJECT
+
+public:
+ StartWindow( QWidget *parent = 0, const char *name = 0 );
+ virtual ~StartWindow();
+
+ void registerTarget( const QString& uiName, const QString& pixName, const QString& targetName );
+ void unregisterTarget( const QString& targetName );
+ void execTarget( int index );
+
+protected:
+ virtual void resizeEvent(QResizeEvent*);
+
+private:
+ void arrangeButtons( QSize e );
+
+ QPtrList<MToolButton> buttons;
+ QWidget *panel;
+ SLabel *label1, *label2;
+
+signals:
+ void execTarget( const QString& );
+};
+
+#endif /* STARTWINDOW_H */
diff --git a/kaffeine/src/systemtray.cpp b/kaffeine/src/systemtray.cpp
new file mode 100644
index 0000000..202f3e1
--- /dev/null
+++ b/kaffeine/src/systemtray.cpp
@@ -0,0 +1,133 @@
+/*
+ * systemtray.cpp
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <kglobal.h>
+#include <kiconloader.h>
+#include <kdebug.h>
+#include <klocale.h>
+#include <kpopupmenu.h>
+#include <kaction.h>
+
+#include <qtimer.h>
+#include <qlabel.h>
+#include <qtooltip.h>
+
+#include "systemtray.h"
+#include "systemtray.moc"
+
+
+class TitleLabel : public QLabel
+{
+
+public:
+ TitleLabel() : QLabel(0, "tray_osd", WStyle_Customize | WStyle_NoBorder | WStyle_StaysOnTop | WX11BypassWM)
+ {}
+ virtual ~TitleLabel() {}
+
+protected:
+ void enterEvent(QEvent*)
+ {
+ hide();
+ }
+};
+
+SystemTray::SystemTray(QWidget *parent, const char *name ) : KSystemTray(parent,name)
+{
+ kdDebug() << "SystemTray: Create System Tray" << endl;
+
+
+ KAction* play = new KAction(i18n("Play / Pause"), "player_play", 0, this, SIGNAL(signalPlay()), actionCollection(), "trayplay");
+ KAction* next = new KAction(i18n("&Next"), "next", 0, this, SIGNAL(signalNext()), actionCollection(), "traynext");
+ KAction* previous = new KAction(i18n("&Previous"), "previous", 0, this, SIGNAL(signalPrevious()), actionCollection(), "trayprevious");
+ KAction* stop = new KAction(i18n("Stop"), "player_stop", 0, this, SIGNAL(signalStop()), actionCollection(), "traystop");
+ KAction* mute = new KAction(i18n("&Mute"), "player_mute", 0, this, SIGNAL(signalMute()), actionCollection(), "traymute");
+
+ play->plug(contextMenu());
+ next->plug(contextMenu());
+ previous->plug(contextMenu());
+ stop->plug(contextMenu());
+ mute->plug(contextMenu());
+
+ m_osd = new TitleLabel;
+ m_osd->setFrameStyle(QFrame::Panel | QFrame::Plain);
+ m_osd->setLineWidth(1);
+ m_osd->setAlignment(SingleLine);
+ connect(&m_hideTimer, SIGNAL(timeout()), this, SLOT(slotHideOSD()));
+
+ setPixmap(KGlobal::iconLoader()->loadIcon("kaffeine", KIcon::Panel, 22));
+ QToolTip::add(this, i18n("Kaffeine Player"));
+}
+
+
+SystemTray::~SystemTray()
+{}
+
+void SystemTray::wheelEvent(QWheelEvent *e)
+{
+ if(e->delta() < 0)
+ actionCollection()->action("traynext")->activate();
+ else
+ actionCollection()->action("trayprevious")->activate();
+ e->accept();
+}
+
+void SystemTray::mousePressEvent(QMouseEvent *e)
+{
+ switch(e->button()) {
+ case LeftButton:
+ case RightButton:
+ default:
+ KSystemTray::mousePressEvent(e);
+ break;
+ case MidButton:
+ if(!rect().contains(e->pos()))
+ return;
+ actionCollection()->action("trayplay")->activate();
+ break;
+ }
+}
+
+void SystemTray::showTitle(const QString& title, uint secs)
+{
+ if (title.isEmpty())
+ return;
+
+ QToolTip::remove(this); // all the time remove it before add it.
+ QToolTip::add(this, title);
+ if (secs > 0)
+ {
+ m_osd->setText(QString("<nobr><b>") + title + "</b></nobr>");
+ m_osd->adjustSize();
+ QPoint global = mapToGlobal(QPoint(0,0));
+ m_osd->move(global.x() - m_osd->width() + 10, global.y() - m_osd->height() + 15);
+ m_osd->show();
+ m_hideTimer.start(secs * 1000);
+ }
+}
+
+void SystemTray::slotHideOSD()
+{
+ m_osd->hide();
+ m_hideTimer.stop();
+}
diff --git a/kaffeine/src/systemtray.h b/kaffeine/src/systemtray.h
new file mode 100644
index 0000000..8fb4128
--- /dev/null
+++ b/kaffeine/src/systemtray.h
@@ -0,0 +1,67 @@
+/*
+ * systemtray.h
+ *
+ * Copyright (C) 2003-2005 Jürgen Kofler <kaffeine@gmx.net>
+ *
+ * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef SYSTEMTRAY_H
+#define SYSTEMTRAY_H
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <ksystemtray.h>
+
+#include <qwidget.h>
+
+/**
+ *@author Jürgen Kofler
+ */
+
+
+class TitleLabel;
+class QTimer;
+
+class SystemTray : public KSystemTray {
+ Q_OBJECT
+public:
+ SystemTray(QWidget *parent = 0, const char *name = 0);
+ virtual ~SystemTray();
+
+ void showTitle(const QString&, uint secs = 5);
+
+protected:
+ virtual void wheelEvent(QWheelEvent *e);
+ void mousePressEvent(QMouseEvent *e);
+
+signals:
+ void signalPlay();
+ void signalNext();
+ void signalPrevious();
+ void signalStop();
+ void signalMute();
+
+private slots:
+ void slotHideOSD();
+
+private:
+ TitleLabel* m_osd;
+ QTimer m_hideTimer;
+};
+
+#endif /* SYSTEMTRAY_H */
diff --git a/kaffeine/src/version.h b/kaffeine/src/version.h
new file mode 100644
index 0000000..86a51d0
--- /dev/null
+++ b/kaffeine/src/version.h
@@ -0,0 +1 @@
+#define KAFFEINE_VERSION "0.8.6"
diff --git a/kaffeine/terminate.patch b/kaffeine/terminate.patch
new file mode 100644
index 0000000..fd0d17e
--- /dev/null
+++ b/kaffeine/terminate.patch
@@ -0,0 +1,269 @@
+diff -ru kaffeine-0.8.4.cvs.orig/kaffeine/src/input/dvb/dvbout.cpp kaffeine-0.8.4.cvs/kaffeine/src/input/dvb/dvbout.cpp
+--- kaffeine-0.8.4.cvs.orig/kaffeine/src/input/dvb/dvbout.cpp 2007-11-25 12:57:46.000000000 +0200
++++ kaffeine-0.8.4.cvs/kaffeine/src/input/dvb/dvbout.cpp 2007-11-26 00:35:52.000000000 +0200
+@@ -19,6 +19,7 @@
+ */
+
+ #include <fcntl.h>
++#include <errno.h>
+
+ #include <kstandarddirs.h>
+
+@@ -47,7 +48,6 @@
+ plugHandle = plug->init( chan.sid, anum, tnum, chan.fta );
+ }
+
+- fdPipe=0;
+ channel = chan;
+ thWrite = 0;
+ rtp = 0;
+@@ -58,7 +58,7 @@
+ for ( i=0; i<channel.nsubpid && i<MAX_DVBSUB; i++ )
+ pids.append( channel.subpid[i].pid );
+ wBuf = NULL;
+- timeShifting = beginLive = false;
++ timeShifting = false;
+ haveRec = haveLive = instantRec = haveBroadcast = false;
+ patpmt = wpatpmt = false;
+ connect( &stopRecTimer, SIGNAL(timeout()), this, SLOT(stopRec()) );
+@@ -232,7 +232,7 @@
+
+ bool DVBout::hasLive() const
+ {
+- if ( haveLive || fdPipe || timeShifting )
++ if ( haveLive || timeShifting )
+ return true;
+ return false;
+ }
+@@ -248,6 +248,7 @@
+
+ bool DVBout::doPause( const QString &name ) // called from dvbstream::run()
+ {
++ fprintf(stderr,"DVBout::doPause\n");
+ if ( !haveLive )
+ return false;
+
+@@ -255,23 +256,13 @@
+ liveFile.setName( name );
+ liveFile.open( IO_WriteOnly|IO_Truncate );
+ liveFile.writeBlock( (char*)tspat, TS_SIZE );
+- liveFile.writeBlock( (char*)tspmt, TS_SIZE );
++ liveFile.writeBlock( (char*)tspmt, TS_SIZE );
+ mutex.lock();
+ haveLive = false;
+- mutex.unlock();
+- if ( !wait(100) ) {
+- terminate();
+- wait();
+- }
+- mutex.lock();
+- haveLive = true;
+- if ( close( fdPipe )<0 )
+- perror("close out pipe: ");
+- else
+- fprintf(stderr,"out pipe closed\n");
+- fdPipe = 0;
+- mutex.unlock();
+ timeShifting = true;
++ mutex.unlock();
++ fprintf(stderr,"doPause: starting timeshift, waiting live thread to finish\n");
++ wait();
+ //emit shifting( timeShifting );
+ }
+ return true;
+@@ -288,11 +279,10 @@
+
+ bool DVBout::goLive( const QString &name )
+ {
+- if ( fdPipe ) return false;
+-
++ fprintf(stderr,"goLive\n");
++ if (haveLive) return false;
+ haveLive = true;
+ pipeName = name;
+- beginLive = true;
+ //activeApid = napid;
+
+ writePat();
+@@ -310,31 +300,26 @@
+
+ void DVBout::preStopLive()
+ {
+- mutex.lock();
+- haveLive = false;
+- mutex.unlock();
++ // FIXME: maybe some way to tell the thread that it can stop?
++ // or maybe not. It won't make things much faster.
+ }
+
+
+-
+ void DVBout::stopLive()
+ {
++ fprintf(stderr,"stopLive\n");
+ mutex.lock();
+ if ( timeShifting ) {
+ liveFile.close();
+ timeShifting = false;
+ emit shifting( timeShifting );
+ }
+- mutex.unlock();
+- if ( !wait(500) ) {
+- terminate();
+- wait();
+- }
+- if ( fdPipe ) {
+- close( fdPipe );
+- fprintf( stderr, "pipe closed\n" );
+- fdPipe = 0;
+- }
++ if (haveLive) {
++ haveLive=false;
++ mutex.unlock();
++ fprintf(stderr,"stopLive: Waiting live thread to finish\n");
++ wait();
++ } else mutex.unlock();
+ delete [] wBuf;
+ wBuf = NULL;
+ }
+@@ -464,11 +449,7 @@
+ if ( plug && plugHandle )
+ plug->process( plugHandle, thBuf, TS_SIZE*NTS );
+ mutex.lock();
+- if ( haveLive && fdPipe ) {
+- if ( beginLive ) {
+- beginLive = !beginLive;
+- start();
+- }
++ if ( haveLive ) {
+ if ( wDist<95 ) {
+ memcpy( wBuf+(wWrite*TS_SIZE*NTS), thBuf, TS_SIZE*NTS );
+ wpatpmt = patpmt;
+@@ -525,40 +506,67 @@
+ }
+ }
+
+-
++bool DVBout::writeBytes(int fd, const unsigned char *buf, int bytes) {
++ int w=0;
++ mutex.lock();
++ while (haveLive && w<bytes) {
++ mutex.unlock();
++ int r=write(fd, buf+w, bytes-w);
++ if (r>=0) w+=r;
++ else {
++ if ( errno != EAGAIN ) {
++ perror("DVBout: pipe writeBytes");
++ return false;
++ }
++ usleep( 100 );
++ }
++ mutex.lock();
++ }
++ mutex.unlock();
++ return haveLive;
++}
+
+ void DVBout::run()
+ {
+- if ( haveLive && fdPipe ) {
+- while ( haveLive && fdPipe ) {
+- if ( wDist>0 ) {
+- if ( wpatpmt ) {
+- write( fdPipe, tspat, TS_SIZE );
+- write( fdPipe, tspmt, TS_SIZE );
+- wpatpmt = false;
+- }
+- write( fdPipe, wBuf+(wRead*TS_SIZE*NTS), TS_SIZE*NTS );
+- --wDist;
+- ++wRead;
+- if ( wRead>99 )
+- wRead = 0;
+- }
+- else
+- usleep( 100 );
++ int fd=-1;
++ fprintf(stderr,"DVBout::run started\n");
++
++ while (haveLive && (fd=open( pipeName.ascii(), O_WRONLY | O_NONBLOCK )) == -1 ) {
++ if (errno!=ENXIO) {
++ perror("DVBout::run open pipe");
++ return;
+ }
+- return;
++ usleep ( 100 );
+ }
++ fprintf(stderr,"DVBout::run write pipe %s opened\n",pipeName.ascii());
++ emit playDvb();
++ fprintf(stderr,"DVBout::run signal emitted\n");
+
+- if ( (fdPipe=open( pipeName.ascii(), O_WRONLY))<0 ) {
+- perror("PIPE FILE: ");
+- return;
++ mutex.lock();
++ while (haveLive) {
++ mutex.unlock();
++ if (wpatpmt) {
++ if (writeBytes(fd, tspat, TS_SIZE) && writeBytes(fd, tspmt, TS_SIZE) ) {
++ wpatpmt = false;
++ } else goto fail;
++ }
++ if (wDist>0) {
++ if ( writeBytes (fd, wBuf+(wRead*TS_SIZE*NTS), TS_SIZE*NTS ) ) {
++ mutex.lock();
++ --wDist;
++ ++wRead;
++ if (wRead>99) wRead=0;
++ mutex.unlock();
++ } else goto fail;
++ } else usleep ( 100 );
++ mutex.lock();
+ }
+- fprintf(stderr,"pipe opened\n");
+- emit playDvb();
++ mutex.unlock();
++fail:
++ if(fd>=0) close(fd);
++ fprintf(stderr,"DVBout::run finished\n");
+ }
+
+-
+-
+ DVBout::~DVBout()
+ {
+ if ( plug )
+diff -ru kaffeine-0.8.4.cvs.orig/kaffeine/src/input/dvb/dvbout.h kaffeine-0.8.4.cvs/kaffeine/src/input/dvb/dvbout.h
+--- kaffeine-0.8.4.cvs.orig/kaffeine/src/input/dvb/dvbout.h 2007-11-25 12:57:46.000000000 +0200
++++ kaffeine-0.8.4.cvs/kaffeine/src/input/dvb/dvbout.h 2007-11-25 23:09:58.000000000 +0200
+@@ -35,7 +35,7 @@
+
+ class KaffeineDvbPlugin;
+
+-class DVBout : public QObject, public QThread
++class DVBout : public QObject, private QThread
+ {
+ Q_OBJECT
+
+@@ -77,13 +77,13 @@
+ void writePat();
+ void calculateCRC( unsigned char *p_begin, unsigned char *p_end );
+ void renameFile( QString &name, const QString &ext );
++ bool writeBytes(int fd, const unsigned char *buf, int bytes);
+
+ int pmtpid;
+ bool patpmt, wpatpmt;
+ bool timeShifting;
+ QString pipeName;
+ QFile outFile, liveFile;
+- int fdPipe;
+ Ts2Rtp *rtp;
+ unsigned char thBuf[188*100];
+ unsigned char *wBuf;
+@@ -92,7 +92,6 @@
+ unsigned char tspmt[188];
+ unsigned int CRC32[256];
+ int thWrite;
+- bool beginLive;
+ bool haveRec, haveLive, instantRec, haveBroadcast;
+ QTimer stopRecTimer, timerPatPmt;
+ QMutex mutex;
diff --git a/po/Makefile.am b/po/Makefile.am
new file mode 100644
index 0000000..0fa209c
--- /dev/null
+++ b/po/Makefile.am
@@ -0,0 +1 @@
+POFILES = AUTO
diff --git a/po/ar.po b/po/ar.po
new file mode 100644
index 0000000..f21f2cb
--- /dev/null
+++ b/po/ar.po
@@ -0,0 +1,3167 @@
+# translation of kaffeine.po to Arabic
+# translation of kaffeine.po to
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# محمد سعد Mohamed SAAD <metehyi@free.fr>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-12-19 14:46+0100\n"
+"Last-Translator: محمد سعد Mohamed SAAD <metehyi@free.fr>\n"
+"Language-Team: Arabic <doc@arabeyes.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Arabic\n"
+"X-Poedit-Country: OMAN\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr ""
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "حدّث"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "المجدول"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "الحالي/ التالي"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "القناة"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "ابدأ"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "المدة"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "العنوان"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "أظهر جميع البرامج"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "اضافة الى عدادات الوقت"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "الإسم:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "القناة:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "إبدأ:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "المدة:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "النهاية:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "سجّل كـ:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "لا شيء"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "يومي"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "أسبوعي"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "شهري"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "المعتاد"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "كرر..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "محرر المؤقت"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "يجب أن تعطه اسم !"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "المدة يجب ان تكون على الأقل دقيقة واحدة !"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "لا يجزً للاسم احتواء اي من الاحرف التالية: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "اعدادات المرسل المستقبل ( Transponder ) الأولية"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "الأسم ليس فريدا."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "PIDs الصوت مفقودة!!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "PID يجب أن لا يكون صفر!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "لا بد من اختيار بعض الأيام."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "القنوات"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "المؤقتات"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "دليل البرنامج الإلكتروني"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "اعدادات DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "الرقم"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "الأسم"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "قنواة الصوت"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "تسجيل فوري"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "الإرسال"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "انزياح الوقت"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "جاري التسجيل"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "جاري البث"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "اختر الايقونة ..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "اختر ايقونة القناة ..."
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "التلفزة الرقمية"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "تشغيل التلفزة الرقمية الحية يتطللب منك استعمال محرك xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "القناة التالية OSD"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "القناة السابقة OSD"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Zap"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "الحدث التالي OSD"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "الحدث السابق OSD"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "عرض OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+#, fuzzy
+msgid "EPG..."
+msgstr "EPG ..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "عدادات الوقت ..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "جاري البث..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "القنوات..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "إعداد DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "الكلّ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "التلفزة"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "راديو"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "جديدة..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "غيّر الأيقونة..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "محو الصنف..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "صنف جديد"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "ادخل اسم لهذه القائمة"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "هل تريد فعلا محو هذا الصنف ؟"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>لا يمكن الحصول على بيانات من from http://hftom.free.fr/kaxtv/dvbdata.tar.gz "
+"!"
+"<br>\t\t\t تحقق من اتصالك بالانترنت واضغط على موافِق للمحاولة مرة اخرى."
+"<br>\t\t\t أو لا للإلغاء "
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>علي ان احاول مرة ثانية</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "فشل البث ."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "لا يمكن بدء البث ."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "تم انشاء وبدء المؤقت بنجاح."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "لا بد من تعريف قناة أولا !"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "تم انشاء المؤقت بنجاح."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "لا يزال يسجل."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "لا يزال يبثً."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "لا يمكن موالفة dvb !"
+
+#: input/dvb/dvbpanel.cpp:1896
+#, fuzzy
+msgid "Can't set pid(s)"
+msgstr "لا يمكن وضع بيد(بيدات)"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "لا يوجد CAM طليق"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "لا يزال Kaffeine يسجل. هل تريد فعلا إغلاقه ؟"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "لدى Kaffeine عدادت وقت مصفوفة. هل تريد فعلا إغلاقه ."
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "الإشارة:"
+
+#: input/dvb/scandialog.cpp:88
+#, fuzzy
+msgid "SNR:"
+msgstr "SNR :"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "القفل:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "حرر..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "هل تريد فعلاً محو جميع القنوات ؟"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "إبدأ المسح"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "قف المسح"
+
+#: input/dvb/scandialog.cpp:843
+#, fuzzy
+msgid "Stopping..."
+msgstr "جاري الإيقاف..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "تم ايجاد : %1 تلفزة - %2 راديو"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "لا يمكن فتح مقبس معلومات DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "لائحة المؤقتات:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "جديد"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "ايقاف/محو"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr "هذا المؤقت مكرر. هل تريد تجاهل الوظيفة الحالية او محو المؤقت؟"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "تخطى الحالي"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "محو المؤقت الحالي؟"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "جاري التحميل من الشبكة..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "نسخ ملفات المعطيات..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "إعدادات DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "جهاز DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "إعدادات الجهاز"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>الاسم :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>النوع :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "موصل"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "ارضي"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "قمر اصتناعي"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "الفنان"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "غير معروف"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "عدد LNBs:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "القمر الاول:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "اعدادات LNB ..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "القمر الثاني:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "القمر الثالث:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "القمر الرابع:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "إعدادات LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "المصدر:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>هذا الجهاز يدعم <b><i>المسح التلقائي autoscan</i></b> . يمكنك اختيار <b> "
+"تلقائي AUTO</b> في قائمة المصدر كي يبحث Kaffeine عن مجال الذبذبات."
+"<br>اذا لم يجد <b><i>المسح التلقائي autoscan</i></b> "
+"أقنيتك, اختر مصدر حقيقي في اللائحة.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "خيارات التسجيل لـDVB "
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "مجلد التسجيلات:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "مجلد انزلاق الوقت:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "هامش البداية:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "( دقائق )"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "هامش النهاية:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "مدة التسجيل الفوري: "
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "الهيئة المفضلة:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "بث DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "عنوان البث:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "منفذ البث:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "منفذ المعلومات:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "متفرقات"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "المحرف الإفتراضي ( يجب إعادة التشغيل ):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "تحديث بيانات المسح:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "تنزيل"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "تفريغ"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "برامج مساعدة DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>لا يمكن الحصول على بيانات من http://hftom.free.fr/kaxtv/dvbdata.tar.gz !"
+"<br>\t\t\tإفحص مواصلتك بِلإنترنت ، و أنقر نعم للمحاولة مرة ثانية."
+"<br>\t\t\tأو أنقر كلا للإلغاء."
+"<br> هل أحاول مرة ثانية ؟</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "مجلد التسجيل غير صالح."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "مجلد الحفظ المؤقت غير صالح."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "منافذ المعلومات والإرسال لا بد أن تكون مختلفة."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "عنوان الإرسال غير صالح."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "اعدادات LNB "
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "LNB عالمي"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "LO مزدوج"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr " LO فردي"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "ذبذبة مفتاح LO مزدوج"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "ذبذبة حيِّز التردد المنخفضة:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "ذبذبة حيِّز التردد العالية:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "ذبذبة التردLO ية:"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "ذبذبة التردLO ية:"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "ذبذبة التردLO ية:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "اعادة الضبط"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "لا يمكن فتح مقبس ارسال DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "لا يمكن تمهيد مقبس ارسال DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "لم اجد جهاز تشفير صوتي :"
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "فشل تحميل جهاز تشفير '%1' :"
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "لم استطع انشأء مجلًد"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bytes"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "قرص مدمج صوتي"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "تشغيل قرص مدمج"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "استخرج من القرص المدمج"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "الفنان:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "المجموعة:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "المقطع"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "إختر المقطع الذي تريد إنتشاله ثم انقر الزر <b>ترميز</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "تشفير..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "تشفير قرص مدمج صوتي"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "تشغيل قرص مدمج صوتي CD"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "تشغيل قرص مدمج مرئي رقميDVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "تشغيل قرص مدمج مرئي VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "افتح &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "فتح &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "فتح &Audio-CD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "بجب عليك اختيار المسارات اللتي تريد نقلها."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "وجدت عدة اقراص مدمجة صوتية. الرجاء اختيار واحد منهم."
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "ال اجد قرص مدمج صوتي."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "قرص مرئي رقمي يحتوي مرئيات"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "وجدت عدة اقراص مرئية رقمية تحتوي مرئيات . الرجاء اختيار واحد منهم:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "وجدتُ عِدة (S)VCD. إختر واحِداً:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "لا يوجد عنوان"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "المقطع %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "يجري البحث في قاعدة المعلومات cddb المحلُية..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "يجري البحث في قاعدة المعلومات cddb البعيدة"
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "وجدتُ خانة مطابقة تماماً في cddb..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "وجدتُ خانة مشابهة في cddb..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "وجدت عدة اقراص مرئية رقمية تحتوي مرئيات . الرجاء اختيار واحد منهم:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "قابس الشيفرة من نوع Lame mp3 ل-Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "قابس الشيفرة من نوع Ogg Vorbis ل-Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "زبون DVB "
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "لا يمكن فتح مقبس المعلومات."
+
+#: input/dvbclient/cdlisten.cpp:80
+#, fuzzy
+msgid "Can't bind info socket!!!"
+msgstr "لا يمكن ربط مقبس المعلومات!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "لا يمكن فتح المقبس."
+
+#: input/dvbclient/cddump.cpp:202
+#, fuzzy
+msgid "Can't set socket option!!!"
+msgstr "لا يمكن وضع خيار المقبس!!!"
+
+#: input/dvbclient/cddump.cpp:209
+#, fuzzy
+msgid "Can't bind socket!!!"
+msgstr "لا يمكن ربط المقبس!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "جميع الاحجام"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "صغير جدآ"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "صغير"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "وسط"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "كبير"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "ضخم"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "بحث جديد"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "ان الغلاف المطلوب ليس متوفر. الرجاء اختيار واحد آخر."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "ان الغلاف المطلوب ليس متوفر"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "حمُال الغلاف"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "لم اجد صورة متناسبة, الرجاء ادخال عبارة بحث جديدة:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "ادخل عبارة بحث جديدة:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "تشغيل"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "تشغيل التالي/اضافة صف الإنتظار"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "تحديد ال&كل"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "انشاء قائمة تشغيل من المحدد"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "إضافة ت&رجمة..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "ت&حرير العنوان"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "ال&معلومات"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "المدة"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "الفنان"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "المجموعة"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "السنة"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "النوع"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "الترجمات"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "مستخدم"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|ملفات الترجمة\n"
+"*.*|جميع الملفات"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "إختر ملف الترجمة"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "اختر الغلاف..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "معرض..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "المرشح"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "لائحة التشغيل:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"اختيار قائمة التشغيل النشطة.لتغيير قائمة التشغيل حررها والرجوع بواسطة 'عودة'."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "تشغيل القائمة"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "تك&رار"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "تكرار قائمة التشغيل "
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "تبد&يل"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "تشغيل المواد بشكل عشوائي"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&محو لائحة القراءة الحالية"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "لا&ئحة قرائة جديدة"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "إ&ستيراد لائحة تشغيل..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "إحفظ &لائحة القرائة بِإسم..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "ا&زالة قائمة التشغيل الحالية"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "قوائم تشغيل Kaffeine "
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "جميع الملفات"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "فتح قائمة التشغيل"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "قوائم تشغيل M3U "
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "قائمات PLS "
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "حفظ قائمة التشغيل"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "قائمة التشغيل"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "جديد"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "استيراد موارد الوسائط..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(بدون ترجمة)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "ترجمة أخرى..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "المعرض"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Queue: %1 مداخل, وقت التشغيل: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "المداخل: %1, وقت التشغيل: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "إزالة '%1' من القائمة و من القرص ؟"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "إسم الائحة موجود مسبقاً"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "ادخل اسم مختلف للقائمة:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "اختيار الترجمة"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "ملف وسائط:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "تحديد المرئي"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "ملف الترجمة:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "تشغيل/انتظار"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "التالي"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "كتم الص&وت"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "مشغل Kaffeine "
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[مشغل Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "محمد سعد"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "metehyi@free.fr"
+
+#: main.cpp:73
+#, fuzzy
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"مشغل الوسائط ل KDE 3. يمكن استعمال backends متعدد لإعادة التشغيل، افتراضيا "
+"xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, مؤلفو Kaffeine "
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "المسؤل الحالي عن الصيانة"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "المؤلف الأصلي"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "دعم CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "رقعات ثمينة مختلفة."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "رقعات أصناف DVB."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "شعار Kaffeine 0.8 و أعمال فنّية أخرى."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Kaffeine 0.5 صور شعار متحركة ل"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "التشفير البديل لبطاقات معلومات الصفحة. العديد من الرقع."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "xine post plugin handling. Many patches."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "استيراد ملف الترجمة"
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U استيراد. اختبار"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "محرر بيدات الترجمة"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs"
+msgstr "الترجمات"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "مادة جديدة"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, fuzzy, no-c-format
+msgid "Move Up"
+msgstr "الصعود"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, fuzzy, no-c-format
+msgid "Move Down"
+msgstr "النزول"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "تحديث المحدد >>"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "جديد>>"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, fuzzy, no-c-format
+msgid "Pid:"
+msgstr "البيد:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, fuzzy, no-c-format
+msgid "Page:"
+msgstr "الصفحة:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "الصفحة الفرعية:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "اللغة:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "مؤقت مكرر"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, fuzzy, no-c-format
+msgid "Audio PIDs editor"
+msgstr "محرر بيدات الصوت"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, fuzzy, no-c-format
+msgid "Audio PIDs"
+msgstr "الصوت:"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "محرر البث"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "القنوات المتوفرة:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "لائحة البث:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(نقر اليمين للتحرير/مسح)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "جديد..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "بحث في"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "بدأ المسح"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "مصفايات"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "مجانا"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "المزود:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< إضافة المُحدد"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< إضافة المصفات"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "عثر على"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "انتهى"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "محرر القناة"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "رقم:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "القطبية"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "الذبذبة:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "نسبة الرمز :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "مشفر "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, fuzzy, no-c-format
+msgid "Teletext PID:"
+msgstr "بيد النص عن بعد:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "معرِف الخدمة:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "مرئية"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "معرف تيار النقل:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "بيدات الترجمة..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, fuzzy, no-c-format
+msgid "Audio PIDs..."
+msgstr "بيدات الصوت..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "عرض النطاق:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC عالي "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "البث:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC منخفض"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "فاصل حماية:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "الهرمية:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, fuzzy, no-c-format
+msgid "Modulation:"
+msgstr "تعديل:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Inversion:"
+msgstr "تعاكس:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "مزايا التشفير"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "برنامج التشفير:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "المجلد الاساسي:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "هذاء العظمة:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "الغاء كل الخيارات"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "نمط عادي"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "نمط هذاء العظمة"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "نظَّمَ"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "شريط أدوات القرص المدمج CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "خيارات Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "معدل الثنائيات"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "خيارات Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "الجودة:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&قائمة التشغيل"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "اغلاق الخيارات"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "ال&مشغل "
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "تمكين ال&تحجيم التلقائي"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "الإرسال على ال&شبكة"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "ال&ملاحة"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "قوائم &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "ال&صوت"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "ال&مرئي"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "معدل الم&ظهر"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "شريط أدوات التقاط صورة الشاشة"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "شريط أدوات الإعدادات"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "شريط أدوات حجم الصوت"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "شريط أدوات الموضع"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "إعداد Kaffeine "
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "السلوك"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "إيقاف المرئيات مؤقتاً عند تصغير النافِذة"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Embed in system tray"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sec"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "مغلق"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "مدة اعلان العنوان في خلفية النظام"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "DVB تمكين عميل "
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "الخيارات المتنوعة"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr ""
+"استخدام بديل (غير نظام الحروف الدولي الموحد) تشفير لبطاقات معلومات الصفحة"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"إختر إسم بديل لبطاقات تشفير معلومات الصفحة\n"
+"( للتحويل إلى نظام الحروف الدولي الموحد Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "محو لائحة الملفات الحديثة"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "بدأ التشغيل فورا"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "بدأ التشغيل بنمط ملئ الشاشة"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "تعيين برنامج تشغيل الصوت"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "تعيين برنامج تشغيل المرئيات"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Audio-CD/VCD/DVD تحديد مسار جهاز."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "xine رسائل تنقيح ناتج "
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "تشغيل معالج التركيب"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr "ملفات للتشغيل. ملف محلي، أو URL، أو مجلد، أو 'DVD', 'VCD', 'AudioCD'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "إبدأ"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "نافذة المشغل"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "هيئات الوسائط المدعومة"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "ملفات صوتية MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "ملفات مرئية MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "ملفات Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "ملفات AVI "
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "ملفات Quicktime "
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "ملفات Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "ملفات Matroska "
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "ملفات FLAC "
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "ملفات Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "ملفات ويف WAV "
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "فشل '%1' من تحميل مقطع التشغيل. "
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 غير موجود في مسار البحث."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "فتح &URL"
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "إفتح &مجلد..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "إغلاق وإطفاء الشاشة بعد هذا المقطع"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "اغلاق بعد هذا المقطع"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "اغلاق بعد هذه قائمة التشغيل"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "النمط الأدنى"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "تثبيت قائمة التشغيل/المشغل"
+
+#: kaffeine.cpp:710
+#, fuzzy
+msgid "Keep &Original Aspect"
+msgstr "بقاء على المظ&هر الأصلي"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "الحجم الأصلي"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "حجم مزدوج"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "حجم ثلاثي"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "محرك التشغيل"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "عميل DVB "
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "المشغل"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "النافذة الأساسية"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS Xserver لم يتمكن من الحصول على امتدادات."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"هذ سيغلق البرنامج ويطفئ طاقة الشاشة بعد انتهاء الملف/قائمة التشغيل. خيار "
+"\"dpms\" لا بد ان يكون في ملف تكوين X لإطفاء طاقة الشاشة."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "إفتح ملف(ات)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "إفتح URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "أدخل URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "إفتح مجلّد"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "لا يوجد %1 في السواقة أو مسار الجهاز خاطئ."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "الرجاء تحديد سواقة صحيحة:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "معالج تثبيت Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "تحقق التركيب"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "موافِق."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "جزء لم يتمكن من الحصول عليه. الرجاء التحقق من عملية التنزيل."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "الحصول على نسخة"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine يتطلبKDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "كوديك WIN32 "
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"لم يتم الحصول على كوديك WIN32 في /usr/lib/win32. لا تتمكن من تشغيل ملفات "
+"Windows Media 9 أو newer Real Media وبعض الصيغ غير الشائعة. تنزيل الكوديك من "
+"هنا:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss غير موجود. لا تتمكن من تشغيل أغلب DVDs المشفرة (التجارية). يمكنك "
+"الحصول على المكتبة من هنا (لكن استخدامها ربما ينتهك حقوق النشر في بلدك!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "سواقة DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "تعطيل نمط DMA!! لتشغيل DVD ناعم الرجاء التشغيل كجذر:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"لا يمكن التحقق من وضع DMA. أذن الوصول غير مصرح أو عدم الحصول على جهاز مشابه."
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-جهاز "
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "DVB لم توجد أجهزة. الوظائف المتعلقة بها ستكون مخفية."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "التوزيع التكراري"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"xine-lib شحن بواسطة SuSE \"قد يفتقر لبعض الخصائص لمتطلبات قانونية(انتهاك محتمل "
+"لرخصة)\". يمكنك استعمال الرزم من هنا:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "النتيجة"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "تم الحصول على بعض المشاكل ولكن من الممكن أن يشتغل البرنامج."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "الكل جيد!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "استعمال Kaffeine كبرنامج مساعد لMMS (تيارات وسائط مايكروسوفت)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr "استعمال Kaffeine كبرنامج مساعد لrtsp (تيارات ريل بلاير وأخرى)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "انشاء أيقونة Kaffeine على سطح المكتب"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "خيارات التنزيل"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "جودة فك التشابك"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>استعمال منخفض جدا لوحدة المعالجة</b>"
+"<br> فقد نصف دقة الشاشة العمودية. لبعض الأنظمة (مزودة ببطاقات عرض) هذا سوف يخفض "
+"استعمال وحدة المعالجة عند مقارنتها بتشغيل الفيديو الواضح (بدون تشابك)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>استعمال منخفض لوحدة المعالجة، جودة منخفضة</b>"
+"<br> الصورة مشوشة عموديا لذا تأثيرات فك التشابك مزالة."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>استعمال متوسط لوحدة المعالجة المركزية، جودة متوسطة</b>"
+"<br>الصورة محللة وتم تصليح (تحريف) مناطق التشابك الصناعي"
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr "<b>استحدام عالي لوحدة المعالجة، جودة جيدة.</b><br>"
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b> استخدام عالي لوحدة المعالجة، حودة عالية.</b>"
+"<br> اضافة لاستخدام خوارزميات فك تشابك جيدة سيضاعف نسبة الأطار (30->"
+"60fps) لمجاراة نسبة اطار التلفاز. اكتشاف وارجاع 3-2 pulldown.*"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b> استخدام عالي جدا لوحدة المعالجة، نوعية عالية مع تحسينات (تجريبية).</b>"
+"<br> تمكين تصحيح الإرتجاج (تشغيل الفلم بسرعته الأصلية) وتنعيم اللون العمودي ( "
+"تثبيت أشرطة اللون الصغيرة في بعض dvds).* "
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "معرف من المستخدم"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+#, fuzzy
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "تكوين وصلة فك التشابك لوقت التشغيل"
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr "* <i>قد يتطلب 2.4 kernel (مثل RedHat one) or 2.6 kernel.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "تكوين وصلة فك التشابك لوقت التشغيل"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "اضافات التأثير"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "الصوت"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "فلاتر الصوت"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "تمكين مرشحات الصوت"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "أضف مرشح"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "ازالة جميع الفلاتر"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "فيديو"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "فلاتر الفيديو"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "تمكين مرشحات المرئيات"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "ضوابط محرِك xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "خيارات %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "خيارات مبدئية"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "خيارات متقدمة"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "Kaffeine جزء "
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "مشغل xine عبارة عن جزء من Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+#, fuzzy
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL دعم (لغة مزامنة الوسائط المتعددة) أولي!/nKaffeinePart يستطيع الأن محاولة "
+"اعادة التشغيل مصادر الفيديو بدون أي تقسيم. الاستمرار؟"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "إحفظ التيار باسم"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "الترجمة"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "قناة الصوت"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 من %2 "
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "إحفظ إلتقاطة نسخة عن الشاشة"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "منفذ البث:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "إعداد تيار الإستماع إلى البث"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "عنوان المرسل:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "المنفذ:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "أقفز إلى الموضع:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine خطأ"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine رسالة:"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "جاهز"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "تشغيل"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "ملف الترجمة"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "حفظ التيار باسم"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "معلومات المقطع"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "نسخ الــ URL إلى الحافظة"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "قرائة في Kaffeine خارجياً"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&إرسال تيار البث..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "إ&ستماع إلى تيار البث...."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "إ&حفظ إلتقاط نسخة عن الشاشة..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "إحفظ التيار..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"يحفظ التيار الحالي للقرص الصلب. هذه الخاصية معطلة لبعض الهيئات صيغ ( أي Real "
+"Media ) لمنع المشاكل القانونية المحتملة."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "أقلب إلى النمط الأصغر"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "ايقاف مؤقت"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "تقدّم &سريع للأمام"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "إبطاء ال&حركة"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1289
+#, fuzzy
+msgid "Skip Backward (20s)"
+msgstr "(الذهاب للخلف (10 ثواني"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+#, fuzzy
+msgid "Skip Forward (1m)"
+msgstr "الذهاب للأمام (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+#, fuzzy
+msgid "Skip Backward (1m)"
+msgstr "الذهاب للخلف (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+#, fuzzy
+msgid "Skip Forward (10m)"
+msgstr "الذهاب للأمام (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+#, fuzzy
+msgid "Skip Backward (10m)"
+msgstr "الذهاب للخلف (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+#, fuzzy
+msgid "Jump to Position..."
+msgstr "الذهاب للموضع..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "يسار DVD قائمة "
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "يمين DVD قائمة "
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "أعلى DVD قائمة "
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "أسفل DVD قائمة "
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD اختيار قائمة "
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "قناة الصوت"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "اختيار قناة الصوت"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "مجموعات مرئية للصوت"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+#, fuzzy
+msgid "Volume Up"
+msgstr "زيادة حجم الصوت"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+#, fuzzy
+msgid "Volume Down"
+msgstr "خفض حجم الصوت"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "فك التشابك"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "تنشيط هذا للتيارات المتشابكة. بعض أنواع الDVD على سبيل المثال."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "تلقائي"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorphic"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "مربع"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "فك تشابك الجودة"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "اعدادات الفيديو"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "معدل الرسومات"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "ال&عنوان"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "ال&جذر"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "صورة ثانوية"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "ال&زاوية"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "ال&جزء"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "العناوين"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "الفصول"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "الزاويات"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&معلومات المسار"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&قوابس التأثير..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "xine بارامترات محرك "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "حجم الصوت"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "الموضع"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr "نقرة قصيرة: تقديم/تأخير وصلة المؤقت/nنقرة طويلة: عرض OSD المؤقت."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "وقت التشغيل"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "CDDB البحث في مداخل..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr ""
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "اعدادات الفيديو"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "تدرج اللون"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "الاشباع"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "التباين"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "الإضائة"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "تعديل الصوت/الفيديو"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "تعديل الترجمة"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "تلقائي"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"تحذير عام: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "لا تتوفر معلومات."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"تحذير أمني: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"المضيف الذي تحاول الإتصال به غير معروف./nتحقق من صلاحية اسم المضيف المحدد."
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "اسم الجهاز المحدد يبدو غير صالح."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr "لا يمكن الوصول للشبكة./nتحقق من اعدادات الشبكة واسم السيرفر."
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "مخرج الصوت غير متوفر. الجهاز مشغول."
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr "تم رفض الاتصال./nتحقق من اسم المضيف."
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "لم يتمكن من الحصول على الملف أو URL. الرجاء فحصه."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "تم رفض أذن الوصول لهذا المصدر."
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"لا يمكن قرائة المصدر.\n"
+"ربما لا يوجد عندك حقوق كافية لقرائته أو المصدر لا يحتوي على بيانات (لا يوجد قرص "
+"في السواقة)."
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "مشكلة تحدث أثناء تحميل المكتبة او فاك الرموز:"
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "المصدر يبدو مشفرا ولا يمكن من قرائته."
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"ربما تم تعطيل DVD. طبقا لقوانين بلادك يمكنك أو لا يمكنك من استخدام libdvdcss "
+"لتمكنك من قرائة القرص."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"خطأ مجهول: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "خطأ: لا يمكن تمهيد درايفر فيديو جديد %1- استخدام %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "جاري استخدام Driver : %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "خطأ: لا يمكن تمهيد درايفر صوت جديد %1- استخدام %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "جاري استخدام Driver الصوت: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "xine تمهيد..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "xine لا يمكن تمهيد محرك!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "محرك الصوت للإستخدام (افتراضيا: تلقائي)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "محرك الفيديو للإستخدام (افتراضيا: تلقائي)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "استخدام برنامج مازج الأصوات"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "عرض رسائل OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "حجم نص OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "نوع خط رسائل OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "لا يمكن تمهيد درايفر الفيديو '%1' محاولة 'تلقائي'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "فشل تمهيد جميع درايفرات الفيديو!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "لا يمكن تمهيد درايفر الصوت '%1' محاولة 'تلقائي'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "فشل تمهيد جميع درايفرات الصوت!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "لا يمكن انشاء تيار xine جديد!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+#, fuzzy
+msgid "DVB: opening..."
+msgstr "DVB: فتح..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "فتح..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "codec الصوت"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr " codec المرئي"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "لا توجد قابسة للتعامل مع هذا المورد"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "المورد على ما يبدو معطل"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "المورد المطلوب غير موجود"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "لا يمكن فتح المورد"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "خطأ عام"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+#, fuzzy
+msgid "Mute Off"
+msgstr "كتم الصوت"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+#, fuzzy
+msgid "Mute On"
+msgstr "كتم الصوت"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "حرٍِك الى الامام %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "ابطاء الحركة %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+#, fuzzy
+msgid "Deinterlace: on"
+msgstr "فك التشابك: تشغيل"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+#, fuzzy
+msgid "Deinterlace: off"
+msgstr "فك التشابك: إيقاف تشغيل"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "معدل الترميز"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "تلقائي"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msec"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "اعدادات الرسومات"
+
+#: player-parts/xine-part/equalizer.cpp:43
+#, fuzzy
+msgid "Volume gain"
+msgstr "مكتسب الصوت"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "مكتسب الصوت لمعدل الرسومات- عطل الخيار اذا كان الصوت مزعج "
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "محو المرشح"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "الذهاب إلى %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "GStreamer فشل تمهيد!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamer جزء "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "كتم الصوت"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "تعليق"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "GStreamer بارامترات محرك "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer لا يمكن تمهيد "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"مكتب تسجيل Gstreamer المفقود! هل نسيت تشغيل <b>gst-register</b> "
+"(كجذر) بعد التركيب؟"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "لا يمكن تمهيد سواقة الصوت '%1' - حاول واحد آخر..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "لم يتمكن من الحصول على سواقة صوت مناسب!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "لا يمكن تمهيد سواقة الفيديو '%1' - حاول واحد آخر..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "لم يتمكن من الحصول على سواقة فيديو مناسب!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "مثبتات محرك GStreamer "
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "خيارات الصوت"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "سواقة الصوت المفضلة"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "خيارات الفيديو"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "سواقة الفيديو المفضلة"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "*يتطلب اعادة تشغيل! "
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "الوسائط"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "خيارات الوسائط"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "سواقة CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "جزء هامد"
diff --git a/po/bg.po b/po/bg.po
new file mode 100644
index 0000000..4a1a98c
--- /dev/null
+++ b/po/bg.po
@@ -0,0 +1,3185 @@
+# translation of kaffeine.po to Bulgarian
+# translation of kaffeine.po to
+#
+# Zlatko Popov <zlatkopopov@fsa-bg.org>, 2005, 2006, 2007.
+# Златко Попов <zlatkopopov@fsa-bg.org>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-07-22 12:16+0000\n"
+"Last-Translator: Zlatko Popov <zlatkopopov@fsa-bg.org>\n"
+"Language-Team: Bulgarian <dict@linux.zonebg.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Обновяване"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Запланувано"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Текущ/Следващ"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Канал"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Начало"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Продължителност"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Заглавие"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Преглед на всички програми"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Добавяне към таймерите"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Име:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Канал:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Начало:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Продължителност:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Край:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Запис като:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Без"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Дневно"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Седмично"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Месечно"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Потребителски"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Повторение..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Редактор на таймер"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Трябва да въведете име!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Продължителността трябва да е поне 1 минута!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Името не трябва да съдържа следните символи: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Настройки на приемника"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Името не е уникално."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Липсва аудио pid(s)!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Pid не трябва да е нула!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Трябва да изберете дни."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Канали"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Таймери"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Упътване за електронна програма"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Настройки на DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Номер"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Име"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Аудио канали"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Истински запис"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Предаване"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Смяна на време"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Запис"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Излъчване"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Избор на икона..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Изберете икона на канал"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Цифрова ТВ"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Цифровата ТВ работи само със xine ядро."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD за следващ канал"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD за предишен канал"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Zap"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD за следващо събитие"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD за предишно събитие"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Показване на OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Таймери..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Предаване..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Канали..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Настройване на DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Всички"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "ТВ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Радио"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Нова Категория..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Промяна на икона..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Изтриване на категория..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Нова категория"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Въведете име за тази категория:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Наистина ли искате да изтриете тази категория?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Невъзможно изтегляне на данни от http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tПроверете връзката си към Интернет и натиснете \"Да\" за да опитате "
+"пак."
+"<br>\t\t\tИли натиснете \"Не\" за отмяна."
+"<br>\t\t\tАко вече имате този архив копирайте го в "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz и натиснете \"Да\"."
+"<br>"
+"<br>Нов опит?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Излъчването се провали."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Излъчването не може да бъде стартирано."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Таймерът беше създаден и стартиран успешно."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Може би първо бихте искали да дефинирате някои канали!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Таймерът беше успешно създаден."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Пауза при запис."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Пауза при предаване."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "dvb не може да бъде настроен!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Не може да бъде установен pid(s)"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Няма свободен CAM"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr ""
+"Kaffeine все още записва. Наистина ли искате да излезете от програмата?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Kaffeine има чакащи таймери. Наистина ли искате да излезете от програмата?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Сигнал:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Заключване:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Редактиране..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Наистина ли искате да изтриете всички канали?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "НАЧАЛО на сканиране"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "СПИРАНЕ на сканиране"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Спиране..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Намерено: %1 ТВ - %2 радио"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Грешка при отваряне на DVB с сокет."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Списък с таймери:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Нов"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Стоп/Изтриване"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Този таймер се повтаря. Искате ли да пропуснете текущата задача или ще изтриете "
+"таймера?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Прескачане на текущата"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Изтриване на маркирания таймер?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Сваляне... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Копиране на файлове с данни..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Настройки на DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB устройство"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Настройки на устройство"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Име:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Вид:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Кабел"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Земна"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Сателит"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Непознато"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Брой LNB:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1-ви sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Настройки на LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2-ри sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3-ри sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4-ри sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Настройки на LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Източник:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Изглежда това устройство поддържа функцията <b><i>автосканиране</i></b>"
+". Можете да изберете <b>АВТО</b> в списъка и да оставите Kaffeine да потърси "
+"честотният обхват."
+"<br>Ако <b><i>автосканиране</i></b> не успее да намери каналите, изберете "
+"източник от списъка.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Ако не можете да намерите вашата мрежата/местоположение в списъка, ще "
+"трябва да създаде. Погледнете в $HOME/.kde/share/apps/kaffeine/dvb-x/ и вземете "
+"съществуващ файл за начало. Попълнете стойностите на мрежата си и го кръстете "
+"подобаващо (според правилата). Ако мислите, че новият файл може да бъде полезен "
+"на другите, пратете го на kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Опции за запис на DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Директория за записите:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Директория за смяна на времето:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Отстъп започване:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(минути)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Отстъп край:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Продължителност на запис:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Предпочитан формат:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB предаване"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Адрес на предаване:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Порт на предаване:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Информационен порт:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Разни"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Кодова таблица по подразбиране (необходимо е рестартиране):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Обновяване на сканираните данни:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Сваляне"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Изхвърляне на epg събитията в \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Изхвърляне"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB приставки"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Невъзможно изтегляне на данни от http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tПроверете връзката си към Интернет и натиснете \"Да\" за да опитате "
+"пак."
+"<br>\t\t\tИли натиснете \"Не\" за отмяна."
+"<br> \t\t\t"
+"<br>"
+"<br>Нов опит?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Невалидна директория за записи."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Невалидна директория за смяна на времето."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Портовете за предаване и информация трябва да са различни."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Невалиден адрес за предаване."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Настройки на LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Универсален LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Двоен LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Единичен LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Превключване на двоен LO:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (МХц)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Ниска честота:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Висока честота:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Единичен LO:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Вертикална поляризация LO:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Хоризонтална поляризация LO:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Анулиране"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Грешка при отваряне на сокет за DVB предаване."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Грешка при инициализиране на сокет за DVB предаване."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Не са намерени аудио кодеци."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Грешка при зареждане на кодек \"%1\"."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Не беше създадена папка: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "МБ"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "кБ"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Байтове"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Компактдиск"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Изпълнение на компактдиск"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Извличане на компактдиск"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Изпълнител:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Албум:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Запис"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Маркирайте записите, които искате да извлечете и натиснете бутона \"<b>"
+"Кодиране</b>\"."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Кодиране..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Кодиране на компактдиск"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Изпълнение на компактдиск"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Изпълнение на DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Изпълнение на VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Изпълнение на &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Изпълнение на &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Изпълнение на &компактдиск"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Трябва да маркирате записи за извличане."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Намерени са няколко компактдиска. Изберете един."
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Не е намерен компактдиск."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD видео"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Намерени са няколко видео DVD-та. Изберете едно:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Намерени са няколко (S)VCD диска. Изберете един:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Няма заглавие"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Запис %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Претърсване за локален запис в CDDB ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Претърсване за отдалечен запис в CDDB ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Намерено е точно съвпадение на запис в CDDB ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Намерено е приблизително съвпадение на запис в CDDB ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB - съвпадения"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Намерени са няколко записа в CDDB. Изберете един:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Приставка за кодека Lame mp3 в Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Приставка за кодека Ogg Vorbis в Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB клиент"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Грешка при отваряне в сокет."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Грешка при свързване със сокет!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Грешка при отваряне на сокет."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Грешка при настройка на сокет!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Грешка при свързване със сокет!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Всички размери"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Много малък"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Малък"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Среден"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Голям"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Много голям"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Ново търсене"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Обложката, която сте избрали не е налична. Моля, изберете друга."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Обложката не е налична"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Сваляне на обложки"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Не са намерени изображения. Моля, въведете нов критерии за търсене:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Въведете нов критерии за търсене:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Изпълнение"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Следващ/Добавяне към опашка"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Маркиране на &всичко"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Създаване на списък с изпълнители от маркираните"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Добавяне на &субтитри..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "Реда&ктиране на заглавие"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Информация"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Времетраене"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Изпълнител"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Албум"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Година"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Жанр"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Субтитри"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "в употреба"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Файлове със субтитри\n"
+"*.*|Всички файлове"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Избор на файл със субтитри"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Изберете обложка..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Галерия..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Филтър"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Списък за изпълнение:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Изберете активния списък за изпълнение. За да промените името му, редактирайте "
+"го и натиснете \"Return\"."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Изпълнение на списък"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Повторение"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Повторение на списъка за изпълнение"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Разбъркано"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Изпълнение в произволен ред"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Автоматично сваляне на обложките"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Автоматично сваляне на обложките"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "И&зчистване на текущия списък"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Но&в списък"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Импортиране на списък..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Запис на текущия списък като..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Према&хване на текущия списък"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine списъци"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Всички файлове"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Отваряне на списък за изпълнение"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U списъци"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS списъци"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Запис на списък за изпълнение"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Списък за изпълнение"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "НОВ"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Импортиране на източници..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(без субтитри)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Други субтитри..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Галерия"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "На опашка: %1 записа, време за изпълнение: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Записи: %1, време за изпълнение: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Искате ли да премахнете \"%1\" от списъка и от диска?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Вече има такова име на списъка"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Въведете друго име на списъка:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Избор на субтитри"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Файл:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Избор на филм"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Файл със субтитри:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Изпълнение / Пауза"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Следващ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Заглушаване"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Златко Попов"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "zlatkopopov@fsa-bg.org"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Медия плеър за KDE 3. Може да използва различни ядра. По подразбиране (и "
+"препоръчително) е xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, екипът на Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Текуща поддръжка"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Оригинален автор"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Поддръжка на CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Различни ценни кръпки."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Кръпка за DVB OSD браузър"
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Кръпки за категории DVB."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Лого за Kaffeine 0.8 и други красоти."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Анимация за логото на Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Кодиране за мета таговете. Много кръпки."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Поведение на приставка за xine. Много кръпки."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Импортиране на файл със субтитри."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Импортиране на M3U. Тестване."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "PID редактор на субтитри"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PIDs на субтитри"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Нов елемент"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Преместване нагоре"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Преместване надолу"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Обновяване на маркираното"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Нов"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Страница:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Подстраница:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Език:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Повтаряне на таймер"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Редактор на аудио PID"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Аудио PIDs"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Редактор на предаване"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Налични канали:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Списък с излъчвани:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Дясно щракване с мишката за редактиране/изтриване)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Нов..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Търсене вкл."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Отместване (кХц)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Начало на сканиране"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Филтри"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Свободен ефир"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Доставчик:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Добавяне на маркираното"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Добавяне на филтрираното"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Намерени"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Готово"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Редактор за канали"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Полярност"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Честота:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Честота на символите:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Разбъркано"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID на телетекст:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Услуга (ID):"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Видео PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Транспортен поток (ID):"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PIDs на субтитри..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "PIDs на аудио..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Честотна лента:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC горна:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Предаване:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC долна:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Интервал при пазене:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Йерархия:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Модулация:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Инверсия:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Настройки на кодиране "
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Кодиране:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Основна директория:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Параноя:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Изключване на всички проверки"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Нормален режим"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Режим \"параноя\""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Нормализиране"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Компактдиск"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Опции за Lame mp3 "
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "Варираща скорост (VBR)"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Скорост:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "кБ/сек"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Опции за Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Качество :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Списък за изпълнение"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Настройки за изход от програмата"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Плеър"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Автоматично &преоразмеряване"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Мрежово предаване"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Навигация"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD менюта"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Аудио"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Видео"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Съотношение"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Снимка на екрана"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Настройки"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Ниво на звука"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Позиция на видеото"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Настройки на Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Поведение"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Пауза на видеото при минимизиран прозорец"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Поставяне в системния панел"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " сек"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "изкл."
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Продължителност на съобщението за заглавието в системния панел"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Включване на DVB клиент"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Разни опции"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Алтернативна кодова таблица (не Unicode) за мета таговете"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Изберете алтернативна кодова таблица за мета таговете\n"
+"(за да бъде конвертирана в Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Най-напред изчистване на последните файлове"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Незабавно изпълнение"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Изпълнение на цял екран"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Настройка на аудио драйвер"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Настройка на видео драйвер"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Настройка на път за CD/VCD/DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Изходни съобщения за грешка на xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Стартиране на помощника за инсталация"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Файл(ове) за изпълнение. Може да е локален файл, URL, директория или \"DVD\", "
+"\"VCD\", \"компактдиск\"."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Начало"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Прозорец на плеъра"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Поддържани медия формати"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG аудио файлове"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG видео файлове"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis файлове"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI файлове"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime файлове"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media файлове"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska файлове"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC файлове"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media файлове"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV файлове"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Грешка при зареждане на част \"%1\"."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 не е намерен в пътя за търсене."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Отваряне на &адрес..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Отваряне на &директория..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Изход от програма и изключване на монитора след този запис"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Изход от програма след този запис"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Изход от програма след края на списъка"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "Режим \"&Минимален\""
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Превк&лючване списък/плеър"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Запазване на &оригиналното съотношение"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Оригинален размер"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Двоен размер"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Троен размер"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Я&дро на плеъра"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB клиент"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Плеър"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Главен прозорец"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "Не беше намерено разширение за DPMS Xserver."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Това ще предизвика излизане от програмата и изключване на захранването на "
+"монитора след като свърши изпълнението на файла/списъка. Опцията за изключване "
+"на монитора \"dpms\" би трябвало да е във вашия X config файл."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Отваряне на файл(ове)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Отваряне на адрес (URL)"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Въведете адрес (URL):"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Отваряне на папка"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Няма %1 в устройството или пътят към него е грешен."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Моля, изберете правилното устройство:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Помощник за инсталиране на Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Проверка на инсталацията"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "ОК."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Частта не е намерена. Моля, проверете инсталацията си!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Намерена версия"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine изисква KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 кодеци"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Не са намерени WIN32 кодеци в /usr/lib/win32. Не можете да възпроизвеждате "
+"Windows Media 9 файлове, новите Real Media файлове и някои по-редки формати. "
+"Свалете кодеците от тук:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"Не е намерена libdvdcss. Не можете да възпроизвеждате шифровани (повечето "
+"комерсиални) DVD-та. Можете да намерите библиотеката тук (но е възможно нейното "
+"използване да наруши закона за авторското право във вашата страна!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD устройство"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Режим \"DMA\" е изключен! За по-добро DVD изпълнение като root изпълнете:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Грешка при проверка на режим \"DMA\". Нямате достатъчно права или няма "
+"устройство:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB устройство"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Не е намерено DVB устройство. Функциите, отнасящи се до DVB, ще бъдат скрити."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Дистрибуция"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"На xine-lib за by SuSE може да и липсват някои неща поради правни съображения "
+"(потенциални нарушения на патенти). Използвайте пакетите то тук:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "РЕЗУЛТАТ"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Открити са няколко проблема, но въпреки това Kaffeine може да работи."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Всичко е ОК!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Използване на Kaffeine като помощно приложение за mms:// (Microsoft Media) "
+"потоци"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Използване на Kaffeine като помощно приложение за rtsp:// (Real Media и други) "
+"потоци"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Създаване икона на Kaffeine на работния плот"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Опции за инсталиране"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Качество на разплитане"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Много малко натоварване на процесора, най-лошо качество.</b>"
+"<br>Половината от вертикалната разделителна способност се губи. За някои "
+"компютри (с PCI видео карти) това може да понижи натоварването на процесора в "
+"сравнение с обикновеното видео изпълнение (без разплитане)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Малко натоварване на процесора, лошо качество.</b>"
+"<br>Изображението се размазва по вертикала и ефектът \"разплитане\" се "
+"премахва."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Средно натоварване на процесора, средно качество.</b>"
+"<br>Изображението се анализира и участъците, показващи артефакти от "
+"разплитането, се поправят (интерполират)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"\t<b>Голямо натоварване на процесора, добро качество.</b>"
+"<br>Конвертирането формата на dvd изображението подобрява качеството и поправя "
+"грешката при повишаване честотата на дискретизацията."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Много голямо натоварване на процесора, отлично качество.</b>"
+"<br>Освен използването на алгоритми за \"интелигентно\" разплитане, скоростта "
+"на кадрите се удвоява (30->60 кад/сек), за да бъде като на ТВ. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Огромно натоварване на процесора, отлично качество + (експериментални) "
+"подобрения.</b>"
+"<br>Включва поправка на трептенето (изпълнение на филмите с тяхната оригинална "
+"скорост - 24 кад/сек) и вертикално смекчаване на цветовете (поправка на малките "
+"цветни райета при някои DVD-та). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Потребителски"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Настройване на приставка \"tvtime Deinterlace\"..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr "* <i>Може да изисква ядро 2.4 (като RedHat) или 2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Настройване на приставка \"tvtime Deinterlace\""
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Приставки за ефекти"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Аудио"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Аудио филтри"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Включване на аудио филтри"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Добавяне на филтър"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Премахване на всички филтри"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Видео"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Видео филтри"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Включване на видео филтри"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Параметри на xine ядрото"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Опции за %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Опции за начинаещи"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Опции за напреднали"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Базирана върху xine част от Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL (Synchronized Multimedia Integration Language) поддръжката е в зародиш!\n"
+"XinePart може да опита изпълнение на съдържащите се там видео източници без "
+"подредба. Искате ли да продължите?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Запис на поток като"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Субтитри"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Аудио канал"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 от %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG файл\n"
+"*.bmp|BMP файл\n"
+"*.xbm|XBM файл"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Запис на моментна снимка като"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Порт на предаване:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Настройване на получения поток на предаване"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Адрес на изпращач:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Порт:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Прескачане до позиция:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Грешка в xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Съобщение от xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Готово"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Изпълнение"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Файл на субтитри"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Запис на поток като"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Информация за запис"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Копиране на адрес (URL) в буфера"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Изпълнение извън Kaffeine"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Предаване на поток..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Получаване на поток..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Снимка на екрана..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Запис на поток..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Записва текущия поток на твърдия диск. Тази функция беше изключена за някои "
+"формати (напр. Real Media) за предотвратяване на потенциални правни проблеми."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Превключване на режим \"&Минимален\""
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Пауза"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Бързо напред"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "&Бавно напред"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Прескачане напред (20 с)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Прескачане назад (20 с)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Прескачане напред (1 м)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Прескачане назад (1 м)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Прескачане напред (10 м)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Прескачане назад (10 м)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Прескачане до позиция..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD меню наляво"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD меню надясно"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD меню нагоре"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD меню надолу"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Избор на DVD меню"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Аудио канал"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Избор на аудио канал"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Аудио &визуализации"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Увеличаване на звука"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Намаляване на звука"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Разплитане"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Включете това за разплетени потоци, някои DVD-та например."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Авто"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "1&6:9"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Квадрат"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Увеличение по хоризонталата"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Намаляване по хоризонтала"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Увеличени по вертикалата"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Намаляване по вертикалата"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Качество на &разплитането"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Видео настройки"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Еквалайзер"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Превключване на мен&юто"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Главно"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Основно"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Подкартина"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Ъгъл"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Част"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Заглавия"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Глави"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Ъгли"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Ин&формация"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "П&риставки за ефекти..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Параметри на &xine ядрото"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Сила на звука"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Позиция"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Късо щракване: Превключване на таймера напред/назад\n"
+"Дълго щракване: превключване на OSD на таймера"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Време за изпълнение"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Търсене на CDDB запис..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Запис %1 от компактдиск"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Запис %1 на VCD"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Видео настройки"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Нюанс"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Насищане"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Контраст"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Яркост"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Отместване на звук спрямо картина"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Отместване на субтитрите"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "авто"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Общо предупреждение: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Няма налична информация."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Предупреждение относно сигурността: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Хостът към който се опитвате да се свържете е неизвестен.\n"
+"Проверете валидността на посоченото име. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Името на посоченото устройство е невалидно. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Мрежата изглежда е недостъпна.\n"
+"Проверете настройката й и името на сървъра. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Аудио данните не са достъпни. Устройството е заето. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Връзката беше отказана.\n"
+"Проверете името на хоста. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Посоченият файл или адрес не беше намерен. Моля, проверете го. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Достъпът до този източник беше отказан. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Източникът не може да бъде прочетен.\n"
+"Може би нямате достатъчно права затова или източникът не съдържа информация "
+"(напр. няма диск в устройството). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Възникна проблем при зареждане на библиотека за декодер: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Източникът изглежда е шифрован и не може да бъде прочетен. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Вашето DVD вероятно е кодирано. В зависимост от законите на вашата страна "
+"можете или не можете да използвате libdvdcss за четене на този диск. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Неизвестна грешка: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Грешка: Не може да бъде инициализиран нов видео драйвер %1 - ще бъде използван "
+"%2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Използване на видео драйвер: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Грешка: Не може да бъде инициализиран нов аудио драйвер %1 - ще бъде използван "
+"%2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Използване на аудио драйвер: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Инициализиране на xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Грешка при инициализиране на xine ядрото!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Използван аудио драйвер (по подразбиране: авто)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Използван видео драйвер (по подразбиране: авто)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Използване на софтуерен аудио миксер"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Показване на OSD съобщения"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Размер на OSD текст"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Шрифт на OSD съобщения"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"Грешка при инициализиране на видео драйвер \"%1\" - ще бъде направен опит с "
+"\"авто\"..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Всички видео драйвери не можаха да бъдат инициализирани!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"Грешка при инициализиране на аудио драйвер \"%1\" - ще бъде направен опит с "
+"\"авто\"..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Всички аудио драйвери не можаха да бъдат инициализирани!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Създаването на нов xine поток е невъзможно!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: отваряне..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Отваряне..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Аудио кодек"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Видео кодек"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Не е намерена приставка за този източник"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Източникът изглежда е повреден"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Исканият източник не съществува"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Източникът не може да бъде отворен"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Основна грешка"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Заглушаване изкл."
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Заглушаване вкл."
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Бързо напред %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Бавно напред %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Разплитане: вкл."
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Разплитане: изкл."
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Съотношение"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Авто"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Мащабиране по X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Мащабиране по Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr " мс"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Настройки на еквалайзера"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Увеличение на звука"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Увеличени на звука за еквалайзер - ако звукът стане много силен, изключете това"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Изтриване на филтър"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Търсене в %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Грешка при инициализирането на GStreamer!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Заглушаване"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Коментар"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Параметри на &GStreamer ядрото"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer не може да бъде инициализиран!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Липсва регистър за GStreamer! Забравихте ли след инсталацията да изпълните <b>"
+"gst-register</b> (като root)?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"Грешка при инициализиране на аудио драйвер \"%1\" - ще бъде опитано с друг..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Не е открит използваем аудио драйвер!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"Грешка при инициализиране на видео драйвер \"%1\" - ще бъде опитано с друг..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Не е открит използваем видео драйвер!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Параметри на GStreamer ядрото"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Аудио опции"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Предпочитан аудио драйвер"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Видео опции"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Предпочитан видео драйвер"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Необходимо е рестартиране!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Медия"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Медия опции"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD устройство"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
diff --git a/po/bn.po b/po/bn.po
new file mode 100644
index 0000000..61b658f
--- /dev/null
+++ b/po/bn.po
@@ -0,0 +1,3264 @@
+# translation of kaffeine.po to Bengali
+# ______________________________________________________________
+#
+# Preliminary translation for this file was done by "Anubadok",
+# A Free (as in Freedom) machine translator for Bengali (Bangla).
+# ______________________________________________________________
+#
+# Bangla translation of kaffeine.
+# Copyright (C) 2006, Free Software Foundation, Inc.
+# Golam Mortuza Hossain <gmhossain@gmail.com>, 2006.
+# Deepayan Sarkar <deepayan@bengalinux.org>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-05-13 16:57-0500\n"
+"Last-Translator: Golam Mortuza Hossain <gmhossain@gmail.com>\n"
+"Language-Team: Bengali <kde-translation@bengalinux.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "ইপিজি"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "ঝালাও"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "বর্তমান/পরবর্তী"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "চ্যানেল"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "শুরু"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "সময়কাল"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "শিরোনাম"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "সমস্ত প্রোগ্রাম দেখাও"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "টাইমার-এ যোগ করো"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "নাম:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "চ্যানেল:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "শুরু:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "সময়কাল:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "শেষ:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "নতুন নামে রেকর্ড করো:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "কোনটিও নয়"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "প্রতিদিন"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "সাপ্তাহিক"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "মাসিক"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "স্বনির্বাচিত"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "পুনরাবৃত্তি..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "টাইমার সম্পাদক"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "আপনি এটির একটি নাম অবশ্যই দেবেন!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "সময়কাল অন্তত ১ মিনিট অবশ্যই হতে হবে!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "নামের মধ্যে উল্লেখিত চিহ্নগুলির একটিও থাকা চলবে না: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "প্রাথমিক ট্রান্সপন্ডার মানসমূহ"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "এই নামটি অনন্য নয়।"
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "নিখোঁজ অডিও পি-আই-ডি!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "পি-আই-ডি অবশ্যই শূন্য হবে না!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "আপনাকে কিছু দিন বেছে নিতে হবে।"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "চ্যানেল"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "টাইমার"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "ইলেকট্রনিক প্রোগ্র্যাম সহায়িকা"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "ওএসডি"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "ডিভিবি মানসমূহ"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "সংখ্যা"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "নাম"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "অডিও চ্যানেল"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "তাত্ক্ষণিক রেকর্ড"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "সম্প্রচার"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "সময় পরিবর্তন"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "রেকর্ডিং"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "সম্প্রচার"
+
+#: input/dvb/dvbpanel.cpp:271
+#, fuzzy
+msgid "Select icon..."
+msgstr "চলচ্চিত্র নির্বাচন"
+
+#: input/dvb/dvbpanel.cpp:278
+#, fuzzy
+msgid "Choose channel icon"
+msgstr "চ্যানেল সম্পাদক"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "ডিজিট্যাল টিভি"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "সরাসরি ডিজিট্যাল টিভি কেবলমাত্র জাইন ইঞ্জিনের সঙ্গে কাজ করে।"
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "ওএসডি পরবর্তী চ্যানেল"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "ওএসডি পূর্ববর্তী চ্যানেল"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "ওএসডি জ্যাপ"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "ওএসডি পরবর্তী ঘটনা"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "ওএসডি পূর্ববর্তী ঘটনা"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "ওএসডি প্রদর্শন করো"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "ইপিজি..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "টাইমার..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "সম্প্রচার করা হচ্ছে..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "চ্যানেল..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "ডিভিবি কনফিগার করো..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "সমস্ত"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "টিভি"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "রেডিও"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "নতুন শ্রেণীবিভাগ..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "আইকন পরিবর্তন..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "শ্রেণীবিভাগ মুছে ফেলো..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "নতুন শ্রেণীবিভাগ"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "এই শ্রেণীবিভাগটির জন্য একটি নাম ঢোকান:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "আপনি কি এই শ্রেণীবিভাগটি সত্যিই মুছে ফেলতে চান?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>http://hftom.free.fr/kaxtv/dvbdata.tar.gz থেকে ডিভিবি তথ্য পাওয়া যায়নি! "
+"<br>\t\t\tআপনার ইন্টারনেট সংযোগ পরীক্ষা করুন, এবং পুনরায় চেষ্টা করতে হ্যাঁ "
+"বলুন।"
+"<br>\t\t\tঅথবা বাতিল করতে না বলুন।"
+"<br>\t\t\t যদি আপনার ইতিমধ্যে এই আর্কাইভটি থাকে, তাহলে এটি ~/ "
+"kde/share/apps/kaffeine/dvbdata.tar.gz -এ কপি করুন এবং হ্যাঁ বলুন।"
+"<br>"
+"<br>আমি কি পুনরায় চেষ্টা করব?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "সম্প্রচার ব্যর্থ হল।"
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "সম্প্রচার চালু করা যায়নি।"
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "টাইমার সফলভাবে তৈরি করা এবং চালু করা হয়েছে।"
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "আপনি হয়ত কিছু চ্যানেল প্রথমে সংজ্ঞায়িত করতে চাইবেন!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "টাইমার সফলভাবে তৈরি করা হয়েছে।"
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "রেকর্ডিং এখনও চলছে।"
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "সম্প্রচার এখনও চলছে।"
+
+# FIXME
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "ডিভিবি টিউন করা যায়নি!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "পি-আই-ডি নিযুক্ত করা যায়নি"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "কোনও সিএএম(CAM) মুক্ত নয়"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "ক্যাফিন এখনও রেকর্ড করছে। আপনি কি সত্যিই প্রস্থান করতে চান?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "ক্যাফিন টাইমার সারিবদ্ধ করেছে। আপনি কি সত্যিই প্রস্থান করতে চান?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "সংকেত:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "এসএনআর:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "লক:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "সম্পাদনা করো..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "সমস্ত চ্যানেল মুছে ফেলতে আপনি কি সত্যিই চান?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "স্ক্যান শুরু করো"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "স্ক্যান থামাও"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "থামানো হচ্ছে..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "পাওয়া গেছে: %1 টিভি - %2 রেডিও"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "ডিভিবি তথ্য সকেট খোলা যায়নি।"
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "টাইমার তালিকা:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "নতুন"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "থামাও/মুছে ফেলো"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"এই টাইমারটির পুনরাবৃত্তি করা হল। আপনি কি বর্তমান কাজ এড়িয়ে যেতে চান নাকি টাইমার "
+"মুছে ফেলতে চান?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "বর্তমান কাজ এড়িয়ে যাও"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "নির্বাচিত টাইমার মুছে ফেলো?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "ডাউনলোড করা হচ্ছে..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "ডেটা ফাইল কপি করা হচ্ছে ..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "ডিভিবি মানসমূহ"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "ডিভিবি ডিভাইস"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "ডিভাইস মানসমূহ"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>নাম:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>ধরন:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+#, fuzzy
+msgid "Satellite"
+msgstr "সঙ্গীত-তালিকা সংরক্ষণ করো"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "শিল্পী"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "অজানা"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "এলএনবি-এর সংখ্যা:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "১ম sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "এলএনবি মানসমূহ..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "২য় sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "৩য় sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "৪র্থ sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "এলএনবি মানসমূহ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "উত্‍স:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "ডিভিবি রেকর্ডিং অপশনস"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "রেকর্ড ডিরেক্টরী:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "সময় পরিবর্তন ডিরেক্টরী:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "মার্জিন শুরু:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(মিনিট)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "মার্জিন শেষ:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "তাত্ক্ষণিক রেকর্ড সময়কাল:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "পছন্দের ফরম্যাট:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "ডিভিবি সম্প্রচার"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "সম্প্রচার ঠিকানা:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "সম্প্রচার পোর্ট:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "তথ্য পোর্ট:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "বিবিধ"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "ডিফল্ট অক্ষরমালা (পুনরায় শুরু করা প্রয়োজন):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "স্ক্যান ডেটা আপডেট করো:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "ডাউনলোড"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"~/kaffein_dvb_events.tx-এ\n"
+"ইপিজির ঘটনা ফেলে দাও:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "ফেলে দাও"
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "ডিভিবি ক্লায়েন্ট"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>http://hftom.free.fr/kaxtv/dvbdata.tar.gz থেকে ডিভিবি তথ্য পাওয়া যায়নি!"
+"<br>\t\t\tআপনার ইন্টারনেট সংযোগ পরীক্ষা করুন, এবং পুনরায় চেষ্টা করতে হ্যাঁ "
+"বলুন।"
+"<br>\t\t\tঅথবা বাতিল করতে না বলুন।"
+"<br>আমি কি পুনরায় চেষ্টা করব?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "অবৈধ রেকর্ড ডিরেক্টরী।"
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "অবৈধ সময় পরিবর্তন ডিরেক্টরী।"
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "সম্প্রচার এবং তথ্য পোর্ট অবশ্যই আলাদা হতে হবে।"
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "অবৈধ সম্প্রচার ঠিকানা।"
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "এলএনবি মানসমূহ"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "সার্বজনীন এলএনবি"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "দ্বৈত্ব এল-ও"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "একক এল-ও"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "দ্বৈত্ব এল-ও পরিবর্তন কম্পাংক:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr "(মেগা-হার্জ)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "লো-ব্যান্ড কম্পাংক:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "হাই-ব্যান্ড কম্পাংক:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "একক এল-ও কম্পাংক:"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "একক এল-ও কম্পাংক:"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "একক এল-ও কম্পাংক:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "রিসেট"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "ডিভিবি সম্প্রচার সকেট খোলা যায়নি।"
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "ডিভিবি সম্প্রচার সকেট চালু করা যায়নি।"
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "কোনও অডিও এনকোডার খুঁজে পাওয়া যায়নি।"
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "এনকোডার '%1' লোড করা ব্যর্থ হয়েছে।"
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "ফোল্ডার তৈরি করতে অক্ষম:"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "এম-বি"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "কে-বি"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "বাইট"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "অডিও সিডি"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "সিডি চালাও"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "সিডি রিপ করো"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "শিল্পী:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "অ্যালবাম:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "ট্র্যাক"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"রিপ করার জন্য আপনি ট্র্যাক নির্বাচন করুন এবং <b>এনকোডিং করো</b>বাটন ক্লিক করুন।"
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "এনকোডিং করো..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "অডিও সিডি এনকোডিং"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "অডিও সিডি চালাও"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "ডিভিডি চালাও"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "ভিসিডি চালাও"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "ডিভিডি খোলো (&ড)"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "ভিসিডি খোলো (&ভ)"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "&অডিও সিডি খোলো"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "রিপ করার জন্য ট্র্যাক আপনি অবশ্যই নির্বাচন করবেন।"
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "কতিপয় অডিও সিডি খুঁজে পেল। একটি বেছে নিন:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "কোনও অডিও সিডি পাওয়া যায়নি।"
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "ডিভিডি ভিডিও"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "কতিপয় ডিভিডি ভিডিও খুঁজে পেল। একটি বেছে নিন:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "ভিসিডি-এসভিসিডি"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "কতিপয় (এস)ভিসিডি খুঁজে পেল। একটি বেছে নিন:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "কোনও শিরোনাম নেই"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "ট্র্যাক %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "স্থানীয় সিডি-ডিবি এন্ট্রি খোঁজা হচ্ছে..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "প্রত্যন্ত সিডি-ডিবি এন্ট্রি খোঁজা হচ্ছে..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "সিডি-ডিবি এন্ট্রির যথার্থ মিল পাওয়া গেছে..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "সিডি-ডিবি এন্ট্রির কাছাকাছি মিল পাওয়া গেছে"
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "কতিপয় ডিভিডি ভিডিও খুঁজে পেল। একটি বেছে নিন:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "ক্যাফিন-এমপিথ্রি-লেম"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "ক্যাফিনের জন্য একটি লেম(Lame) এমপিথ্রি এনকোডার প্লাগিন।"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "ক্যাফিন-ওজিজি-ভরবিস"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "ক্যাফিনের জন্য একটি ওজিজি ভরবিস এনকোডার প্লাগিন।"
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "ডিভিবি ক্লায়েন্ট"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "তথ্য সকেট খোলা যায়নি।"
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "তথ্য সকেট বাইন্ড করা যায়নি!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "সকেট খোলা যায়নি।"
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "সকেট অপশন নিযুক্ত করা যায়নি!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "সকেট বাইন্ড করা যায়নি!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "সমস্ত আকার"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "খুব ছোট"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "ছোট"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "মাঝারি"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "বড়"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "খুব বড়"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "নতুন অনুসন্ধান"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+"আপনার নির্বাচিত কভার পাওয়া যাচ্ছে না। অনুগ্রহ করে অন্য একটি নির্বাচন করুন।"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "কভার পাওয়া যাচ্ছে না"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "কভার ডাউনলোড কারক"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+"অনুরূপ কোনও চিত্র খুঁজে পাওয়া যায়নি, অনুগ্রহ করে নতুন অনুসন্ধান শর্তাবলী ঢোকান:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "নতুন অনুসন্ধান শর্তাবলী ঢোকান:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "চালাও"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "পরবর্তী চালাও/সারিবদ্ধ করো"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "&সমস্ত নির্বাচন করো"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "নির্বাচিতগুলো থেকে সঙ্গীত-তালিকা তৈরি করো"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "সাবটাইটে&ল যোগ করো..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "শিরোনাম সম্পা&দনা করো"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&তথ্য"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "দৈর্ঘ্য"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "ইউ.আর.এল"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "শিল্পী"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "অ্যালবাম"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "সন"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Genre"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "সাবটাইটেল"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "ব্যবহার হচ্ছে"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|সাবটাইটেল ফাইল\n"
+"*.*|সমস্ত ফাইল"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "সাবটাইটেল ফাইল নির্বাচন করো"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "একটি কভার বেছে নাও..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "গ্যালারি..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "ফিল্টার"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "সঙ্গীত-তালিকা:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"সক্রিয় সঙ্গীত-তালিকা নির্বাচন করুন। সঙ্গীত-তালিকার নাম পরিবর্তন করতে এটি "
+"সম্পাদনা করুন এবং 'রিটার্ন' টিপে নিশ্চিত করুন।"
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "সঙ্গীত-তালিকা চালাও"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "পু&নরাবৃত্তি করো"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "সঙ্গীত-তালিকা চক্রাকারে চালানো হয়"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&এলোমেলোভাবে মেশাও"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "এলোমেলো ধারাতে আইটেম চালানো হয়"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "বর্তমান সঙ্গীত-তালিকা বাদ দা&ও"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "নতুন &সঙ্গীত-তালিকা"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "সঙ্গীত-তালিকা আ&মদানি করো..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "...নামে বর্তমান সঙ্গীত-তালিকা সং&রক্ষণ করো"
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "বর্তমান সঙ্গীত-তালিকা বাদ দা&ও"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "ক্যাফিন সঙ্গীত-তালিকা"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "সমস্ত ফাইল"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "সঙ্গীত-তালিকা খোলো"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "এমথ্রিইউ সঙ্গীত-তালিকা"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "পিএলএস সঙ্গীত-তালিকা"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "সঙ্গীত-তালিকা সংরক্ষণ করো"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "সঙ্গীত-তালিকা"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "নতুন"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "মিডিয়া সম্পদ আমদানি করা হচ্ছে ..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(কোনও সাবটাইটেল নয়)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "অন্যান্য সাবটাইটেল..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "গ্যালারি"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "সারি: %1-টি এন্ট্রি, চালানোর সময়: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "এন্ট্রি: %1, চালানোর সময়: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "তালিকা এবং ডিস্ক থেকে '%1' মুছে ফেলো?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "সঙ্গীত-তালিকার নাম ইতিমধ্যেই রয়েছে"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "সঙ্গীত-তালিকার আলাদা নাম ঢোকান:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "সাবটাইটেল নির্বাচন"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "মিডিয়া ফাইল:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "চলচ্চিত্র নির্বাচন"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "সাবটাইটেল ফাইল:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "চালাও / থামাও"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&পরবর্তী"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "নী&রব করো"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "ক্যাফিন প্লেয়ার"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[ক্যাফিন প্লেয়ার]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "গোলাম মোর্তুজা হোসেন"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "gmhossain@gmail.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"কে-ডি-ই ৩ এর জন্য একটি মিডিয়া প্লেয়ার। চালানোর জন্য একাধিক ব্যাক-এন্ড ব্যবহার "
+"করতে পারে, ডিফল্ট (এবং সুপারিশকৃত) হল জাইন।"
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) ২০০৩-২০০৫, ক্যাফিন লেখক"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "বর্তমান রক্ষণাবেক্ষণকারী"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "মূল লেখক"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM সমর্থন।"
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "বিবিধ মূল্যবান প্যাচ।"
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "ডিভিবি ওএসডি ব্রাউজিং প্যাচ।"
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "ডিভিবি শ্রেণীবিভাগ প্যাচ।"
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "ক্যাফিন ০.৮ এর জন্য লোগো এবং অন্যান্য আর্টওয়ার্ক।"
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "ক্যাফিন ০.৫ এর জন্য লোগো অ্যানিমেশন"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "মেটা ট্যাগের জন্য বিকল্প এনকোডিং। বহু প্যাচ।"
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "জাইন পোষ্ট প্লাগিন পরিচালনা। বহু প্যাচ।"
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "সাবটাইটেল ফাইল আমদানি।"
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "এমথ্রিইউ আমদানি। পরীক্ষাকরণ।"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "সাবটাইটেল পি-আই-ডি সম্পাদক"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "সাবটাইটেল পি-আই-ডি"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "নতুন আইটেম"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "ওপরে ওঠাও"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "নিচে নামাও"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< নির্বাচিতগুলি আপডেট করো "
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< নতুন"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "পি-আই-ডি:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "পাতা:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "উপঃ পাতা:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Lang:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "ক্রমাগত টাইমার"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "অডিও পি-আই-ডি সম্পাদক"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "অডিও পি-আই-ডি"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "এসিথ্রি"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "সম্প্রচার সম্পাদক"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "চ্যানেল পাওয়া যাচ্ছে:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "সম্প্রচার তালিকা:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(সম্পাদনা করতে/মুছে ফেলতে ডানদিকে ক্লিক করুন)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "নতুন..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "অনুসন্ধান চলছে"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "অফসেট (কিলোহার্জ)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "০"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+১৬৭"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-১৬৭"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "স্ক্যান শুরু করো"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "ফিল্টার"
+
+# FIXME
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "বিনামূল্যে"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "সরবরাহকারী:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< নির্বাচিতগুলি যোগ করো"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< ফিল্টারকৃতগুলি যোগ করো"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "পাওয়া গেছে"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "SNR"
+msgstr "এসএনআর:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "সম্পন্ন"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "ডিভিবি (&ড)"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "চ্যানেল সম্পাদক"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "পোলারিটি"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "কম্পাংক:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "চিহ্ন হার:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "এনক্রিপ্টকৃত"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "টেলেটেক্সট পি-আই-ডি:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "সার্ভিস আই.ডি.:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "ভিডিও পি-আই-ডি:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "পরিবহণ স্ট্রীম আই.ডি.:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "সাবটাইটেল পি-আই-ডি..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "অডিও পি-আই-ডি..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "ব্যান্ডউইড্থ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "এফ-ই-সি উঁচ্চ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "প্রেরণ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "এফ-ই-সি নিম্ন:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "রক্ষণ পর্যায়কাল:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "ক্রমোচ্চ শ্রেণীবিভাগ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "মডিউলেশন:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "ওলটান অবস্থা:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "এনকোডিং পছন্দসমূহ"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "এনকোডার:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "ভিত্তি ডিরেক্টরী:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "প্যারানয়া:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "সমস্ত পরীক্ষা নিষ্ক্রিয় করো"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "স্বাভাবিক মোড"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "প্যারানয়া মোড"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "নর্মালাইজ করো"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "সিডি টুলবার"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "লেম(Lame) এমপিথ্রি অপশনস"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "ভিবিআর"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "বিটরেট:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "কেবি/সেকেন্ড"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "ওজিজি ভরবিস অপশনস"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "মান :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&সঙ্গীত-তালিকা"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "প্রস্থান করার অপশনস"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "প্লেয়া&র"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "স্বয়ংক্রী&য় আকার পরিবর্তন সক্রিয় করো"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "নে&টওয়ার্ক সম্প্রচার"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "দি&কনির্নয়"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "ডিভিডি (&ড)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "ডিভিডি মেনু (&ড)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&অডিও"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "ভিডি&ও"
+
+# FIXME
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "দৃষ্টি&ভঙ্গি অনুপাত"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "স্ক্রীনশট টুলবার"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "নিয়ন্ত্রণ টুলবার"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "ভলিউম টুলবার"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "অবস্থান টুলবার"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "ক্যাফিন ব্যবস্থাপনা"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "আচরণ"
+
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "ভিডিও থামাও যখন লুক্কায়িত"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "সিস্টেম ট্রেতে সন্নিবেশ করো"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr "সেকেন্ড"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "বন্ধ"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "সিস্টেম ট্রেতে শিরোনাম ঘোষণার সময়কাল"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "ডিভিবি ক্লায়েন্ট সক্রিয় করো"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "বিবিধ অপশনস"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "মেটা ট্যাগের জন্য বিকল্প (ইউনিকোড নয়) এনকোডিং ব্যবহার করো"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"মেটা ট্যাগ-এর জন্য বিকল্প এনকোডিং নাম বেছে নাও\n"
+"(ইউনিকোডে রূপান্তর করতে)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "সাম্প্রতিক ফাইল তালিকা মুছে ফেলো"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "তাত্‍ক্ষণিকভাবে চালানো শুরু করো"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "পূর্ণপর্দা মোডে শুরু করো"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "অডিও ড্রাইভার নিযুক্ত করো"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "ভিডিও ড্রাইভার নিযুক্ত করো"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "অডিও সিডি/ভিসিডি/ডিভিডি ডিভাইস পাথ নিযুক্ত করো।"
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "আউটপুট জাইন ডিবাগ বার্তা"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "ইনষ্টলেশন উইজার্ড চালাও"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"চালানোর জন্য ফাইল।হতে পারে একটি স্থানীয় ফাইল, একটি ইউআরএল, একটি ডিরেক্টরী অথবা "
+"'ডিভিডি', 'ভিসিডি', 'অডিও সিডি'।"
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "শুরু করো"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "প্লেয়ার উইন্ডো"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "সমর্থিত মিডিয়া ফরম্যাট"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "এমপেগ অডিও ফাইল"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "এমপেগ ভিডিও ফাইল"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "ওজিজি ভরবিস ফাইল"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "এভিআই ফাইল"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "কুইকটাইম ফাইল"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "রেয়াল মিডিয়া ফাইল"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "ম্যাট্রোস্কা ফাইল"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "এফএলএসি ফাইল"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "উইন্ডোজ মিডিয়া ফাইল"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "ডব্লিউএভি ফাইল"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "প্লেয়ার পার্ট '%1' লোড করা ব্যর্থ হয়েছে।"
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "অনুসন্ধান পাথ-এ %1 পাওয়া যায়নি।"
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "&ইউআরএল খোলো..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "ডিরেক্টরী খোলো... (&র)"
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "এই ট্র্যাকটির পর প্রস্থান করো এবং মনিটর বন্ধ করো"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "এই ট্র্যাকটির পর প্রস্থান করাে"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "সঙ্গীত-তালিকা শেষ হওয়ার পর প্রস্থান করাে"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "ন্যুনত&ম মোড"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "সঙ্গীত-তালিকা/প্লেয়ার টোগল করো (&P)"
+
+#: kaffeine.cpp:710
+#, fuzzy
+msgid "Keep &Original Aspect"
+msgstr "মূল দৃষ্টিভঙ্গি বজায় রাখো (&O)"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "মূল আকার"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "দ্বিগুণ আকার"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "তিনগুন আকার"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "প্লেয়ার ইঞ্জিন (&P)"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "ডিভিবি ক্লায়েন্ট"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "প্লেয়ার"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "প্রধান উইন্ডো"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "ডিপিএমএস এক্স-সার্ভার বর্ধিতাংশ খুঁজে পাওয়া যায়নি।"
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"এটি ক্যাফিন বন্ধ করবে এবং ফাইল/সঙ্গীত-তালিকা শেষ হওয়ায় পর মনিটরের বিদ্যুত "
+"বন্ধকরবে। মনিটরের বিদ্যুত বন্ধ করার জন্য \"ডিপিএমএস\" অপশন আপনার এক্স "
+"কনফিগফাইলে অবশ্যই থাকতে হবে।"
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "ফাইল খোলো"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "ইউআরএল খোলো"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "একটি ইউআরএল ঢোকান:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "ফোল্ডার খোলো"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "ড্রাইভ-এ কোনও %1 নেয়, অথবা ডিভাইসের পাথ ভূল।"
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "অনুগ্রহ করে সঠিক ড্রাইভ নির্বাচন করুন:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "ক্যাফিন %1 ইনষ্টলেশন উইজার্ড"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "ইনষ্টলেশন পরীক্ষা"
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "ক্যাফিন ব্যবস্থাপনা"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "বেশ।"
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "পার্ট পাওয়া যায়নি। অনুগ্রহ করে আপনার ইনষ্টলেশন পরীক্ষা করুন!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "সংস্করণ পাওয়া গেছে"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "ক্যাফিন-এর জন্য প্রয়োজন কে-ডি-ই >= %1।"
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "উইন-৩২ কোডেক"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"কোনও উইন-৩২ কোডেক /usr/lib/win32-এ খুঁজে পাওয়া যায়নি। আপনি উইন্ডোজ মিডিয়া ৯ "
+"ফাইল, অপেক্ষাকৃত নতুন রেয়াল মিডিয়া ফাইল এবং কিছু কম পরিচিত ফরম্যাট চালাতে "
+"পারবেন না।কোডেক এখান থেকে ডাউনলোড করুন:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss খুঁজে পাওয়া যায়নি। আপনি এনক্রিপ্টকৃত (বেশীরভাগ বাণিজ্যিক) ডিভিডি "
+"চালাতেপারবেন না। আপনি লাইব্রেরীটি এখান থেকে পেতে পারেন (কিন্তু এটির ব্যবহার হয়ত "
+"আপনারদেশের কপিরাইট নিয়মকানুন লঙ্ঘন করতে পারে!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "ডিভিডি ড্রাইভ"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "ডিএমএ মোড বন্ধ! মসৃণভাবে ডিভিডি চালানোর জন্য রুট হিসেবে চালান:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"ডিএমএ মোড পরীক্ষা করা যায়নি। অনুমতি অস্বীকার করল অথবা তেমন কোনও ডিভাইস নেই:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "ডিভিবি-ডিভাইস"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"কোনও ডিভিবি-ডিভাইস খুঁজে পাওয়া যায়নি। ডিভিবি সম্পর্কিত কাজ গোপন করা হবে।"
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "বিতরণ"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"SuSE দ্বারা সরাবরাহকৃত xine-lib-এ \"কতগুলো বৈশিষ্ট্য আইনি প্রয়োজনীয়তার কারণেহয়ত "
+"থাকবে না (সম্ভাব্য পেটেন্ট লঙ্ঘন)\"। আপনার এখান থেকে প্যাকেজটি ব্যবহারকরা উচিত:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "ফলাফল"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "কিছু সমস্যা পাওয়া গেছে, কিন্তু ক্যাফিন তাহলেও হয়ত কাজ করবে।"
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "সমস্ত ঠিক!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"mms:// (মাইক্রোসফ্ট মিডিয়া) স্ট্রীম-এর জন্য সহায়তাকারী অ্যাপলিকেশন হিসেবে "
+"ক্যাফিন ব্যবহার করো"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"rtsp:// (রেয়াল মিডিয়া এবং অন্যান্য) স্ট্রীম-এর জন্য সহায়তাকারী অ্যাপলিকেশন "
+"হিসেবেক্যাফিন ব্যবহার করো"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "ডেস্কটপে একটি ক্যাফিন আইকন তৈরি করো"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "ইনষ্টলেশন অপশনস"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "ডি-ইন্টারলেস মান"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>খুব অল্প সিপিইউ ব্যবহার, জঘন্য মান।</b>"
+"<br>উলম্ব রিসোলিউশনের অর্ধেক হারিয়ে যায়। কিছু সিস্টেমের জন্য (পিসিআই ভিডিও "
+"কার্ডের সঙ্গে) এটি সিপিইউ ব্যবহার সাধারন ভিডিও চালানোর তুলনায় কমাবে "
+"(ডি-ইন্টারলেসিং ছাড়া)।"
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>অল্প সিপিইউ ব্যবহার, খারাপ মান।</b>"
+"<br>চিত্র উলম্বভাবে ঝাপসা করা হয়যাতে ইন্টারলেসিং-এর প্রভাব বাদ দেওয়া যায়।"
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>মাঝারি সিপিইউ ব্যবহার, মাঝারি মান।</b>"
+"<br>চিত্র বিশ্লেষণ করা হয়এবং যে অংশে ইন্টারলেসিং প্রভাব দেখা যায় তা ঠিক করা হয় "
+"(ইন্টারপোলেট করে)।"
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>উচ্চ সিপিইউ ব্যবহার, ভাল মান।</b>"
+"<br>ডিভিডি চিত্র ফরম্যাটের রূপান্তর মানের উন্নতি করে এবং ক্রোমা আপস্যামপ্লিং "
+"ত্রুটি মেরামত করে।"
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>খুব উচ্চ সিপিইউ ব্যবহার, খুব ভাল মান।</b>"
+"<br>কেতাদুরস্ত ডি-ইন্টারলেসিংঅ্যালগোরিদম ব্যবহার করা ছাড়াও এটি ফ্রেম হারও "
+"দ্বিগুন করবে (৩০->৬০ এফ-পি-এস) টিভির ফিল্ড-রেট-এর সঙ্গে মেলাতে। ৩-২ পুলডাউন "
+"সনাক্ত করে এবং পূর্বাবস্থায় প্রত্যাবর্তন করে। *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>খুব খুব উচ্চ সিপিইউ ব্যবহার, খুব ভাল মান (পরীক্ষামূলক) উন্নতিসহ।</b>"
+"<br> জাডার সংশোধন (ছায়াছবি তাদের মূল ২৪ এফ-পি-এস গতিতে চালানো হয়) এবং উলম্ব রং "
+"মসৃণকরণ (কিছু ডিভিডিতে দেখতে পাওয়া ছোট রঙীন ডোরাকাটা দাগ মেরামত করে)সক্রিয় করে। "
+"*"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "ব্যবহারকারী দ্বারা সংজ্ঞায়িত"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "টিভিটাইম ডি-ইন্টারলেস প্লাগিন কনফিগার করো..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"*<i>হয়ত একটি প্যাচ-কৃত ২.৪ কার্নেল-এর প্রয়োজন (রেডহ্যাট-এর মত) অথবা ২.৬ "
+"কার্নেল।</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "টিভিটাইম ডি-ইন্টারলেস প্লাগিন কনফিগার করো"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "প্রভাব প্লাগিন"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "অডিও"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "অডিও ফিল্টার"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "অডিও ফিল্টার সক্রিয় করো"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "ফিল্টার যোগ করো"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "সমস্ত ফিল্টার বাদ দাও"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "ভিডিও"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "ভিডিও ফিল্টার"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "ভিডিও ফিল্টার সক্রিয় করো"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "জাইন ইঞ্জিন মানসমূহ"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 অপশনস"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "শিক্ষানবিশ অপশনস"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "বিশেষজ্ঞ অপশনস"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "ক্যাফিন-পার্ট"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "ক্যাফিনের জন্য একটি জাইন ভিত্তিক প্লেয়ার পার্ট।"
+
+#: player-parts/xine-part/xine_part.cpp:253
+#, fuzzy
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"এসএমআইএল (Synchronized Multimedia Integration Language) সমর্থন এখন প্রাথমিক!\n"
+"ক্যাফিন-পার্ট কোনও বিন্যাস ছাড়া ধারনকৃত ভিডিও উত্‍স চালাতে এখন চেষ্টা করতে "
+"পারে। চেষ্টা করব?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "নতুন নামে স্ট্রীম সংরক্ষণ করো"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "সাবটাইটেল"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "অডিও চ্যানেল"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%2-এর %1"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|পিএনজি-ফাইল\n"
+"*.bmp| বিএমপি-ফাইল\n"
+"*.xbm|এক্সবিএম-ফাইল"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "নতুন নামে স্ক্রীনশট সংরক্ষণ করো"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "সম্প্রচার পোর্ট:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "সম্প্রচার স্ট্রীম গ্রহন কনফিগার করো"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "প্রেরকের ঠিকানা:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "পোর্ট:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "অবস্থানে লাফাও:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "জাইন ত্রুটি"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "জাইন বার্তা"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "তৈরি"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "চালানো হচ্ছে"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "মাইম"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "সাবটাইটেল ফাইল"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "নতুন নামে স্ট্রীম সংরক্ষণ করো"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "ট্র্যাক &তথ্য"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "ক্লীপবোর্ডে ইউআরএল কপি করো"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "ক্যাফিন-এ বাহ্যিকভাবে চালাও"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "সম্প্রচার স্ট্রীম পাঠা&ও..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "সম্প্রচার স্ট্রীম গ্র&হন করো..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "স্ক্রীনশট &সংরক্ষণ করো..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "স্ট্রীম সংরক্ষণ করো..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"হার্ড ডিস্কে বর্তমান স্ট্রীম সংরক্ষণ করে। এই বৈশিষ্ট্যটি কিছু ফরম্যাটের জন্য "
+"নিষ্ক্রিয় করা হয়েছিল (উদাঃ রেয়াল মিডিয়া) সম্ভাব্য আইনি সমস্যা প্রতিরোধ করতে।"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "ন্যুনত&ম মোড"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "থামাও"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "দ্রুত সামনে &এগোও"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "ধীর &গতি"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "এগিয়ে যাও (২০সেকেন্ড)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "পিছিয়ে যাও (২০সেকেন্ড)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "(১ মি) এগিয়ে যাও"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "(১ মি) পিছিয়ে যাও"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "(১০ মি) এগিয়ে যাও"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "(১ মি) পিছিয়ে যাও"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "অবস্থানে লাফাও..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "ডিভিডি মেনু বামদিক"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "ডিভিডি মেনু ডানদিক"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "ডিভিডি মেনু ওপরে"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "ডিভিডি মেনু নিচে"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "ডিভিডি মেনু নির্বাচন"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "অডিও চ্যানেল"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "অডিও চ্যানেল নির্বাচন"
+
+# FIXME
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "অডিও দৃশ্যায়ন (&V)"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "ভলিউম বাড়াও"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "ভলিউম কমাও"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "ডি-&ইন্টারলেস"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "ইন্টারলেসকৃত স্ট্রীমের জন্য এইটি সক্রিয় করে, উদাঃ কিছু ডিভিডি।"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "স্বয়ংক্রী&য়"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&৪:৩"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "অ্যানামরফি&ক"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "চৌকো (&চ)"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "অনুভূমিক বড় করে দেখাও"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "অনুভূমিক ছোট করে দেখাও"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "উলম্ব বড় করে দেখাও"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "উলম্ব ছোট করে দেখাও"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "ডি-ইন্টারলেস মা&ন"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "ভিডিও মানসমূ&হ"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "ইকুয়ালাইজা&র"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "মেনু টো&গল"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "শিরোনা&ম"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "মূ&ল"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&উপচিত্র"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "কো&ণ"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&পার্ট"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "শিরোনাম"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "পরিচ্ছেদ"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "কোণ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "ট্র্যাক &তথ্য"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "প্রভা&ব প্লাগিন..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&জাইন ইঞ্জিন মানসমূহ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "ভলিউম"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "অবস্থান"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"ছোট ক্লিক: টাইমার সামনে/পিছনে টোগল করে\n"
+"লম্বা ক্লিক: টাইমার ওএসডি টোগল করে"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "চালানোর সময়"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "সিডি-ডিবি এন্ট্রি খোঁজা হচ্ছে..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "অডিও সিডি ট্র্যাক %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "ভিসিডি ট্র্যাক %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "ভিডিও মানসমূহ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "রঙের সূক্ষ তারতম্য"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "সম্পৃক্তি"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "বৈসাদৃশ্য"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "ঔজ্জ্বল্ল"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "অডিও/ভিডিও অফসেট"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "সাবটাইটেল অফসেট"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "স্বয়ংক্রীয়"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"সাধারণ সাবধানবাণী:\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "কোনও তথ্য পাওয়া যাচ্ছে না।"
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"নিরাপত্তা সাবধানবাণী:\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"যে হোস্টটিতে আপনি সংযোগ করতে চেষ্টা করছেন সেটি অজানা।\n"
+"উল্লেখিত হোস্টনামের বৈধতা পরীক্ষা করুন।"
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "আপনার উল্লেখিত ডিভাইসের নামটি অবৈধ মনে হয়।"
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"নেটওয়ার্ক অগম্য মনে হচ্ছে।\n"
+"আপনার নেটওয়ার্ক ব্যবস্থাপনা এবং সার্ভারের নাম পরীক্ষা করুন।"
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "অডিও আউটপুট পাওয়া যাচ্ছে না। ডিভাইস ব্যস্ত।"
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"সংযোগ অস্বীকার করা হয়েছিল।\n"
+"হোস্ট নাম পরীক্ষা করুন।"
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"উল্লেখিত ফাইল অথবা ইউআরএল খুঁজে পাওয়া যায়নি। অনুগ্রহ করে এটি পরীক্ষা করুন।"
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "এই উত্‍সটিতে অনুমতি অস্বীকার করা হয়েছিল।"
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"উত্‍সটি পড়া যায়নি।\n"
+"হয়ত আপনার এর জন্য যথেষ্ট অধিকার নেই অথবা উত্‍স কোনও তথ্য ধারন করে না(উদাঃ: "
+"ড্রাইভ-এ কোনও ডিস্ক নেই)।"
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "একটি লাইব্রেরী অথবা একটি ডিকোডার লোড করার সময় একটি সমস্যা ঘটেছে:"
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "উত্‍সটি মনে হয় এনক্রিপ্টকৃত এবং পড়া যাবে না।"
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"আপনার ডিভিডি-টি সম্ভবত এনক্রিপ্টকৃত। আপনার দেশের আইন অনুযায়ী, আপনি এই "
+"ডিস্কটিপড়তে libdvdcss ব্যবহার করতে পারেন কিংবা নাও পারেন।"
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"অজানা ত্রুটি: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "ত্রুটি: নতুন ভিডিও ড্রাইভার %1 চালু করা যায়নি - %2 ব্যবহার করা হচ্ছে!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "ভিডিও ড্রাইভার ব্যবহার করছে: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "ত্রুটি: নতুন অডিও ড্রাইভার %1 চালু করা যায়নি - %2 ব্যবহার করা হচ্ছে!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "অডিও ড্রাইভার ব্যবহার করছে: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "জাইন চালু ..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "জাইন ইঞ্জিন চালু করা যায়নি!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "যে অডিও ড্রাইভার ব্যবহার করতে হবে (ডিফল্ট: স্বয়ংক্রীয়)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "যে ভিডিও ড্রাইভার ব্যবহার করতে হবে (ডিফল্ট: স্বয়ংক্রীয়)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "সফটওয়্যার অডিও মিক্সার ব্যবহার করো"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "ওএসডি বার্তা প্রদর্শন করো"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "ওএসডি টেক্সটের আকার"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "ওএসডি বার্তার জন্য ফন্ট"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "ভিডিও ড্রাইভার '%1' চালু করা যায়নি - চেষ্টা করছে 'স্বয়ংক্রীয়'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "সমস্ত ভিডিও ড্রাইভার চালু করতে ব্যর্থ হল!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "অডিও ড্রাইভার '%1' চালু করা যায়নি - চেষ্টা করছে 'স্বয়ংক্রীয়'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "সমস্ত অডিও ড্রাইভার চালু করতে ব্যর্থ হল!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "একটি নতুন জাইন স্ট্রীম তৈরি করা যায়নি!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "ডিভিবি: খোলা হচ্ছে..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "খোলা হচ্ছে..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "অডিও কোডেক"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "ভিডিও কোডেক"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "এই মাধ্যমটি পরিচালনা করতে কোনও প্লাগিন খুঁজে পায় নি"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "মাধ্যমটি মনে হয় ত্রুটিপূর্ণ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "অনুরোধকৃত মাধ্যমটির অস্তিত্ব নেই"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "মাধ্যমটি খোলা যায়নি"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "জেনেরিক ত্রুটি"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "সরব করো"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "নীরব করো"
+
+# FIXME
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "দ্রুত সামনে এগোও %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "ধীর গতি %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "ডিইন্টারলেস: চালু"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "ডিইন্টারলেস: বন্ধ"
+
+# FIXME
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "দৃষ্টিভঙ্গি অনুপাত"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "স্বয়ংক্রীয়"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "৪:৩"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "১৬:৯"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "১:১"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "২.১১:১"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "X বড় করে দেখাও"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Y বড় করে দেখাও"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "মিলি সেকেন্ড"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "ইকুয়ালাইজার মানসমূহ"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "ভলিউম বৃদ্ধি"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"ইকুয়ালাইজার-এর ভলিউম বৃদ্ধি - যদি শব্দ কোলাহলপূর্ণ হয় তবে এটি নিষ্ক্রিয় করুন"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "ফিল্টার মুছে ফেলো"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "%s-এ খোঁজা হচ্ছে"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "জিস্ট্রীমার চালু করা ব্যর্থ হল!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "জিস্ট্রীমার-পার্ট"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "নীরব করো"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "মন্তব্য"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "জিস্ট্রীমার ইঞ্জিন মানসমূহ (&G)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "জিস্ট্রীমার চালু করা যায়নি!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"জিস্ট্রীমার রেজিস্ট্রী নিখোঁজ! ইনষ্টলেশন-এর পরে আপনি কি <b>gst-register</b> "
+"(রুট হিসেবে) চালাতে ভুলে গেছেন?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "অডিও ড্রাইভার '%1' চালু করা যায়নি - আরেকটি চেষ্টা করছে..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "কোনও ব্যবহারযোগ্য অডিও ড্রাইভার পাওয়া যায়নি!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "ভিডিও ড্রাইভার '%1' চালু করা যায়নি - আরও একটি চেষ্টা করছে..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "কোনও ব্যবহারযোগ্য ভিডিও ড্রাইভার পাওয়া যায়নি!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "জিস্ট্রীমার ইঞ্জিন মানসমূহ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "অডিও অপশনস"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "পছন্দের অডিও ড্রাইভার"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "ভিডিও অপশনস"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "পছন্দের ভিডিও ড্রাইভার"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* পুনরায় শুরু করা প্রয়োজন!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "মিডিয়া"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "মিডিয়া অপশনস"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "সিডি, ভিসিডি, ডিভিডি ড্রাইভ"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "ডামি-পার্ট"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "এই চ্যানেলগুলি ইতিমধ্যেই রয়েছে এবং যোগ করা হয় নি:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "এক্স-সার্ভারে সংযোগ করতে ব্যর্থ হল!"
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "প্রধান উইন্ডো বন্ধ করলে সিস্টেম ট্রেতে ক্যাফিন চালু থাকবে। অ্যাপলিকেশন বন্ধ করতে ফাইলমেনু থেকে প্রস্থান ব্যবহার করুন।"
+
+#~ msgid "No player"
+#~ msgstr "কোনও প্লেয়ার নয়"
+
+#~ msgid "No layer"
+#~ msgstr "কোনও স্তর নয়"
+
+#~ msgid "Ch %1"
+#~ msgstr "Ch %1"
+
+#~ msgid "Alternate Layout"
+#~ msgstr "বিকল্প বিন্যাস"
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "ক্যাফিন পার্ট"
+
+#~ msgid "DVB-C"
+#~ msgstr "ডিভিবি-সি"
+
+#~ msgid "DVB-T"
+#~ msgstr "ডিভিবি-টি"
+
+#~ msgid "DVB-S"
+#~ msgstr "ডিভিবি-এস"
+
+#~ msgid "Developer"
+#~ msgstr "ডেভেলপার"
+
+#~ msgid "DVB Support"
+#~ msgstr "ডিভিবি সমর্থন"
+
+#~ msgid " min"
+#~ msgstr " মিনিট"
+
+#~ msgid ""
+#~ "Interval to fake keypresses\n"
+#~ "(prevent screensaver from activating)"
+#~ msgstr ""
+#~ "নকল কী-বোর্ড টেপার পর্যায়কাল\n"
+#~ "(স্ক্রীনসেভার সক্রিয় হওয়াকে প্রতিরোধ করে)"
+
+#~ msgid "Open Files"
+#~ msgstr "ফাইল খোলো"
+
+#~ msgid "Open Directory"
+#~ msgstr "ডিরেক্টরী খোলো"
+
+#~ msgid "Open DVD"
+#~ msgstr "ডিভিডি খোলো"
+
+#~ msgid "Open VCD"
+#~ msgstr "ভিসিডি খোলো"
+
+#~ msgid "This player doesn't support DVD playback."
+#~ msgstr "এই প্লেয়ারটি ডিভিডি চালানো সমর্থন করে না।"
+
+#~ msgid "This player doesn't support VCD playback."
+#~ msgstr "এই প্লেয়ারটি ভিসিডি চালানো সমর্থন করে না।"
+
+#~ msgid "This player doesn't support Audio CD playback."
+#~ msgstr "এই প্লেয়ারটি অডিও সিডি চালানো সমর্থন করে না।"
+
+#~ msgid "Create Go!-Tab"
+#~ msgstr "Go!-Tab তৈরি করো"
diff --git a/po/br.po b/po/br.po
new file mode 100644
index 0000000..10dffce
--- /dev/null
+++ b/po/br.po
@@ -0,0 +1,3190 @@
+# KDE breton translation
+# Thierry Vignaud <tvignaud@mandriva.com>, 2005
+msgid ""
+msgstr ""
+"Project-Id-Version: all2.po\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2004-09-20 15:44+0200\n"
+"Last-Translator: Thierry Vignaud <tvignaud@mandrakesoft.com>\n"
+"Language-Team: br <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Adtresañ"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Steuñvet"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Red/A-heul"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanol"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Deroù"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Pad"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Titl"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Diskouez pep program"
+
+#: input/dvb/kevents.cpp:142
+#, fuzzy
+msgid "Add to Timers"
+msgstr "Siloù klevet"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Name:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanol :"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Deroù :"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Pad :"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Diwezh :"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr ""
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Ebet"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Deizek"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Sizhuniek"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Miziek"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Diouzhoc'h"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Adseniñ ..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Red eo deoc'h da reiñ anezhi un anv !"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "N'eo ket dieil an anv-mañ."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr ""
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Arabat bezañ 0 gant ar PID !"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanolioù"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Dibarzhoù DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Niveroù"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Anv"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Kanolioù klevet"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Skignañ"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Oc'h enrollañ"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Skignañ"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Dibabit un arlun ..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Dibabit arlun ar c'hanol"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "TV digitel"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Kanol OSD a-heul"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Kanol OSD diaraok"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Diskouez OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG ..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Skignañ ..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanolioù ..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Kefluniañ DVB ..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Holl"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Rumm nevez ..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Kemmañ an arlun ..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Lemel ar rumm ..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Rumm nevez"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Roit un anv evit ar rumm-mañ :"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Ha fellout a ra deoc'h da vat lemel ar rumm-mañ ?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Sach'et eo skignañ."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1427
+#, fuzzy
+msgid "You may want to define some channel first!"
+msgstr "Ha fellout a ra deoc'h da vat lemel pep kanol ?"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "N'hell ket lakaat ar pid(où)"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Arhent :"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR :"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Krouilhiñ :"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Aozañ ..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Ha fellout a ra deoc'h da vat lemel pep kanol ?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Emaon o paouez ..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Kavet : %1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr ""
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr ""
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Nevez"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Paouez/Lemel"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr ""
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Lemel an dilerc'hier dibabet ?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Emaon oc'h enkargañ ... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Oc'h eilañ ar restroù roadoù ..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Dibarzhoù DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Trobarzhell DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Kefluniadur loc'hañ"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Anv :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Seurt :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Fun"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Loarenn"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Dianav"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Niver a LNB :"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "Loarenn kentañ :"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Kefluniadur LNB ..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "Eil loarenn :"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "Trede loarenn :"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "Pevarvet loarenn :"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Kefluniadur LNB ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Tarzh :"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Dibarzhoù enrollañ DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+#, fuzzy
+msgid "Records directory:"
+msgstr "Digeriñ ar &renkell"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Bevenn deroù :"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(munut)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Bevenn diwezh :"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Furmad gwellañ :"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Skignañ DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Chomlec'h skignañ :"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Porzh skignañ :"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "A bep seurt"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Enkargañ"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Lugentoù DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "N'eo ket mat ar chomlec'h skignañ."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Kefluniadur LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+#, fuzzy
+msgid "Lo-band frequency:"
+msgstr "Frekañs :"
+
+#: input/dvb/dvbconfig.cpp:992
+#, fuzzy
+msgid "Hi-band frequency:"
+msgstr "Frekañs :"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Adkorañ"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr ""
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr ""
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr ""
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr ""
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr ""
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "Mo"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KO"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Oktedoù"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD klevet"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Seniñ ar CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Eztennañ ar CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Arzour :"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Albom :"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Roudenn"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Kodadañ ..."
+
+#: input/disc/disc.cpp:209
+#, fuzzy
+msgid "Audio CD encoding"
+msgstr "Siloù klevet"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Seniñ ur CD klevet"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Seniñ an DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Seniñ ar VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Digeriñ an &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Digeriñ ar &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Digeriñ ar CD &klevet"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Dao eo deoc'h dibab ar roudennoù d'eztennañ"
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "CD klevet kavet ebet."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD-Video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr ""
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Titl ebet"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Roudenn %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Ul lugent enkodiñ Lame mp3 evit Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Ul lugent enkodiñ Ogg Vorbis evit Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Pratik DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr ""
+
+#: input/dvbclient/cdlisten.cpp:80
+#, fuzzy
+msgid "Can't bind info socket!!!"
+msgstr "N'hellan ket digeriñ ul lugell."
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "N'hellan ket digeriñ ul lugell."
+
+#: input/dvbclient/cddump.cpp:202
+#, fuzzy
+msgid "Can't set socket option!!!"
+msgstr "N'hellan ket digeriñ ul lugell."
+
+#: input/dvbclient/cddump.cpp:209
+#, fuzzy
+msgid "Can't bind socket!!!"
+msgstr "N'hellan ket digeriñ ul lugell."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "An holl mentoù"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Bihan bihan"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Bihan"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Krenn"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Bras"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Braz braz"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Klask nevez"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "N'eo ket da gaout ar c'hodellig"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Enkarger godellig"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Seniñ"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Seniñ an hini a-heul/Ouzhpennañ d'al lostenn"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Dibabit an &holl re"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Krouiñ ur roll tonioù eus traoù dibabet"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Ouzhpennañ un is&titl ..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Aozañ an titl"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Titouroù"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Hirder"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Arzour"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Albom"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Bloavezh"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Rumm"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Istitloù"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "implijet"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr "*.smi *.srt *.sub *.txt *.ssa *.asc|Restroù istitloùn*.*|Pep restr"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Dibabit ur restr istitl"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Garidell ..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Sil"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Roll tonioù :"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Seniñ ar roll tonioù"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Adseniñ"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "En& dizurzh"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Seniñ traoù dre zegouezh"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "Le&mel ar roll tonioù red e ..."
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Roll tonioù ne&vez"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Enporzhiañ ar roll tonioù ..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Enrollañ ar roll tonioù red e ..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Le&mel ar roll tonioù red e ..."
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Rolloù tonioù Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Pep restr"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Digeriñ ur roll tonioù"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Rolloù tonioù M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Rolloù tonioù PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Enrollañ ar roll tonioù"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Roll tonioù"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NEVEZ"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(istitl ebet)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Istitl all ..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Garidell"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Lemel « %1 » eus ar roll hag eus ar bladenn ?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Anv ar roll tonioù a zo c'hoazh"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Roit un anv all evit ar roll tonioù :"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Dibabit un istitl"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Restr vedia :"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Dibabit ur film"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Restr istitl :"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "C'hoari / Ehan"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&A heul"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Mut"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Soner Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Soner Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Thierry Vignaud, Jañ-Mai Drapier"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "tvignaud@mandriva.com, jdrapier@club-internet.fr"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Oberourien Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Ratreer red"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Oberour kentañ"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr ""
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr ""
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr ""
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr ""
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Istitloù"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Istitloù"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Tra nevez"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Pignit"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Diskennit"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Bremañaat an hini dibabet"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Nevez"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid :"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Pajenn :"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Isbajenn :"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Yezh :"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, fuzzy, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Siloù klevet"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, fuzzy, no-c-format
+msgid "Audio PIDs"
+msgstr "Son :"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Aozer skignañ"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Kanolioù hegerz :"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Roll skignañ :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Nevez ..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Siloù"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Pourvezer :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Ouzhpennañ an hini dibabet"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Ouzhpennañ an hini silet"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Kavet"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Graet"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Aozer ar c'hanoloù"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frekañs :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, fuzzy, no-c-format
+msgid "Service ID:"
+msgstr "Tarzh :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, fuzzy, no-c-format
+msgid "Video PID:"
+msgstr "Dibarzhoù video"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Istitloù "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, fuzzy, no-c-format
+msgid "Audio PIDs..."
+msgstr "Dibarzhoù klevet"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, fuzzy, no-c-format
+msgid "Modulation:"
+msgstr "Pad  "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Kodader :"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Renkell diazez :"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr " ..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Mod reoliek"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr ""
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Barrenn ostilhoù CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Dibarzhoù mp3 Lame"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Feur (bit) :"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Ko/e"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Dibarzhoù Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr ""
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Roll tonioù"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr ""
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&C'hoarier(ez)"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Skignañ &rouedad"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Merdeadurezh"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Meuziadoù &DVB"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Son"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Barrenn ostilhoù skrammpaker"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "A ren ar varenn ostilh"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Barrenn ostilhoù evit an dolzennad"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Barrenn ostilhoù lec'hiadur"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kefluniadur Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Emzalc'h"
+
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "Ehan ar video pa vez kuzhet"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Enframmet e barlenn ar reizhiad"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " eil"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "marv"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr ""
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Bevaat ar pratik DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Dibarzhoù a bep seurt"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr ""
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr ""
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr ""
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Loc'hañ gant ar mod skramm leun"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Lakaat ar sturier klevet"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Lakaat ar sturier video"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Lakaat hent trobarzhell ar CD-klevet/VCD/DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr ""
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Seveniñ ar skoazeller staliadur"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Loc'hañ"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Prenestr ar soner"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr ""
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Restroù klevet MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Restroù video MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Restroù Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Restroù AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Restroù Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Restroù Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Restroù Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Restroù FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr ""
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Restroù WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr ""
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "N'eo ket bet kavet %1 en hent klask."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Digeriñ an &URL ..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Digeriñ ar r&enkell ..."
+
+#: kaffeine.cpp:701
+#, fuzzy
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Kuitaat goude ar roudenn-mañ"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Kuitaat goude ar roudenn-mañ"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Kuitaat goude ar roll tonioù"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr ""
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr ""
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr ""
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Ment kentañ"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Ment doubl"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Ment trip"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Keflusker ar &soner"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Pratik DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "C'hoarier(ez)"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Prenestr kentañ"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr ""
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Digeriñ ar restr(où)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Digeriñ an URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Roit un URL :"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Digeriñ ur renkell"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr ""
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr ""
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Skoazeller staliadur %1 Kaffeine"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr ""
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "Kefluniadur Kaffeine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Mat eo."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr ""
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr ""
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr ""
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Kodedioù WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr ""
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Trobarzhell DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Ingaladur"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "DISOC'H"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr ""
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Krouiñ un arlun Kaffeine ouzh ar burev"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Dibarzhoù staliadur"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Spisaet gant an arveriad"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Son"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Siloù klevet"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Bevaat ar siloù klevet"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Ouzhpennañ ur sil"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Lemel pep sil"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Siloù video"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Bevaat siloù video"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Rannbennadoù keflusker xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Dibarzhoù %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Dibarzhoù barek"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Dibarzhoù barek"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "PerzhKaffeine"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Enrollañ al lanvad e"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Istitl"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Kanol klevet"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 diwar %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|Restr PNG\n"
+"*.bmp|Restr BMP\n"
+"*.xbm|Restr XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Enrollañ ar skrammpaker e"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Porzh skignañ :"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Chomlec'h ar c'haser :"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Porzh :"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Fazi wine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Kemennad xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Prest"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Emaon o seniñ"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Restr istitl"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Enrollañ al lanvad e"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "&Titouroù diwar-benn ar roudenn"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Eilañ an URL er golver"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1269
+#, fuzzy
+msgid "&Send Broadcast Stream..."
+msgstr "Skignañ"
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Enrollañ ar skrammpaker ..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Enrollañ al lanvad ..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr ""
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Ehan"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Kanol klevet"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Dibabit ar c'hanol klevet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1308
+#, fuzzy
+msgid "Volume Up"
+msgstr "Tolzennad"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+#, fuzzy
+msgid "Volume Down"
+msgstr "Tolzennad"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Emgefreek"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Karrez"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Kefluniadur ar &video"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Kehidañ"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Titl"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Gwrizienn"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "K&ogn"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Perzh"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Titloù"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Pennadoù"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Kognoù"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Titouroù diwar-benn ar roudenn"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Rannbennadoù keflusker &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Tolzennad"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Lec'h"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, fuzzy, c-format
+msgid "AudioCD Track %1"
+msgstr "Roudenn %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Roudenn VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Kefluniadur ar video"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Dargemm"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Tarzhad"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "emgefreek"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Titouroù ebet."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "N'eo ket mad an anv drobarzhell oc'h eus spisaet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"N'eo ket aotret ar gevreadenn.\n"
+"Gwiriit an anv ostiz. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Bez eus ur gudenn en ur karga ul levriaoueg pe un diskoder : "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Fazi dianav : \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, fuzzy, c-format
+msgid "Using Video Driver: %1"
+msgstr "Oc'h implij ar sturier video : "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Oc'h implij ar sturier klevet : %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "O teraouiñ xine ..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Sturier klevet da implij (dre ziouer : auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Sturier video da implij (dre ziouer : auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Diskouez ar gemennadoù OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Ment ar skrid OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Nodrezh ar gemennadoù OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB : o tigeriñ ..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "O tigeriñ ..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Kodek klevet"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Kodek video"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Fazi rummel"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Mut"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "N'eo ket mut"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Emgefreek"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msec"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Kefluniadur ar c'hehidañ"
+
+#: player-parts/xine-part/equalizer.cpp:43
+#, fuzzy
+msgid "Volume gain"
+msgstr "Tolzennad"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Lemel ar sil"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Sac'het eo deraouiñ GStremear !"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "PerzhGStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Mut"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Askelenn"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Rannbennadoù keflusker &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "N'hell ket bet deaouet GStreamer !"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Rannbennadoù keflusker GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Dibarzhoù klevet"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Sturier klevet gwellañ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Dibarzhoù video"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Sturier video gwellañ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Dibarzhoù media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Trobarzhell CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr ""
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Sac'het eo kevreañ ouzh an servijer X !"
+
+#~ msgid "No player"
+#~ msgstr "Soner ebet"
+
+#~ msgid "No layer"
+#~ msgstr "Gwelead ebet"
+
+#~ msgid "Ch %1"
+#~ msgstr "Ka %1"
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "Perzh Kaffeine"
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-C"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-T"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-S"
+
+#~ msgid "No DVD Video found."
+#~ msgstr "DVD-Video kavet ebet."
+
+#~ msgid "No (S)VCD found."
+#~ msgstr "(S)VCD kavet ebet."
+
+#~ msgid "Developer"
+#~ msgstr "Diorrer"
+
+#~ msgid "DVD"
+#~ msgstr "DVD"
+
+#~ msgid "VCD"
+#~ msgstr "VCD"
+
+#~ msgid " min"
+#~ msgstr " mun"
+
+#~ msgid "Open Files"
+#~ msgstr "Restroù digor"
+
+#~ msgid "Open Directory"
+#~ msgstr "Digeriñ ar &renkell"
+
+#~ msgid "Open DVD"
+#~ msgstr "Digeriñ an DVD"
+
+#~ msgid "Open VCD"
+#~ msgstr "Digeriñ ar VCD"
+
+#~ msgid "Audio Browser"
+#~ msgstr "Furcher klevet"
+
+#~ msgid "Audio:"
+#~ msgstr "Son :"
+
+#~ msgid "Playlist Toolbar"
+#~ msgstr "Barrenn ostilhoù ar rolloù tonioù"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Dibabit ur roll tonioù"
+
+#~ msgid "&Next in Playlist/Queue"
+#~ msgstr "Hini a-&heul er roll tonioù/lostenn"
+
+#~ msgid "Pre&vious in Playlist"
+#~ msgstr "Hini dia&raok er roll tonioù"
+
+#~ msgid "Next Channel"
+#~ msgstr "Kanol a-heul"
+
+#~ msgid "Previous Channel"
+#~ msgstr "Kanol diaraok"
+
+#~ msgid "Go!"
+#~ msgstr "Mont !"
+
+#~ msgid "Kaffeine Playlist"
+#~ msgstr "Roll tonioù Kaffeine"
+
+#~ msgid "Undock"
+#~ msgstr "Anensoc'hañ"
+
+#~ msgid "Undock Playlist Window"
+#~ msgstr "Anensoc'hañ prenestr ar soner"
+
+#~ msgid "Dock"
+#~ msgstr "Ensoc'hañ"
+
+#~ msgid "Delete all"
+#~ msgstr "Distruj an holl re"
+
+#~ msgid "Filters :"
+#~ msgstr "Siloù :"
+
+#~ msgid "Found:"
+#~ msgstr "Kavet :"
+
+#~ msgid "Select a subtitle"
+#~ msgstr "Dibabit un istitl"
diff --git a/po/ca.po b/po/ca.po
new file mode 100644
index 0000000..05eb5bd
--- /dev/null
+++ b/po/ca.po
@@ -0,0 +1,3194 @@
+# translation of kaffeine.po to Catalan
+# This file is distributed under the same license as the kaffeine package.
+# Antoni Bella Pérez <bella5@teleline.es>, 2005, 2006, 2007.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-02-26 12:24+0100\n"
+"Last-Translator: Antoni Bella Pérez <bella5@teleline.es>\n"
+"Language-Team: Catalan <kde-i18n-ca@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Guia de programacions"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Refresca"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Programació de canal"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Actual/Següent"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Canal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Començament"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Durada"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Títol"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Veure tots els programes"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Afegeix a programacions"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Nom:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Canal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Començament:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Durada:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Final:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Grava com a:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "No"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Diàriament"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Setmanalment"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Mensualment"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "A mida"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Repeteix..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Editor de la programació"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Cal que li doneu un nom!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "La durada haurà de ser d'almenys 1 minut!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"El nom no haurà de contenir cap dels següents caràcters: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Opcions inicials del transpondedor"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Aquest nom no és únic."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Falta(en) pid(s) de l'àudio!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "El pid haurà de ser diferent de cero!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Heu de triar alguns dies."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Canals"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Programacions"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Guia electrònica de programació"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Opcions de DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Número"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Nom"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Canals de l'àudio"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Gravació instantània"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Difusió"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Temps de diferit"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Gravació"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Difusió"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Tria la icona..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Escull la icona de canal"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "TV digital"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "La televisió digital en directe tan sols funciona amb l'enginy xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Canal següent OSD"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Canal anterior OSD"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Treu l'OSD"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Esdeveniment següent OSD"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Esdeveniment anterior OSD"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Mostra l'OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "Guia de programació..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Programacions..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Difusions..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Canals..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Configura la DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Tot"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Ràdio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Categoria nova..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Canvia icona..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Esborra categoria..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Categoria nova"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Introduïu un nom per aquesta categoria:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Realment voleu esborrar aquesta categoria?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>No s'han pogut obtenir les dades de DVB des de "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tComproveu la vostra connexió a la internet, i digueu Sí per a "
+"tornar-ho a provar."
+"<br>\t\t\tO digueu No per a cancel·lar."
+"<br>\t\t\tSi ja disposeu d'aquest arxiu, copieu-lo a "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz i digueu Sí."
+"<br>"
+"<br>S'ha de tornar a provar ?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "La difusió ha fallat."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "No s'ha pogut iniciar la difusió."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Programació creada i iniciada amb èxit."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Primer caldrà definir algun canal!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "La programació ha estat creada amb èxit."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Encara s'està gravant."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Encara funciona la difusió."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "No s'ha pogut sintonitzar la dvb!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "No s'ha(n) pogut establir el(s) pid"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "No hi ha una CAM lliure"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine encara està gravant. Realment voleu sortir?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine té programacions a la cua. Realment voleu sortir?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Senyal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Bloqueig:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Edita..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Realment voleu esborrar tots els canals?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "INICIA la exploració"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "ATURA la exploració"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "S'està aturant..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "S'han trobat: %1 TV - %2 ràdio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "No s'ha pogut obrir la informació del socket de la DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Llista de programacions:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Nou"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Atura/Esborra"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Aquesta programació està repetida. Voleu que s'ometi la tasca actual o esborrar "
+"la programació?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Omet l'actual"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "S'ha d'esborrar la programació seleccionada?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "S'està descarregant... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "S'estan copiant els fitxers de dades..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Opcions de DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Dispositiu DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Opcions del dispositiu"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Nom:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tipus:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Cable"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Terrestre"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satèl·lit"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Desconegut"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Número de LNB:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1er satél·lit:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Opcions de LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2on satél·lit:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3er satél·lit:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4art satél·lit:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Opcions de LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Font:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Sembla que aquest dispositiu suporta la caracerística <b><i>autoscan</i></b>"
+". Podeu triar <b>AUTO</b> en la llista desplegable 'Font' per a permetre a "
+"Kaffeine cercar en un rang de freqüències."
+"<br>Si <b><i>autoscan</i></b> falla mentre cerca els canals, trieu una Font "
+"real des de la llista desplegable.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Si no podeu trobar la vostra xarxa/localització en la llista, haureu de "
+"crear-ne una. Mireu en $HOME/.kde/share/apps/kaffeine/dvb-x/ i preneu un fitxer "
+"existent com a punt de partida. Ompliu-lo amb els valors per a la vostra "
+"localització i doneu-li un nom conegut (seguint la convenció en l'anomenat). Si "
+"penseu que el vostre nou fitxer podria ser d'utilitat per a altra gent, "
+"envieu-lo a kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Opcions de gravació DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Directori de gravacions:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Directori de diferits:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Marge a l'inici:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minuts)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Marge al final:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Durada del temps de gravació:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Format preferit:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Difusió DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Adreça de difusió:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Port de difusió:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Port d'informació:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Varis"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Joc de caràcters per omissió (cal reiniciar):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Actualitza les dades d'exploració:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Descarrega"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Bolca els esdeveniments epg a \n"
+"~/kaffeine_dvb_events.tx :"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Bolca"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Connectors de DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>No s'han pogut obtenir les dades DVB des de "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tComproveu la vostra connexió a Internet, i premeu Sí per a provar-ho "
+"de nou."
+"<br>\t\t\tO digueu No per a cancel·lar."
+"<br>S'ha de provar de nou?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Directori de gravacions no vàlid."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Directori de diferits no vàlid."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Els ports de difusió i d'informació han de ser diferents."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Adreça de difusió no vàlida."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Opcions de LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "LNB universal"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "LNB banda C"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "LNB multipunt banda C"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "LO dual"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "LO simple"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Freqüència de canvi a LO dual:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Freqüència de banda baixa:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Freqüència de banda alta:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Freqüència a LO simple:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Pol. vertical freqüència LO:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Pol. horitzontal freqüència LO:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Inicialitza"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "No s'ha pogut obrir el socket de difusió de la DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "No s'ha pogut inicialitzar el socket de difusió de la DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "No s'han trobat codificadors de l'àudio."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Ha fallat la càrrega del codificador '%1'."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "No s'ha pogut crear la carpeta: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Octets"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD àudio"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Reprodueix CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Ripeja CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artista:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Àlbum:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Pista"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Seleccionar les pistes que es volen ripejar i fer clic al botó <b>Codifica</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Codifica..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Codifica CD àudio"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Reprodueix CD àudio"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Reprodueix DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Reprodueix VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Obre un &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Obre un &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Obre un &CD àudio"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Haureu de seleccionar les pistes a ripejar."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "S'han trobat diversos CD àudio. Escolliu-ne un:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "No s'ha trobat cap CD àudio."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD de vídeo"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "S'han trobat diversos DVD. Escolliu-ne un:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "S'han trobat diversos (S)VCD. Escolliu-ne un:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Sense títol"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Pista %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "S'està cercant l'entrada cddb local..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "S'està cercant l'entrada cddb remota..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "S'ha trobat l'entrada cddb exacta..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "S'ha trobat l'entrada cddb de tancament..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "Parelles CDDB"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "S'han trobat diverses entrades CDDB. Escolliu-ne una:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Un connector del codificador Lame mp3 per a Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Un connector del codificador Ogg Vorbis per a Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Client de DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "No s'ha pogut obrir la informació del socket."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "No s'ha pogut enllaçar amb la informació del socket!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "No s'ha pogut obrir el socket."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "No s'ha pogut establir l'opció del socket!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "No s'ha pogut enllaçar amb el socket!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Totes les mides"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Molt petit"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Petit"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Mitjà"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Gran"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Molt gran"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Recerca nova"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+"La coberta que heu seleccionat no està disponible. Si us plau, trieu-ne una "
+"altra."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Coberta no disponible"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Descarregador de cobertes"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+"No s'han trobat imatges coincidents, si us plau, entreu nous termes de cerca:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Entreu nous termes de cerca:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Reprodueix"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Reprodueix el següent/Afegeix a la cua"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Selecciona-ho &tot"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Crea un repertori a partir de la selecció"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Afegeix sub&títols..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Edita el títol"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Informació"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Durada"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artista"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Àlbum"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Any"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Gènere"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Subtítols"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "en ús"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Fitxers de subtítols\n"
+"*.*|Tots els fitxers"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Selecciona un fitxer de subtítols"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Tria una coberta..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galeria..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtre"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Repertori:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Selecciona el repertori actiu. Per a canviar-ne el nom, editeu-lo i confirmeu "
+"amb la tecla Intro."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Reprodueix el repertori"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Repeteix"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Reprodueix en bucle"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Barreja"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Reprodueix els ítems en un ordre aleatori"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Descarrega automàticament les cobertes"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Descàrrega automàtica de cobertes"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "Ne&teja el repertori actual"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Repertori &nou"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importa un repertori..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Desa el repertori actual com a..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Eli&mina el repertori actual"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Repertoris de Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Tots els fitxers"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Obre un repertori"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Repertoris M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Repertoris PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Desa el repertori"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Repertori"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NOU"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "S'estan important els recursos de medis..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(no hi ha subtítols)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "D'altres subtítols..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galeria"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Cua: %1 entrades, Temps de reproducció: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Entrades: %1, Temps de reproducció: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Eliminar '%1' de la llista i del disc?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Aquest nom de repertori ja existeix"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Introduïu un altre nom de repertori"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Selecciona un subtítol"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Fitxer de medis:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Selecciona la pel·lícula"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Fitxer de subtítols:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Reprodueix / Pausa"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Següent"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Mut"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Reproductor Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Reproductor Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Antoni Bella Pérez"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "bella5@teleline.es"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Un reproductor multimèdia per a KDE 3. \n"
+"Pot emprar múltiples motors per a la reproducció, \n"
+"per omissió és el xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Els autors de Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Mantenidor actual"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Autor original"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Suport per a CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Diversos pedaços de gran vàlua."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Pedaç per a navegar a través de l'OSD en la DVB."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Molts pedaços per a la DVB."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logo per al Kaffeine 0.8 i d'altra feina artística."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animació del logotip per al Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Codificació alternativa per a les meta etiquetes. Molts pedaços."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Gestió dels connectors de xine. Molts pedaços."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Importació del fitxer de subtítols."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Importació de M3U. Proves."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Editor dels PID de subtí­tols"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID de subtítols"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Ítem nou"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Mou amunt"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Mou avall"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Actualitza la selecció"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Nou"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Pàgina:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Subpàgina:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Idioma:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Programació repetida"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Editor dels PID de so"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "PID de so"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Editor de difusió"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Canals disponibles:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Llistat de difusió:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Feu-hi clic per editar/esborrar)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Nou..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Cerca a"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Desplaçament (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Comença l'exploració"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtres"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Emissió en obert"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Proveïdor:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Afegeix la selecció"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Afegeix el filtrat"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Trobat"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Fet"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Editor de canals"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nº:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaritat"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Freqüència:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Tasa símbol:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Xifrat"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID de teletext:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "ID de servei:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID de vídeo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "ID del flux de transport:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PID de subtí­tols..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "PID de so..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Ample de banda:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC alt:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Transmissió:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC baix:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Interval de vigilància:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Jerarquia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulació:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversió:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Preferències de codificació"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Codificador:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Directori base:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Deshabilita totes les comprovacions"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Mode normal"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Mode paranoia"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalitza"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Barra d'eines de CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Opcions Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Taxa de bits:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/seg."
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Opcions Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Qualitat:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Repertori"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Opcions de sortida"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Reproductor"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Habilita el &redimensionament automàtic"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Difusió per &xarxa (broadcasting)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navegació"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Menús del &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Àudio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Vídeo"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Proporcions"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Barra d'eines de instantània"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Barra d'eines de controls"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Barra d'eines de volum"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Barra d'eines de posició"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Configura Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Comportament"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Pausa el vídeo quan la finestra resti minimitzada"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Ancora a la safata del sistema"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " seg"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "desactivat"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Durada de l'anunci del títol a la safata del sistema"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Habilita el client de DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Opcions vàries"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Usa una codificació alternativa (no Unicode) per a les meta etiquetes"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Escolliu el nom de la codificació alternativa per a les meta etiquetes\n"
+"(per a convertir-les a Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Neteja la llista de fitxers recents"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Comença la reproducció immediatament"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Engega en mode de pantalla completa"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Estableix el controlador de l'àudio"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Estableix el controlador de vídeo"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Estableix la ruta cap al dispositiu CD àudio/VCD/DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Mostra els missatges de depuració de Xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Executa l'assistent d'instal·lació"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Fitxer(s) a reproduir. Pot ser un fitxer local, una URL, un directori o un "
+"dispositiu de DVD, de VCD, o de AudioCD."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Comença"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Finestra del reproductor"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Formats de multimèdia suportats"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Fitxers d'àudio MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Fitxers de vídeo MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Fitxers Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Fitxers AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Fitxers Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Fitxers Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Fitxers Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Fitxers FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Fitxers Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Fitxers WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Ha fallat la càrrega de la part '%1' del reproductor."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "No s'ha trobat %1 en la ruta de recerca."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Obre una &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Obre un d&irectori..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Surt i apaga el monitor després d'aquesta pista"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Surt després d'aquesta pista"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Surt després del repertori"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "Mode &mínim"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Canvia a &repertori/reproductor"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Manté l'aspecte &original"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Mida original"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Grandària doble"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Grandària triple"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Motor de re&producció"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Client de DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Reproductor"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Finestra principal"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "No s'ha trobat el connector DPMS de l'Xserver."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Això sortirà de Kaffeine i tallarà l'alimentació del monitor quan finalitzi la "
+"reproducció del fitxer o repertori. El vostre fitxer de configuració de X haurà "
+"de tenir l'opció \"dpms\" per apagar el monitor."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Obre fitxer(s)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Obre una URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Introduïu una URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Obre carpeta"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "No hi ha cap %1 en el lector, o ruta incorrecta cap al dispositiu."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Si us plau, seleccioneu el lector correcte:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Assistent d'instal·lació de Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Comprovació de la instal·lació"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Bé."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Part no trobada. Si us plau, comproveu la vostra instal·lació!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Trobada la versió"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine requereix KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Còdecs de Win32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"No s'ha trobat els còdecs Win32 en /usr/lib/win32. No podreu reproduir els "
+"fitxers de Windows Media 9, els fitxers Real Media més recents i alguns formats "
+"poc comuns. Descarregueu-los des d'aquí:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"No s'ha trobat libdvdcss. No podreu reproduir els DVD xifrats (la majoria dels "
+"comercials). Podeu aconseguir dita biblioteca aquí (però el seu ús pot violar "
+"les lleis del vostre país):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Lector de DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Mode DMA desactivat! Per a una reproducció suau del DVD executeu com a root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"No s'ha pogut comprovar el mode DMA. Permís denegat o no existeix el "
+"dispositiu:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Dispositiu de DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"No s'han trobat dispositius de DVB. Les funcions relacionades amb la DVB "
+"restaran ocultes."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribució"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"La xine-lib proporcionada per SuSE \"pot mancar d'algunes funcionalitats degut "
+"a requisits legals (potencial violació de patents)\". Hauríeu d'usar els "
+"paquets disponibles aquí:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "RESULTAT"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "S'han trobat problemes, però Kaffeine encara pot funcionar amb tot."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Tot correcte!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Usa Kaffeine com aplicació auxiliar per als fluxs mms:// (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Usa Kaffeine com aplicació auxiliar per als fluxs rtsp:// (Real Media i "
+"d'altres)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Crea una icona de Kaffeine a l'escriptori"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Opcions de la instal·lació"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Qualitat del desentrellaçat"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Molt poc ús de la CPU, pitjor qualitat.</b>"
+"<br>Es perd la meitat de la resolució vertical. Per alguns sistemes (com "
+"targetes de vídeo PCI) això pot reduir l'ús de la CPU en comparació amb la "
+"reproducció de vídeo simple (sense desentrellaçament)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Poc ús de la CPU, qualitat pobre.</b>"
+"<br>La imatge és desenfocada verticalment, s'eliminen els efectes de "
+"entrellaçament."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Ús mig de la CPU, qualitat mitja.</b>"
+"<br>S'analitza la imatge i s'interpolen les àrees que mostren efectes de "
+"entrellaçament."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Ús alt de la CPU, qualitat bona.</b>"
+"<br>La conversió del format de imatge de DVD millora la qualitat i arregla "
+"l'error de upsampling de la crominància."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Ús molt alt de la CPU, qualitat excel·lent.</b>"
+"<br>A més d'usar algoritmes intel·ligents de desentrellaçament, també duplica "
+"la freqüència dels fotogrames (30->60fps) per a fer-la coincidir amb la "
+"freqüència del camp de les televisions. Detecta i inverteix 3-2 pulldown. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Ús extremadament alt de la CPU, qualitat excel·lent amb millores "
+"(experimentals).</b>"
+"<br>Habilita la correcció de judder (reprodueix pel·lícules a la seva velocitat "
+"original de 24 fps) i suavitzat de color vertical (arregla les petites tires de "
+"colors que es veuen en alguns DVD). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Definida per l'usuari"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Configura el connector de desentrellaçat de tvtime..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Potser requerirà d'un nucli 2.4 apedaçat (com el de Red Hat) o del nucli "
+"2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Configura el connector de desentrellaçat de tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Connectors d'efectes"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "So"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Filtres de so"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Habilita els filtres de so"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Afegeix filtre"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Elimina tots els filtres"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Vídeo"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Filtres de vídeo"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Habilita els filtres de vídeo"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Paràmetres del motor xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Opcions de %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Opcions per a novells"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Opcions avançades"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "Part de Kaffeine"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Una part de reproducció basada en xine per a Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"La gestió de SMIL (Llenguatge d'Integració de Multimèdia Sincronitzat) és "
+"rudimentària!\n"
+"La part de Kaffeine intentarà ara reproduir les fonts de vídeo contingudes "
+"sense cap disposició. S'ha de procedir?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Desa el flux com a"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Subtítol"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Canal de so"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 de %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|Fitxer PNG\n"
+"*.bmp|Fitxer BMP\n"
+"*.xbm|Fitxer XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Desa instantània com a"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Port de difusió:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Configura la rebuda d'un flux de difusió"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Adreça del remitent:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Salta a la posició:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Error de xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Missatge de xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Llest"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "S'està reproduint"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Fitxer de subtítols"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Desa el flux com a"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Informació de la pista"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Copia la URL al portapapers"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Reprodueix en Kaffeine externament"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Envia un flux de difusió..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Reb un flux de difusió..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Desa instantània..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Desa el flux..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Desa el flux actual al disc dur. aquesta funcionalitat estava desactivada per a "
+"alguns formats (per exemple el de Real Media) per evitar potencials problemes "
+"legals."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Canvia a mode mínim"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pausa"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "Avanç &ràpid"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Avanç &lent"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Salta endavant (20 seg)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Salta enrera (20 seg)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Salta endavant (1 m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Salta enrera (1 m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Salta endavant (10 m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Salta enrera (10 m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Salta a la posició..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Menú DVD a l'esquerra"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Menú DVD a la dreta"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Menú DVD a dalt"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Menú DVD abaix"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Selecciona menú DVD"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Canal de so"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Seleccioneu un canal de so"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Visualització del so"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Apuja el volum"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Abaixa el volum"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Desentrellaça"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Activar això per als fluxs entrellaçats, alguns DVD per exemple."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namòrfic"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Quadrat"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Ampliació horitzontal"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Allunyament horitzontal"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Ampliació vertical"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Allunyament vertical"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Qualitat del desentrellaçat"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Configuració de &vídeo"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Equalitzador"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Canvia &menú"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Títol"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "A&rrel"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Subimatge"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "An&gle"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Marxa"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Títols"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Capítols"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Angles"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Informació de la pista"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Connectors d'efectes..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Paràmetres del motor &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volum"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Posició"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Clic breu: Canvia a programació Endavant/Enrera\n"
+"Clic llarg: Canvia a programació OSD"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Temps de reproducció"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "S'estan cercant les entrades de CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Pista AudioCD %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Pista VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Opcions de vídeo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Matís"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Saturació"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Contrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Brillantor"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Desplaçament del so/vídeo"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Desplaçament dels subtítols"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Advertència general: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "No hi ha informació disponible."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Advertència de seguretat: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"El servidor al que s'està intentant connectar és desconegut.\n"
+"Comproveu la validesa del nom del servidor indicat. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "El nom de dispositiu que heu indicat no sembla vàlid. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"No es pot abastar la xarxa.\n"
+"Comproveu la vostra configuració de xarxa i el nom del servidor. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "La sortida de so no està disponible. El dispositiu està ocupat. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"La connexió ha estat refusada.\n"
+"Comproveu el nom de la màquina. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "No s'ha trobat el fitxer o URL indicat. Si us plau, comproveu-ho. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "El permís per accedir a aquesta font ha estat denegat. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"No s'ha pogut llegir la font.\n"
+"Pot ser que no teniu prou permisos per accedir a aquesta, o que la font no "
+"conté dades (per exemple: no hi ha un disc al lector). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+"S'ha produït un error mentre es carregava una biblioteca o un descodificador: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "La font sembla estar xifrada, i no s'ha pogut llegir. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Probablement el vostre DVD està xifrat. Segons les lleis del vostre país, "
+"podreu o no usar libdvdcss per a llegir aquest disc. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Error desconegut: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Error: No s'ha pogut inicialitzar el nou controlador de vídeo %1 - s'usarà %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Controlador de vídeo en ús: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Error: No s'ha pogut inicialitzar el nou controlador de so %1 - s'usarà %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Controlador de so en ús: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "S'està inicialitzant xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "No s'ha pogut iniciar el motor xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Controlador de so a usar (per omissió: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Controlador de vídeo a usar (per omissió: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Usa el mesclador de so per programari"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Mostra els missatges OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Grandària del text OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Tipus de lletra dels missatges OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"No s'ha pogut inicialitzar el controlador de vídeo '%1' - s'intentarà amb "
+"'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Ha fallat la inicialització de tots els controladors de vídeo!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"No s'ha pogut inicialitzar el controlador de so '%1' - s'intentarà amb "
+"'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Ha fallat la inicialització de tots els controladors de so!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "No s'ha pogut crear un nou flux de xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: S'està obrint..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "S'està obrint..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Còdec de so"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Còdec de vídeo"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "No s'ha trobat cap connector per a gestionar aquest recurs"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "El recurs sembla estar malmès"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "El recurs requerit no existeix"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "No s'ha pogut obrir el recurs"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Error genèric"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Mut desactivat"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Mut activat"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Càmera ràpida %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Càmera lenta %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Desentrellaçat: Activat"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Desentrellaçat: Desactivat"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Relació d'aspecte"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Ampliació X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Ampliació Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "mseg"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Opcions de l'equalitzador"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Guany del volum"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Guany del volum de l'equalitzador - Si el so es torna sorollós, desactiveu-ho"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Esborra el filtre"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "S'està cercant a %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "La inicialització de GStreamer ha fallat!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "Part de GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Mut"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Comentari"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Paràmetres del motor &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "No s'ha pogut inicialitzar el GStreamer!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Falta el registre de GStreamer! Us heu oblidat d'executar <b>gst-register</b> "
+"(com a root) després de la instal.lació?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"No s'ha pogut inicialitzar el controlador de so '%1' - s'intentarà amb un "
+"altre..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "No s'ha trobat un controlador de so usable!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"No s'ha pogut inicialitzar el controlador de vídeo '%1' - s'intentarà amb un "
+"altre..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "No s'ha trobat un controlador de vídeo usable!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Paràmetres del motor GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Opcions de so"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Controlador de so preferit"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Opcions de vídeo"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Controlador de vídeo preferit"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Requereix tornar a iniciar!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Medi"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Opcions de medi"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Unitat CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Part inútil"
diff --git a/po/cs.po b/po/cs.po
new file mode 100644
index 0000000..ff59bf1
--- /dev/null
+++ b/po/cs.po
@@ -0,0 +1,3176 @@
+# translation of kaffeine.po to Czech
+# translation of kaffeine.po to
+# translation of cs.po to
+# translation of cs.po to
+# translation of cs.po to
+# translation of cs.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Klara Cihlarova <koty@seznam.cz>, 2003, 2004, 2005, 2006.
+# Petr Kopecký <petr.kopecky@sendmail.cz>, 2004.
+# Jakub Friedl <jfriedl@suse.cz>, 2005, 2006.
+# Lukáš Tinkl <lukas@kde.org>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-12-13 14:39+0100\n"
+"Last-Translator: Lukáš Tinkl <lukas@kde.org>\n"
+"Language-Team: Czech <cs@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>"
+"=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Obnovit"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Naplánováno"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Současný/následující"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanál"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Začátek"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Trvání"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Titul"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Zobrazit všechny programy"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Přidat do časovačů"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Jméno:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanál:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Začátek:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Trvání:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Konec:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Nahrát jako:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Nic"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Denně"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Týdně"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Měsíčně"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Vlastní"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Opakovat..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Editor časovače"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Musíte zadat jméno!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Trvání musí být minimálně 1 minuta!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Jméno nesmí obsahovat následující znaky: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Počáteční nastavení transpondéru"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Jméno není unikátní."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Chybějící audio pid!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Pid nesmí být nulové!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Měli byste zvolit dny."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanály"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Časovače"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronický program"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB nastavení"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Číslo"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Jméno"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Audio kanály"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Okamžité nahrávání"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Vysílání"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Posunutí času"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Nahrávání"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Vysílání"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Vybrat ikonu..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Vyberte ikonu kanálu"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digitální TV"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Živá digitální TV funguje pouze z xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Následující OSD kanál"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Předchozí OSD kanál"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD zap"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Následující OSD událost"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Předchozí OSD událost"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Ukazovat OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Časovače..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Vysílání..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanály..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Nastavit DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Vše"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Rádio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Nová kategorie..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Změnit ikonu..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Smazat kategorii..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nová kategorie"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Zadejte jméno kategorie:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Skutečně chcete smazat tuto kategorii?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Nelze získat DVB data z http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tPřekontrolujte internetové připojení a kliknutím na Ano opakujte."
+"<br>\t\t\tNebo kliknutím na Ne zrušte."
+"<br>\t\t\tPokud již archiv máte, překopírujte jej do adresáře "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz a klikněte na Ano."
+"<br>"
+"<br> Má se operace opakovat?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Vysílání selhalo."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Nelze spustit vysílání."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Časovač úspěšně vytvořen a spuštěn."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Nejdřív byste měli definovat nějaký kanál!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Časovač úspěšně vytvořen."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Probíhá nahrávání."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Probíhá vysílání."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Nelze naladit dvb!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Nelze nastavit pid"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Žádný volný CAM"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine stále nahrává. Skutečně ho chcete ukončit?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine obsahuje aktivní časovače. Skutečně ho chcete ukončit?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signál:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Uzamknutí:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Upravit..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Skutečně chcete smazat všechny kanály?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "SPUSTIT sken"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "UKONČIT sken"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Ukončuji..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Nalezeno: %1 TV - %2 rádio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Nleze otevřít DVB info soket."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Seznam časovačů:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Nový"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Stop/smazat"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Časovač se opakuje. Chcete aktuální úlohu přeskočit nebo smazat časovač?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Přeskočit aktuální"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Smazat zvolený časovač?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Stahuji... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Kopíruji datové soubory..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Nastavení DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB zařízení"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Nastavení zařízení"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Jméno:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Typ:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kabelové"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Terestrické"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satelitní"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Neznámé"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Počet LNB:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1. sat.:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Nastavení LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2. sat.:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3. sat.:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4. sat.:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB nastavení..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Zdroj:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Zdá se, že zařízení podporuje funkci <b><i>autoscan</i></b>"
+".Pokud ve zdrojovém seznamu zvolíte <b>AUTO</b>, Kaffeine spustí vyhledávání "
+"frekvencí."
+"<br>Pokud <b><i>autoscan</i></b> žádné frekvence nenalezne, zvolte zdroj ze "
+"seznamu.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Pokud nemůžete v seznamu najít svou síť nebo Umístění, můžete je "
+"vytvořit. Jako počáteční bod můžete vzít soubor z "
+"$HOME/.kde/share/apps/kaffeine/dvb-x/. Vyplňte hodnoty pro svou síť nebo "
+"umístění a zadejte název (při pojmenování se držte konvencí). Pokud se "
+"domníváte, že by se váš soubor mohl hodit také dalším uživatelům, zašlete jej "
+"na kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Volby DVB nahrávání"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Adresář s nahrávkami:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Adresář časového posunutí:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Začátek:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(min)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Konec:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Trvání nahrávání:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Preferovaný formát:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB vysílání"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Adresa vysílání:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Port vysílání:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Info port:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Různé"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Výchozí znaková sada (nutný restart):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Aktualizovat skenovaná data:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Stáhnout"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Vypsat EPG události do\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Vypsat"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB moduly"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Nelze získat DVB data z http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tPřekontrolujte internetové připojení a kliknutím na Ano opakujte."
+"<br>\t\t\tNebo kliknutím na Ne zrušte."
+"<br> Má se operace opakovat?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Chybný adresář nahrávek."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Chybný adresář časového posunutí."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Vysílací a info porty musí být rozdílné."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Chybná adresa vysílání."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB nastavení"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Universální LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Duální LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Jednoduchý LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Přepínání frekvence duálního LO:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Lo-band frekvence:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Hi-band frekvence:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Frekvence LO:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Vertikální frekvence LO:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Horizontální frekvence LO:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Obnovit"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Nleze otevřít soket DVB vysílání."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Nelze inicializovat soket DVB vysílání."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "nelze najít žádný audio enkodér."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Načítání enkodéru '%1' selhalo."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Nelze vytvořit adresář: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bajty:"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Audio CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Přehrát CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Ripovat CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Umělec:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Stopa"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Zvolte stopy, které chcete ripovat a stiskněte tlačítko <b>Enkódovat</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Enkódovat..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Kódování audio CD"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Přehrát audioCD"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Přehrát DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Přehrát VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Otevřít &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Otevřít &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Otevřít &AudioCD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Musí zvolit stopu k ripování."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Nalezeno několik audio CD. Zvolte jedno:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Nenalezeno žádné audio CD."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Nalezeno několik video DVD. Zvolte jedno:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Nalezeno několik (S)VCD. Zvolte jedno:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Žádný titul"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Stopa %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Vyhledává se lokální CDDB záznam..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Vyhledává se vzdálený CDDB záznam..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Nalezena přesná CDDB položka..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Nalezena blízká CDDB položka..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB záznamy"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Nalezeno několik blízkých CDDB záznamů. Zvolte jeden:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Modul Lame mp3 enkodéru pro Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Modul Ogg Vorbis enkodéru pro Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB klient"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Nelze otevřít info soket."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Nelze se připojit na info soket!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Nelze otevřít soket."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Nelze nastavit volby soketu!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Nelze se připojit na soket!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Všechny velikosti"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Velmi malá"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Malá"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Střední"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Velký"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Velmi velká"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nové hledání"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Obal, který jste si zvolili, není dostupný. Zvolte prosím jiný."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Obal nedostupný"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Stáhnout obálku"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Odpovídající obraz nenalezen, zadejte nová kritéria hledání:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Zadejte nový termín hledání:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Přehrát"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Přehrát následující/Přidat do fronty"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Vybrat &vše"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Vytvořit seznam skladeb z vybraného"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Přidat &titulky"
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Upravit titul"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Info"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Délka"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Umělec"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Rok"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Žánr"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Titulky"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "používá se"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Soubory s titulky\n"
+"*.*|Všechny soubory"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Vybrat soubor s titulky"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Zvolit obálku..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galerie..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtr"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Seznam skladeb:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Vybrat aktivní seznam skladeb. Pro změnu názvu seznamu skladeb stačí stávající "
+"název upravit a potvrdit změny stiskem 'Enter'."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Přehrát seznam skladeb"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Opakovat"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Přehrávat dokola seznam skladeb"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Pro&míchat"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Přehrávat v náhodném pořadí"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Automaticky stahovat obaly"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Automatické stahování obalů"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "V&yčistit aktuální seznam skladeb"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "No&vý seznam skladeb"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importovat seznam skladeb"
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Uložit seznam skladeb jako..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "&Odstranit seznam skladeb"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Seznamy skladeb Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Všechny soubory"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Otevřít seznam skladeb"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Seznamy skladeb M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS seznam skladeb"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Uložit seznam skladeb"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Seznam skladeb"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NOVÝ"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Import zdrojů médií..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(žádné titulky)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Jiné titulky..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galerie"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Fronta: %1 položek, Celkový čas: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Položek: %1, Celkový čas: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Odstranit '%1' ze seznamu i z disku?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Seznam skladeb již existuje"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Zadejte jiné jméno seznamu skladeb:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Vybrat titulky"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Soubor:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Vybrat film"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Soubor s titulky:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Přehrát / Pauza"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Další"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "U&mlčet"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine přehrávač"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Přehrávač Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Klára Cihlářová,Petr Kopecký"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "koty@seznam.cz,kejpi@centrum.cz"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Přehrávač médií pro KDE 3. Může používat více backendů pro přehrávání, výchozí "
+"(a doporučený) je xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Autoři Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Současný správce"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Původní autor"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Podpora CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Několik hodnotných oprav."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Oprava procházení DVB OSD."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Opravy DVB kategorií."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logo přehrávače Kaffeine 0.8 a další grafika."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animované logo Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Alternativní kódování pro meta tagy. Mnoho záplat."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "xine post plugin handling. Mnoho záplat."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Import souboru s titulky."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U import. Testování."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Editor PID titulků"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID titulky"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Nová položka"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Nahoru"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Dolů"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Zvolený update"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Nový"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Stránka:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Podstránka:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Jazyk:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Opakující se časovač"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Editor audio PID"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Audio PID"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Editor vysílání"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Dostupné kanály:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Seznam vysílání:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(klik pravým tlačítkem upravit/smazat)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Nový..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Hledat v"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Offset (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Zahájit skenování"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtry"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Volně do éteru"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Poskytovatel:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Přídat vybrané"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Přidat filtrované"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Nalezeno"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Hotovo"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Editor kanálů"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Č:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polarita"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frekvence:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Symbol rate:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Zakódováno"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID teletextu:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "ID služby:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID videa:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "ID přenosového proudu:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Pid titulků..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Audio PID..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Šířka pásma:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "Horní FEC:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Přenos:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "Spodní FEC:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Střední interval:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarchie:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulace:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inverze:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Nastavené enkódování"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Enkodér:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Základní adresář:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Zakázat všechny kontroly"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Normální režim"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoia režim"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalizovat"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Nástrojová lišta CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Volby Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Datový tok:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Volby Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Kvalita:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Seznam skladeb"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Možnosti ukončení"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Přehrávač"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Automatická změna &velikosti"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Síťové vysílání"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigace"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD menu"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Audio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Poměr stran"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Lišta sejmutí snímku"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Ovládání přehrávače"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Hlasitost"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Pozice"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Nastavení Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Chování"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Při minimalizování okna pozastavit video"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Přidat do systémového panelu"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sekund"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "vypnuto"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Zobrazit titul v systémovém panelu"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Povolit DVB klienta"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Různé volby"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Použít alternativní (ne unicode) kódování pro meta tagy"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Vybrat alternativní kódování pro meta tagy\n"
+"(pro převod do unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Smazat seznam nedávných souborů"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Spustit přehrávání okamžitě"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Spustit v celoobrazovkovém režimu"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Nastavit audio ovladač"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Nastavit video ovladač"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Nastavit cestu k AudioCD/VCD/DVD zařízení."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Výstup ladicích informací xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Spustit průvodce instalací"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Soubor(y) pro přehrání - lokální soubor, URL, adresář nebo 'DVD', 'VCD', "
+"'AudioCD'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Spustit"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Okno přehrávače"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Podporované formáty"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Zvukové soubory MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Video soubory MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Soubory Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Soubory AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Soubory Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Soubory Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Soubory Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Soubory FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Soubory Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Soubory WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Načítání přehrávače '%1' selhalo."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 nenalezen ve vyhledávací cestě."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Otevřít &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Otevřít ad&resář..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Ukončit a vypnout monitor po této stopě"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Ukončit po této stopě"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Ukončit po seznamu skladeb"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimalizovaný režim"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Přepnout &seznam skladeb/přehrávač"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Zach&ovat původní poměr stran"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Původní velikost"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Dvojnásobná velikost"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Trojnásobná velikost"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Přehrávací engine"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB klient"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Přehrávač"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Hlavní okno"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS rozšíření X serveru nenalezeno."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Tato volba ukončí Kaffeine a vypne monitor po přehrátí souboru/seznamu skladeb. "
+"Pro vypnutí monitoru musí být v konfiguračním souboru pro X server povolena "
+"volba \"dpms\"."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Otevřít soubor(y)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Otevřít URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Zadej URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Otevřít adresář"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "%1 není v mechanice nebo špatná cesta k zařízení."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Prosím, vyberte správnou mechaniku:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Průvodce instalací Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Kontrola instalace"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ok."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Součást nenalezena. Prosím zkontrolujte vaší instalaci!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Nalezena verze"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine vyžaduje KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 kodeky"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"WIN32 kodeky nebyly nalezeny v /usr/lib/win32. Není možné přehrávat soubory ve "
+"formátu Windows Media 9, novější soubory formátu Real Media a některé méně "
+"obvyklé formáty. Kodeky můžete stáhnout zde:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"Knihovna libdvdcss nenalezena. Není možné přehrávat zakódovaná (většina "
+"komerčních) DVD. Knihovnu je možné stáhnout zde (ovšem její používání může ve "
+"vaší zemi narušovat autorská práva!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD mechanika"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "DMA mód je vypnutý! Pro plynulé přehrávání DVD spusťte jako root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Nelze zkontrolovat DMA mód. Přístup odmítnut nebo neexistující zařízení:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB zařízení"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "Nebylo nalezeno DVB zařízení. Funkce DVB budou skryty."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribuce"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"V xine-lib dodávané SuSE \"můžou chybět některé vlastnosti kvůli možnému "
+"porušení patentů\". Použijte balíčky z: "
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "VÝSLEDEK"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Byly nalezeny některé problémy, ale přesto by Kaffeine mělo fungovat."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Vše v pořádku!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Používat Kaffeine jako pomocnou aplikaci pro mms:// (Microsoft Media) proudy"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Používat Kaffeine jako pomocnou aplikaci pro rtsp:// (Real Media a další) "
+"proudy"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Přidat ikonu Kaffeine na plochu"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Možnosti instalace"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Kvalita prokladače"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Velmi nízké zatížení procesoru, nejhorší kvalita.</b>"
+"<br>Polovina vertikálního rozlišení je ztracena. V některých systémech (s PCI "
+"grafikými kartami) může toto nastavení snížit zatížení procesoru ve srovnání s "
+"přehrávaním bez prokladače (plain video)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Nízké zatížení procesoru, slabá kvalita.</b>"
+"<br>Obraz je vertikálně rozostřen takže jsou odstraněny efekty prokládání."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Střední zatížení procesoru, slabá kvalita.</b>"
+"<br>Obraz je analyzován a oblasti s viditelnými artefakty prokládání jsou "
+"opraveny (interpolovány)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Vysoké zatížení procesoru, dobrá kvalita.</b>"
+"<br>Konverze DVD obrazového formátu zlepšuje kvalitu a opravuje chybu barevného "
+"převzorkování."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Velmi vysoké zatížení procesoru, výborná kvalita.</b>"
+"<br>Vedle použití chytrých prokládacích algoritmů je použita také dvojnásobná "
+"snímková frekvence. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Velmi velmi vysoké zatížení procesoru, výborná kvalita s (experimentálními) "
+"vylepšeními.</b>"
+"<br>Umožňuje korekci chvění obrazu (přehrávání filmů v originální rychlosti "
+"24fps) a vertikální vyhlazení barev (opravuje malé barevné proužky viditelné u "
+"některých DVD). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Uživatelsky definovaný"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Konfigurovat prokládací plugin z tvtime"
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Může vyžadovat patchovaný kernel 2.4 (jako v RedHat) nebo kernel 2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Konfigurovat prokládací plugin z tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Efektové pluginy"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Audio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Audio filtry"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Povolit audio filtry"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Přidat filtr"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Odstranit všechny filtry"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Video filtry"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Povolit video filtry"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Parametry xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Možnosti %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Začátečnická nastavení"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Rozšířené nastavení (expert)"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "Xine komponenta"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Přehrávací součást pro Kaffeine postavená na xine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Podpora pro SMIL (Synchronized Multimedia Integration Language) je "
+"nedostatečná!\n"
+"Kaffeine může nyní zkusit přehrát obsažené video zdroje bez jakéhokoli "
+"uspořádání. Pokračovat?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Uložit proud jako"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Titulky"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Audio kanál"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 z %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-soubor\n"
+"*.bmp|BMP-soubor\n"
+"*.xbm|XBM-soubor"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "&Uložit snímek jako"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Port vysílání:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Nastavení příjmu proudu"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Adresa odesílatele:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Skočit na pozici:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Chyba xine:"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Zpráva xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Připraven"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Přehrávám"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Soubor s titulky"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Uložit proud jako"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Informace o stopě"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Kopírovat URL do schránky"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Přehrát v Kaffeine externě"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Odeslat proud..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Přijmout proud..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Uložit snímek..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Uložit proud..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Uloží současný stream na disk. Tato vlastnost byla pro některé formáty zakázána "
+"(např. Real Media) kvůli možným právním problémům."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Přepnout minimální režim"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pauza"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Vpřed"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Zpomalený &pohyb"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Přeskočit dopředu (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Přeskočit dozadu (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Vpřed (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Zpět (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Vpřed (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Zpět (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Skočit na pozici..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD menu doleva"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD menu doprava"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD menu nahoru"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD menu dolů"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD menu vybrat"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Audio kanál"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Vybrat audio kanál"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Audio &vizualizace"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Zesílit"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Ztlumit"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Prokladač"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Aktivujte pro prokládané proudy, např některá DVD."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorfní"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Čtvercový"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Přiblížit horizontálně"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Oddálit horizontálně"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Přiblížit vertikálně"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Oddálit vertikálně"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Kvalita prokladače"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Video nastavení"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Ekvalizér"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Zobrazit/skrýt DVD menu"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Titul"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Root"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Obraz v obraze"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "Ú&hel pohledu"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Část"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Tituly"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Kapitoly"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Úhly"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Informace o stopě"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Efektové &pluginy..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Parametry &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Hlasitost"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Pozice"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Kratké stisknutí: Přepnout mód zobrazení času\n"
+"Dlouhé stisknutí: Zap./Vyp. OSD zobrazení času"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Čas přehrávání"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Vyhledávání CDDB položek..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Stopa audio CD %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Stopa VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Video nastavení"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Zabarvení"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Saturace"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Jas"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Audio/Video offset"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Offset titulků"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Obecné varování:\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Nejsou dostupné žádné informace."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Bezpečnostní varování: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Počítače, ke kterému se chcete připojit, je neznámý.\n"
+"Překontrolujte platnost názvu."
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Zadané jméno zařízení je pravděpodobně neplatné."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Síť je pravdpodobně nedostupná.\n"
+"překontrolujte nastavení sítě a nameserveru."
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Není k dispozici audio výstup. Zařízení je zaneprázdněno. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Spojení bylo odmítnuto.\n"
+"Překontrolujte jméno počítače."
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Zadané URL nebo soubor nebyly nalezeny. Překontrolujte."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Přístup k tomuto zdroji byl odepřen."
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Ze zdroje nelze číst.\n"
+"Pravděpodobně nemáte dostatečná práva nebo zdroj neobsahuje žádná data (např. v "
+"mechanice není disk)."
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Došlo k problému během načítání knihovny nebo dekodéru:"
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Zdroj je pravděpodobně šifrovaný a nelze ho číst. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Vaše DVD je pravděpodobně šifrované. V závislosti na zákonech vaší země je "
+"možné použít k přečtení libdvdcss."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Neznámá chyba: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Chyba: Nelze spustit nový video ovladač %1 - používám %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Použitý video ovladač: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Chyba: Nelze spustit nový audio ovladač %1 - používám %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Použitý audio ovladač: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Inicializace xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Nelze spustit xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Audio ovladač (výchozí: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Video ovladač (výchozí: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Použít softwarový audio mixer"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Ukazovat OSD zprávy"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Velikost OSD textu"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Písmo OSD zpráv"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Nelze spustit video ovladač '%1' - zkouším 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Selhala inicializace všech video ovladačů!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Nelze spustit audio ovladač '%1' - zkouším 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Selhala inicializace všech audio ovladačů!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Nelze vytvořit nový xine proud!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: otevírám..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Otevírám..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Audio kodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Video kodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Pro zpracování zdroje nebyl nalezen žádný plugin"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Zdroj je pravděpodobně poškozen"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Požadovaný zdroj neexistuje"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Zdroj nelze otevřít"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Generická chyba"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Povolit zvuk"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Umlčet"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Vpřed %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Zpomalený pohyb %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Prokladání: zapnuto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Prokládání: vypnuto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Poměr stran"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Přiblížit X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Přiblížit Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "milisekund"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Nastavení ekvalizéru"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Zesílení hlasitosti"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "Přírůstek hlasitosti ekvalizéru. - Pokud bude hlasitost nízká, zakažte"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Smazat filtr"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Vyhledat %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Inicializace GStreameru selhala!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Umlčet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Komentář"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parametry &GStreameru"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer nelze inicializovat!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Chybí GStreamer-registry! Nezapomněli jste po instalaci jako uživatel root "
+"spustit příkaz <b>gst-register</b>?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Nelze inicializovat audio ovladač '%1' - zkouším jiný..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Nebyl nalezen použitelný audio ovladač!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Nelze spustit video ovladač '%1' - zkouším jiný..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Nebyl nalezen použitelnmý video ovladač!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parametry GStreameru"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Audio volby"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Preferovaný audio ovladač"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Volby videa"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Preferovaný video ovladač"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Vyžadován restart!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Média"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Volby média"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD mechanika"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
diff --git a/po/da.po b/po/da.po
new file mode 100644
index 0000000..9dc1931
--- /dev/null
+++ b/po/da.po
@@ -0,0 +1,3233 @@
+# Danish translation of kaffeine
+#
+# Erik Kjær Pedersen <erik@binghamton.edu>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-11-16 08:06-0500\n"
+"Last-Translator: Erik Kjær Pedersen <erik@binghamton.edu>\n"
+"Language-Team: Danish <dansk@klid.dk>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Elektronisk programguide"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Genopfrisk"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Skemalagt"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Nuværende/næste"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Begynd"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Varighed"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Titel"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Vis alle programmer"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Tilføj til tidsmålere"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Navn:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Start:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Varighed:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Slutning:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Spil ind som:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Ingen"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Daglig"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Ugentlig"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Månedlig"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Brugerdefineret"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Gentag..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Tidseditor"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Du skal give det et navn."
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Varigheden skal være mindst 1 minut."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Navnet må ikke indeholde nogen af følgende tegn: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Initiale transponderindstillinger"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Dette navn er ikke entydigt."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Mangler lyd-pid."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Pid skal være forskellig fra nul."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Du skal vælge nogle dage."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanaler"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Tidsmålere"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronisk programguide"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "Skærmvisning"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Digital-tv-indstillinger"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Nummer"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Navn"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Lydkanaler"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Umiddelbar indspilning"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Udsend"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Tidsforskydning"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Optager"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Broadcasting"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Vælg ikon..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Vælg kanalikon"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digital-tv"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Direkte udsendt digital-tv virker kun med Xine-grænsefladen."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD Næste kanal"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD Forrige kanal"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Zap"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD Næste begivenhed"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD Forrige begivenhed"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Vis OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "Elektronisk programguide..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Indspilningstider..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Udsendelse..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanaler..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Indstil digital-tv..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Alle"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Ny kategori..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Ændr ikon..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Slet kategori..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nyt kategori"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Indtast et navn på kategorien:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Vil du virkelig slette denne kategori?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Kan ikke hente digital-tv-ata fra "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t\t\tKontrollér din Internet-forbindelse, og klik på Ja for at forsøge "
+"igen."
+"<br>\t\t\tEller klik på Nej for at annullere."
+"<br>\t\t\tHvis du allerede har dette arkiv, så kopiér det til "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz og klikke på Ja."
+"<br>"
+"<br>Skal et nyt forsøg gøres?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Udsendelse mislykkedes."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Kan ikke starte udsendelse."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Indspilningstid oprettedes og startedes med godt resultat."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Du vil måske først definere en kanal."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Indspilningstid oprettedes med godt resultat."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Indspiller stadigvæk."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Udsender stadigvæk."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Kan ikke indstille digital-tv."
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Kan ikke indstille pid."
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Ingen CAM ledig"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine indspiller stadigvæk. Vil du virkelig afslutte?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine har indspilningstider i kø. Vil du virkelig afslutte?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "Signal-støjforhold:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Lås:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Redigér..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Vil du virkelig slette alle kanaler?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Start skanning"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Stop skanning"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Standser..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Fandt: %1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Kan ikke åbne informationssokkel for digital-tv."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Tidliste:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Ny"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Stop/Slet"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Indspilningstiden gentages. Vil du springe over nuværende job eller slette "
+"indspilningstiden?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Spring over nuværende"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Fjern markeret indspilningstid?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Henter..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Kopierer datafiler..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB-indstillinger"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Digital-tv-enhed"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Enhedsindstillinger"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Navn:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Type:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kabel"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Jordbunden"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satelit"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Ukendt"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Antal lavstøjblokke:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1. sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB-indstillinger..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2. sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3. sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4. sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Lavstøjblokindstillinger..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Kilde:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Denne enhed synes at understøtte funktionen <b><i>automatisk søgning</i></b>"
+". Du kan vælge <b>Automatisk</b> i listen med kilder for at lade Kaffeine søge "
+"i et frekvensområde."
+"<br>Hvis det mislykkes med<b><i>automatisk søgning</i></b> "
+"at finde dine kanaler, vælg så en egentlig kilde i listen.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Hvis du ikke kan finde dit netværk eller dit sted i listen, skal du "
+"oprette dem. Kig i $HOME/.kde/share/apps/kaffeine/dvb-x/ og brug en "
+"eksisterende fil som eksempel. Udfyld den med værdier for dit netværk eller dit "
+"sted og giv den et rimeligt navn (følg navngivningskonventionen). Hvis du tror "
+"at den nye fil kan være nyttig for andre, så send den til "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB-optagelsestilvalg"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Indspilningsmappe:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Tidsforskydningsmappe:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Startmargin:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minutter)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Slutmargin:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Umiddelbar indspilningsvarighed:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Foretrukket format:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB-Broadcasting"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Udsendelsesadresse:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Udsendelsesport:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Informationsport:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Diverse"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Standardtegnsæt (genstart kræves):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Opdatér skannedata:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Download"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Gem begivenheder fra elektronisk programguide i\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Dump"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Plugin for digital-tvklient"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Kan ikke hente digital-tv-data fra "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz. "
+"<br>\t\t\tKontrollér din Internet-forbindelse, og klik på Ja for at forsøge "
+"igen."
+"<br>\t\t\tEller klik på Nej for at annullere."
+"<br>Skal et nyt forsøg gøres?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Ugyldig indspilningsmappe."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Ugyldig tidsforskydningsmappe."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Udsendelses- og informationsporte skal være forskellige."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Ugyldig udsendelsesadresse."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB-indstillinger"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Universel lavstøjblok"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Dual LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Enkel LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V lav"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Dual LO omslagsfrekvens:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Lavbåndsfrekvens:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Højbåndsfrekvens:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Enkel LO frekvens:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Lodret polariseret lav frekvens:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Vandret polariseret lav frekvens:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Nulstil"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Kan ikke åbne udsendelsessokkel for digital-tv."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Kan ikke initiere udsendelsessokkel for digital-tv."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Ingen lydindkoder fundet."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Indlæsning af indkoderen '%1' mislykkedes."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Kan ikke oprette mappe: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Byte"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Lyd-cd"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Afspil CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Rip cd"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Kunstner:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Spor"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "Vælg sporene du vil rippe og klik på knappen <b>Indkod</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Indkod..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Kodning af lyd-cd"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Afspil lyd-cd"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Afspil dvd"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Afspil VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Åbn &dvd"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Åbn &vcd"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Åbn &lydcd"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Du skal vælge spor at rippe."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Flere lyd-cd'er fundet. Vælg en:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Ingen lydcd fundet."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "Dvd video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Flere video-dvd'er fundet. Vælg en:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "Vcd-svcd"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Flere (s)vcd'er fundet. Vælg en:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Ingen titel"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Spor %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Søger efter lokal CDDB-indgang..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Søger efter CDDB-indgang via nettet..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Fandt CDDB-indgang som matcher nøjagtigt..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Fandt nærvedliggende CDDB-indgang..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB træffere"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Flere nærliggende CDDB-indgange fundet. Vælg en:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "Kaffeine MP3 Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Et Lame MP3 kodnings-plugin for Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "Kaffeine Ogg Vorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Et Ogg Vorbis-baseret indkodnings-plugin for Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Digital-tv-klient"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Kan ikke åbne informationssokkel."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Kan ikke binde til informationssokkel."
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Kan ikke åbne sokkel."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Kan ikke indstille tilvalg for sokkel."
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Kan ikke binde til sokkel."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Alle størrelser"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Meget lille"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Lille"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Medie"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Stor"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Meget stor"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Ny søgning"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Omslaget du har valgt er ikke tilgængeligt. Vælg et andet."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Omslag ikke tilgængeligt"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Omslags-download"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Ingen passende billeder fundet. Indtast nye søgeudtryk:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Indtast nye søgeudtryk:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Afspil"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Spil næste/Tilføj til kø"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Vælg &alle"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Opret spilleliste ud fra markeret"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Tilføj &undertekster..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "Redigér &titel"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Information"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Længde"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Kunstner"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "År"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Genre"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Undertekster"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "allerede i brug"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Undertekstfiler\n"
+"*.*|Alle filer"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Vælg undertekstfil"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Vælg et omslag..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galleri..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filter"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Spilleliste:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Markér den aktive spilleliste. For at ændre spillelistens navn redigeres det og "
+"bekræftes med returtasten."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Spil spilleliste"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Gentag"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Spilleliste i løkke"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Bland"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Spil spor i tilfældig rækkefølge"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Hent automatisk omslag hjem"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Automatisk download af omslag"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Ryd nuværende spilleliste"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Ny spilleliste"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importér spilleliste..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Gem nuværende spilleliste som..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "&Fjern nuværende spilleliste"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine-spillelister"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Alle filer"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Vis spilleliste"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U-spillelister"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS-spillelister"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Gem spilleliste"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Spilleliste"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "Ny"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importerer medieressourcer..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(ingen undertekster)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Anden undertekst..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galleri"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Kø: %1 Indgange, Spilletid: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Spor: %1, Spilletid: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Fjern '%1' fra både liste og disk?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Spillelistens navn findes allerede"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Indtast et andet navn på spillelisten:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Vælg undertekst"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Mediefil:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Vælg &film"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Undertekstfil:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Spil/Hold pause"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Næste"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Uden lyd"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine mediespillere"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine mediespillere]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Erik Kjær Pedersen"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "erik@binghamton.edu"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"En mediespiller for KDE 3. Kan bruge flere grænseflader til afspilning, "
+"standard (og anbefalet) er Xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "© 2003-2005, Kaffeines forfattere"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Nuværende vedligeholder"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Oprindelig forfatter"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Støtte for CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Diverse værdifulde programrettelser."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Programrettelse for skærmvisningsbrowser i digital-tv."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Programrettelse for kategorier i digital-tv."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logo for Kaffeine 0.8 og anden grafik."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animering af logotype for Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Alternativt tegnsæt for metamærker. Mange programrettelser."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+"Håndtering af Xines plugin for efterbehandling. Mange programrettelser."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Import af undertekstfiler."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U-import. Testning."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "PID-editor af undertekster"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Undertekst-PID'er"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Nyt punkt"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Flyt op"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Flyt ned"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Opdatér markerede"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Ny"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Side:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Delside:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Sprog:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Gentaget indspilningstid"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Redigering af pid'er"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Lyd-PID'er"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Broadcasting-editor"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Tilgængelige kanaler:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Udsendelsesliste:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Høreklik for at redigere/slette)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Ny..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Søg på"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Forskydning (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Start skanning"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtre"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Fri til at sende"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Leverandør:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Tilføj markerede"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Tilføj filtreret"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Fundet"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "Signal-støjforhold:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Færdig"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&Digital-tv"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Kanaleditor"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaritet"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frekvens:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Symboltakt:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Krypteret"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Tekst-tv pid:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Tjeneste-id:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Video-PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Transportstrøm-id:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Undertekst-PID'er..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Lyd-pid'er..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Båndbredde:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC Høj:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Transmission:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC lav:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Vagtinterval:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarki:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulation:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversion:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Indkodningsindstillinger"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Indkoder:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Basismappe:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Deaktivér al kontrol"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Normal tilstand"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoia-tilstand"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalisér"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Værktøjslinje for cd"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame MP3-indstillinger"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "Variabel bitrate"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bitrate:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis-indstillinger"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Kvalitet:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Spille&liste"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Afslutningstilvalg"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Afspiller"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Brug automatisk rettelse af billedstør&relse"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Netværksudsendelse"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigering"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&Dvd"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&Dvd-menuer"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Lyd"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Billedproportion"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Værktøjslinje for skærmaftryk"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Værktøjslinje for kontroller"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Værktøjslinje for lydstyrke"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Værktøjslinje for position"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine-indstilling"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Opførsel"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Pause i video når vinduet minimeres"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Indlejr i statusfeltet"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sek"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "fra"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Varighed af titelannoncering i statusfeltet"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Aktivér digital-tv-klient"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Diverse indstillinger"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Brug alternativt (ikke Unicode) tegnsæt for metamærker."
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Vælg alternativt tegnsæt for metamærker\n"
+"(for at konvertere til Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Tøm listen for nylige filer"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Start afspilning med det samme"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Start i fuldskærmstilstand"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Indstil lyddriver"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Indstil videodriver"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Indstil søgesti til lydcd-, vcd-, dvd-enheden."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Vis Xine fejlsøgningsmeddelelser"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Kør installationsguiden"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Filer at spille. Kan være en lokal fil, en url, en mappe eller 'DVD', 'VCD', "
+"'AudioCD'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Start"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Afspillervindue"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Medieformater som understøttes"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG-lydfiler"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG-videofiler"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis-filer"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Avi-filer"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime-filer"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media-filer"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska-filer"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC-filer"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media-filer"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV-filer"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Indlæsning af spillerens program-part '%1' mislykkedes."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 ikke fundet i søgestien."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Åbn &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Åbn &mappe..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Afslut og luk af for billedskærmen efter dette spor"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Afslut efter dette spor"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Afslut efter spilleliste"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimal tilstand"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Slå s&pilleliste/spillere til og fra"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Behold &originalproportion"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Oprindelig størrelse"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Dobbelt størrelse"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Tredobbelt størrelse"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "S&pillergrænseflade"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Digital-tv-klient"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Spiller"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Hovedvindue"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS Xserver-udvidelse ikke fundet."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Dette vil afslutte Kaffeine og lukke af strømmen til billedskærmen efter at "
+"filen/spillelisten har spillet færdig. Tilvalget \"dpms\" skal være i din "
+"X-servers indstillingsfil for at skærmen skal blive lukket af."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Åbne filer"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Åbn URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Indtast en URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Åbn mappe"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Ingen %1 i enheden, eller forkert søgesti til enhed."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Vær venlig at vælge korrekt enhed:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 installationsguide"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Installationskontrol"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "O.k."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Part ikke fundet. Tjek venligst din installation."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Fandt version"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine kræver KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32-afkoder"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Ingen WIN32-afkoder fundet i /usr/lib/win32. Du vil ikke kunne spille Windows "
+"Media 9 filer, nyere Real Media filer og en del mindre kendte formater. Hent "
+"afkoderne hjem her:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss ikke fundet. Du vil ikke kunne spille krypterede (de fleste "
+"kommercielle) dvd'er. Du kan hente biblioteket her (men brug af det er måske "
+"ikke foreneligt med ophavsretslovene i dit land):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Dvd-enhed"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "DMA-tilstand fra. For jævn dvd-afspilning kør som systemadministrator:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Kan ikke kontrollere DMA-tilstand. Adgang nægtet eller ingen sådan enhed:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Digital-tv-enhed"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Ingen digital-tv-enheder fundet. Digital-tv-relaterede funktioner skjules."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribution"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"xine-lib som SuSE leverer \"kan mangle visse funktioner af legale grunde "
+"(muligt brud på patent)\". Du bør bruge pakken herfra:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "Resultat"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Fandt en del problemer, men trods det virker Kaffeine."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Alt o.k!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "Brug Kaffeine som hjælpeprogram for mms:// (Microsoft Media) strømme"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Brug Kaffeine som hjælpeprogram for rtsp:// (Real Media og andre) strømme "
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Opret en ikon for Kaffeine på desktoppen"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Installationstilvalg"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Kvalitet for fjernelse af interlacing"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Meget lav processorbrug, dårligste kvalitet.</b>"
+"<br>Det halve af den lodrette opløsning går tabt. For visse systemer (med PCI "
+"videokort) så kan dette mindske processorbrugen sammenlignet med almindelig "
+"videoafspilning (ingen fjernelse af interlacing)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Lav processorbrug, dårlig kvalitet.</b>"
+"<br>Billedet diffuseres lodret så interlace-effekter fjernes."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Middel processorbrug, middelkvalitet.</b>"
+"<br>Billedet analyseres og områderne som udviser interlacing-fejl rettes til "
+"(interpoleres)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Høj processorbrug, god kvalitet.</b>"
+"<br>Konvertering af dvd-billedformat øger kvaliteten og retter til fejl ved "
+"\"opsampling\" af krominans."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Meget høj processorbrug, meget god kvalitet.</b>"
+"<br>Udover brug af smarte algoritmer ved fjernelse af interlace så fordobles "
+"billedratefrekvensen (30->60 billeder pr sekund) til at matche feltfrekvensen "
+"på et TV. Detekterer af og nulstiller 3-2 nedtrækning. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Meget meget høj processorbrug, meget god kvalitet med (eksperimentelle) "
+"forbedringer.</b>"
+"<br>Aktiverer korrigering af skridninger (spiller film med deres oprindelige "
+"hastighed 24 billeder pr sekund) og lodret farveudjævning (retter små "
+"farvestreger til som kan ses på visse dvd'er). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Brugerdefineret"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Indstil tvtime-plugin for fjernelse af interlace..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Kan kræve en patchet 2.4 kerne (såsom en fra RedHat) eller 2.6 kerne.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Indstil tvtime-plugin for fjernelse af interlace"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Effektplugin"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Lyd"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Lydfilter"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Brug lydfilter"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Tilføj filter"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Fjern alle filter"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Videofilter"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Aktivér videofiltre"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Xine-grænsefladens parametre"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1-tilvalg"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Nybegyndertilvalg"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Eksperttilvalg"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "Xine-part"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "En Xine-baseret spillerprogram-part for Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Støtten for SMIL (Synchronized Multimedia Integration Language) er rudimentær.\n"
+"Xine-partprogrammet kan nu forsøge at spille indholdet i videokilden uden nogen "
+"layout. Fortsæt?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Gem strøm som"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Undertekst"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Lydkanal"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 af %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-fil\n"
+"*.bmp|BMP-fil\n"
+"*.xbm|XBM-fil"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Gem skærmaftryk som"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Broadcasting-port"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Indstil modtagelse af udsendelsesstrøm"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Senderadresse:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Gå til position:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Fejl i Xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Meddelelse fra Xine:"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Parat"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Spiller"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Undertekstfil"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Gem strøm som..."
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Sporinformation"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Kopiér URL til klippebord"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Spil med Kaffeine eksternt"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Send strøm ud..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Tag imod udsendt strøm..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Gem skærmaftryk..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Gem strøm..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Gemmer nuværende mediastrøm til harddisken. Denne mulighed er deaktiveret for "
+"visse formater (f.eks. Real Media) for at undgå potentielle legale problemer."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Slå minimal tilstand til og fra"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pause"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Spol hurtigt fremad"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Slow &motion"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Gå fremad (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Gå tilbage (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Gå fremad (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Gå tilbage (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Gå fremad (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Gå tilbage (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Gå til position..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Dvd-menu venstre"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Dvd-menu højre"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Dvd-menu op"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Dvd-menu ned"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Dvd-menu vælg"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Lydkanal"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Vælg lydkanal"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Visualisering af lyd"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Lydstyrke op"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Lydstyrke ned"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Fjern interlace"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Aktivér dette for interlacede strømme, for eksempel visse dvd'er."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorf"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Firkantet"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Zoom in vandret"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Zoom ud vandret"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Zoom ind lodret"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Zoom ud lodret"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Kvalitet af fjernelse af interlace"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Videoindstillinger"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Equalizer"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Skifte&menu"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Titel"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Root"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Delbillede"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Vinkel"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Part"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Titler"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Kapitler"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Vinkler"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Spor&information"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Effektplugin&program..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&Xine-grænsefladens parametre"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Lydstyrke"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Position"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Kort klik: Flyt indspilningstid fremad/tilbage\n"
+"Langt klik: Vis eller skjul skærmmeddelelse for indspilningstid"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Spilletid"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Leder efter CDDB-indgange..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Lyd-cd spor %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Vcd-spor %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Video-opsætning"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Farvetone"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Mætning"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Lysstyrke"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Lyd- og videoforskydning"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Undertekstforskydning"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "automatisk"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Generel advarsel: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Ingen information tilgængelig."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Sikkerhedsadvarsel: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Værten du forsøger at kontakte er ukendt.\n"
+"Kontrollér at det specificerede værtnavn er korrekt."
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Enhedsnavnet du angav synes at være ugyldigt."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Netværket ser ikke ud til at være tilgængeligt.\n"
+"Kontrollér dine netværksindstillinger og serverens navn. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Lyd er ikke tilgængelig. Enheden er optaget. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Forbindelse nægtedes.\n"
+"Kontrollér værtnavnet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"Den specificerede fil eller url ikke fundet. Var venlig at kontrollere den."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Adgang til denne kilde nægtedes. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Kilden kan ikke læses.\n"
+"Måske har du ikke tilstrækkelige rettigheder til dette, eller også indeholder "
+"kilden ingen data (dvs. ingen disk i enheden). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "En fejl opstod ved indlæsning af bibliotek eller afkoder: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Kilden ser ud at være krypteret og kan ikke læses. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Din dvd er formodentlig krypteret. Afhængig af lovene i dit land så kan det "
+"måske være muligt at bruge libdvdcss for at læse denne disk. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Ukendt fejl: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Fejl: Kan ikke initiere ny videodriver %1 - bruger %2."
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Bruger videodriver: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Fejl: Kan ikke initiere ny lyddriver %1 - bruger %2."
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Bruger lyddriver: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Initierer Xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Kan ikke initiere Xine-grænsefladen."
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Lyddriver at bruge (standard: automatisk)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Videodriver at bruge (standard: automatisk)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Brug software-mikser til lyd"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Vis skærmmeddelelser"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Størrelse på skærmmeddelelsestekst"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Skrifttype for skærmmeddelelser"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Kan ikke initiere videodriver '%1' - forsøger med 'automatisk'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Alle videodrivere mislykkedes at initiere."
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Kan ikke initiere lyddriver '%1' - forsøger med 'automatisk'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Alle lyddrivere mislykkedes at initiere."
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Kan ikke oprette en ny Xine-strøm."
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "Digital-tv: åbner..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Åbner..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Lyd-codec"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Video-codec"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Fandt intet plugin som kan håndtere denne ressource"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Ressourcen synes at være fejlagtig"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Efterspurgt ressource eksisterer ikke"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Ressourcen kan ikke åbnes"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Generel fejl"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Stum slået fra"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Stum slået til"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Spol hurtigt fremad %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Slow motion %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Fjernelse af interlace: til"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Fjernelse af interlace: fra"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Aspekt-ratio"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Zoom X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Zoom Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msek"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Equalizerindstillinger"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Lydstyrke gain"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Lydstyrkeøgning for Equalizer - Hvis lyden blir støjende så slå dette fra"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Slet filter"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Søger til %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Initiering af Gstreamer mislykkedes."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "Gstreamer-part-program"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Uden lyd"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Kommentar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "&Gstreamer-grænsefladens parametre"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "Gstreamer kunne ikke initieres."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Mangler Gstreamer-registret. Glemte du at køre <b>gst-register</b> "
+"(som systemadministrator) efter installationen?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Kan ikke initiere lyddriveren '%1' - forsøger med en anden..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Ingen brugbar lyddriver fundet."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Kan ikke initiere videodriveren '%1' - forsøger med en anden..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Ingen brugbar videodriver fundet."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Gstreamer-grænsefladens parametre"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Lydtilvalg"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Lyddriver som foretrækkes"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Videotilvalg"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Videodriver som foretrækkes"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Genstart krævet."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Medie"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Medietilvalg"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Cd-, vcd-, dvd-enhed"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Tomt part-program"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Disse kanaler findes allerede og er ikke tilføjet:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Mislykkedes at forbinde til X-serveren."
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "Lukkes hovedvinduet fortsætter Kaffeine med at køre i statusfeltet. Brug Afslut i menuen Fil hvis du vil afslutte programmet."
+
+#~ msgid "No player"
+#~ msgstr "Ingen spiller"
+
+#~ msgid "No layer"
+#~ msgstr "Intet lag"
+
+#~ msgid "Ch %1"
+#~ msgstr "Kap. %1"
+
+#~ msgid "Alternate Layout"
+#~ msgstr "Alternativt layout"
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "Kaffeine-part-program"
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-C"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-T"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-S"
+
+#~ msgid "No DVD Video found."
+#~ msgstr "Ingen video-dvd fundet."
+
+#~ msgid "No (S)VCD found."
+#~ msgstr "Ingen (s)vcd fundet."
+
+#~ msgid "AudioCD - DVD - VCD"
+#~ msgstr "Lydcd -dvd -vcd"
+
+#~ msgid "DVD"
+#~ msgstr "Dvd"
+
+#~ msgid "VCD"
+#~ msgstr "Vcd"
+
+#~ msgid "Developer"
+#~ msgstr "Udvikler"
+
+#~ msgid "DVB Support"
+#~ msgstr "Støtte for digital-tv"
+
+#~ msgid " min"
+#~ msgstr " min"
+
+#~ msgid ""
+#~ "Interval to fake keypresses\n"
+#~ "(prevent screensaver from activating)"
+#~ msgstr ""
+#~ "Interval for falsk tastetryk\n"
+#~ "(forhindrar pauseskærmen i at starte) "
diff --git a/po/de.po b/po/de.po
new file mode 100644
index 0000000..1b37715
--- /dev/null
+++ b/po/de.po
@@ -0,0 +1,3209 @@
+# translation of kaffeine.po to German
+# translation of kaffeine.po to
+# translation of de.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Jürgen Kofler <kaffeine@gmx.net>, 2003,2004, 2005.
+# Jürgen Kofler <juergen.kofler@chello.at>, 2004, 2005.
+# Jürgen Kofler <kaffeine@gmx.at>, 2005.
+# Thomas Ohms <t.ohms@freenet.de>, 2006, 2007.
+# Thomas Reitelbach <tr@erdfunkstelle.de>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-03-27 13:53+0200\n"
+"Last-Translator: Thomas Ohms <t.ohms@freenet.de>\n"
+"Language-Team: German <kde-i18n-de@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPF"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Aktualisieren"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Geplant"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Aktuelles/Nächstes"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Anfang"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Dauer"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Titel"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Alle Programme betrachten"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Zu Aufnahmezeiten hinzufügen"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Name:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Anfang:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Dauer:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Ende:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Aufnehmen als:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Nichts"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Täglich"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Wöchentlich"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Monatlich"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Benutzerdefiniert"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Wiederholen ..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Aufnahmezeiten-Editor"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Es muss ein Name angegeben werden!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Die Dauer muss mindestens eine Minute betragen!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Der Name darf keines der folgenden Zeichen enthalten: ><\\/:\"|"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Beginnende Transponder-Einstellungen"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Diese Bezeichnung ist nicht eindeutig."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Audio-PID(s) fehlen!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "PID darf nicht gleich Null sein!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Es müssen einige Tage ausgewählt werden."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanäle"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Aufnahmezeiten"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronischer Programmführer"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB-Einstellungen"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Nummer"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Name"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Audiokanäle"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Sofortaufnahme"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Übertragen"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Zeitversetzung"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Aufnahme"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Netzwerkübertragung"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Symbol auswählen ..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Symbol für Kanal auswählen"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digitales Fernsehen"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr ""
+"Die Übertragung für Digitales Fernsehen funktioniert nur mit xine-Treibern."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD Nächster Kanal"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD Vorheriger Kanal"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Durchschalten"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD Nächstes Ereignis"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD Vorheriges Ereignis"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "OSD anzeigen"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPF ..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Aufnahmezeiten ..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Übertragung ..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanäle ..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "DVB einrichten ..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Alles"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "Fernsehen"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Neue Kategorie ..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Symbol ändern ..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Kategorie löschen ..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Neue Kategorie"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Name für die Kategorie eingeben:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Soll diese Kategorie wirklich gelöscht werden?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Es können keine DVB-Daten von http://hftom.free.fr/kaxtv/dvbdata.tar.gz "
+"bezogen werden! "
+"<br>\t\t\tBitte Internet-Verbindung überprüfen und \"Ja\" wählen, um es erneut "
+"zu versuchen."
+"<br>\t\t\tOder \"Nein\" wählen, um abzubrechen."
+"<br>\t\t\t Ist dieses Archiv bereits heruntergeladen, muss es in das "
+"Verzeichnis ~/.kde/share/apps/kaffeine/dvbdata.tar.gz kopiert und mit \"Ja\" "
+"bestätigt werden."
+"<br>"
+"<br>Erneut versuchen?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Übertragung fehlgeschlagen."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Übertragung kann nicht gestartet werden."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Aufnahmezeit erfolgreich erstellt und gestartet."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Es sollten zuerst einige Kanäle bestimmt werden!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Aufnahmezeit erfolgreich erstellt."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Aufnahme läuft."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Übertragung läuft."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "DVB kann nicht eingestellt werden!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "PID(s) können nicht gesetzt werden"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Keine Kamera frei"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine zeichnet gerade auf. Soll wirklich beendet werden?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Es sind vorprogrammierte Aufnahmezeiten vorhanden. Soll wirklich beendet "
+"werden?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Gesperrt:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Bearbeiten ..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Sollen alle Kanäle gelöscht werden?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Suchlauf BEGINNEN"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Suchlauf ANHALTEN"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Wird angehalten ..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Gefunden : %1 TV - %2 Radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "DVB-Info-Socket kann nicht geöffnet werden."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Liste der Aufnahmezeiten:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Neu"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Anhalten/Löschen"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Diese Aufnahmezeit wird wiederholt. Soll der derzeitige Auftrag übersprungen "
+"oder die Aufnahmezeit gelöscht werden?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Derzeitigen überspringen"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Markierte Aufnahmezeit löschen?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Wird heruntergeladen... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Dateien werden kopiert ..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB-Einstellungen"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB-Gerät"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Geräte-Einstellungen"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Name:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Ausführung:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kabel"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Terrestrisch"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satellit"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Anzahl der LNBs:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1. Satellit:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB-Einstellungen ..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2. Satellit:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3. Satellit:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4. Satellit:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB-Einstellungen ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Quelle:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Dieses Gerät scheint den <b><i>automatischen Suchlauf</i></b> "
+"zu unterstützen. Es kann <b>AUTOMATISCH</b> in der Liste der Quellen ausgewählt "
+"werden, um Kaffeine nach einem Frequenzbereich suchen zu lassen. "
+"<br>Falls der <b><i>automatische Suchlauf</i></b> fehlschlägt, muss eine echte "
+"Quelle aus der Liste ausgewählt werden.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Es muss ein Netzwerk/Speicherort erstellt werden, falls in der Liste "
+"nichts gefunden werden kann. Unter $HOME/.kde/share/apps/kaffeine/dvb-x/ kann "
+"eine vorhandene Datei als Startpunkt genommen werden. Danach müssen die Werte "
+"für Netzwerk/Speicherort und ein sinnvoller Namen (der Namenskonvention "
+"folgend) angegeben werden. Sollten Sie der Meinung sein, dass Ihre neue Datei "
+"nützlich für Andere sein könnte, senden Sie diese an "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB-Aufnahme-Optionen"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Aufnahmen-Verzeichnis:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Verzeichnis der Zeitversetzung:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Startmarkierung:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(Minuten)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Endmarkierung:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Sofortaufnahme Dauer:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Bevorzugtes Format:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB-Übertragung"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Adresse:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Port der Übertragung:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Info-Port:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Sonstiges"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Standard-Schriftsatz (benötigt Neustart):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Suchergebnisse aktualisieren:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Herunterladen"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Speichere Auszüge der EPF-Ereignisse nach \n"
+"~/kaffeine_dvb_events.tx :"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Speicherauszug"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB-Plugins"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Es konnten keine Dateien von http://hftom.free.fr/kaxtv/dvbdata.tar.gz "
+"bezogen werden! "
+"<br>\t\t\t Bitte Internet-Verbindung überprüfen und Ja wählen, um es erneut zu "
+"versuchen."
+"<br>\t\t\tOder Nein wählen, um abzubrechen"
+"<br>Erneut versuchen?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Ungültiges Aufnahme-Verzeichnis."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Verzeichnis für die Zeitversetzung ist ungültig."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Übertragungs- und Info-Port müssen unterschiedlich sein."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Ungültige Adresse."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB-Einstellungen"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Universal LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Mehrfach-LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Dual LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Einzel LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Dual LO Wechsel-Frequenz:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Niedrige Bandbreiten-Frequenz:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Hohe Bandbreiten-Frequenz:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Single LO-Frequenz:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Vertikal pol. LO-Frequenz:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Horizontale pol. LO-Frequenz:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Zurücksetzen"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "DVB-Übertragungs-Socket kann nicht geöffnet werden."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "DVB-Übertragungs-Socket kann nicht initialisiert werden."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Keine Audiokodierer gefunden."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Laden des Kodierers '%1' fehlgeschlagen."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Ordner konnte nicht erstellt werden: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bytes"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Audio-CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "CD abspielen"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "CD kopieren"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Künstler:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Stück"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Bitte die Stücke auswählen, die kopiert werden sollen und den <b>Kodieren</b>"
+"-Knopf betätigen."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Kodieren ..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Audio-CD kodieren"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Audio-CD abspielen"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "DVD abspielen"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "VCD abspielen"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "&DVD öffnen"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "&VCD öffnen"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "&Audio-CD öffnen"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Bitte die Stücke auswählen, die kopiert werden sollen."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Es wurden mehrere Audio-CDs gefunden. Bitte eine auswählen:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Keine Audio-CD gefunden."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD-Video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Mehrere DVD-Videos gefunden. Bitte eines auswählen:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Mehrere (S)VCDs gefunden. Bitte eine auswählen:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Kein Titel"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Stück %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Lokaler CDDB-Eintrag wird gesucht ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Entfernter CDDB-Eintrag wird gesucht ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Genauer Treffer in einem CDDB-Eintrag gefunden ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Ähnlichen CDDB-Eintrag gefunden ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB Treffer"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr ""
+"Es wurden mehrere Einträge in der CDDB gefunden. Bitte einen auswählen:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "Kaffeine-Mp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Ein Lame mp3 Kodierungsmodul für Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Ein Ogg Vorbis Kodierungsmodul für Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB-Client"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Info-Socket kann nicht geöffnet werden."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Bindung zum Info-Socket kann nicht hergestellt werden!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Socket kann nicht geöffnet werden."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Socket-Option kann nicht gesetzt werden!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Bindung zum Socket kann nicht hergestellt werden!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Alle Größen"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Sehr klein"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Klein"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Mittel"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Groß"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Sehr groß"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Neue Suche"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+"Das ausgewählte Deckblatt ist nicht verfügbar. Bitte ein anderes auswählen."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Deckblatt nicht verfügbar"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Deckblatt herunterladen"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Keine passenden Bilder gefunden. Bitte neue Suchkriterien eingeben:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Neue Suchkriterien eingeben:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Abspielen"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Als nächstes abspielen/Zur Warteschlange hinzufügen"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "&Alles auswählen"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Wiedergabeliste mit Ausgewählten erstellen"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Unter&titel hinzufügen ..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "Titel b&earbeiten"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Info"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Länge"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "Adresse"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Künstler"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Jahr"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Genre"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Untertitel"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "wird benutzt"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Untertitel Dateien\n"
+"*.*|Alle Dateien"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Untertitel auswählen"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Deckblatt auswählen ..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galerie ..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filter"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Wiedergabeliste:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Aktive Wiedergabeliste wählen. Um den Namen der Wiedergabeliste zu ändern, muss "
+"dieser bearbeitet und mit der 'Eingabetaste' bestätigt werden."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Wiedergabeliste abspielen"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "Wiede&rholen"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Wiedergabeliste in Schleife abspielen"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Z&ufällig"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Einträge in zufälliger Reihenfolge spielen"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Cover automatisch herunterladen"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Automatisches Herunterladen von Cover-Bildern"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "Derzeitige Wiedergabeliste &leeren"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Neue &Wiedergabeliste"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "Wiedergabeliste &importieren ..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "Derzeitige Wiedergabeliste speichern &unter ..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Derzeitige Wiedergabeliste ent&fernen"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine Wiedergabelisten"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Alle Dateien"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Wiedergabeliste öffnen"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U Wiedergabelisten"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS Wiedergabelisten"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Wiedergabeliste speichern"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Wiedergabeliste"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NEU"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Medienquellen importieren ..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(keine Untertitel)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Anderer Untertitel ..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galerie"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Warteschlange: %1 Einträge, Spielzeit: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Einträge: %1, Spielzeit: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "'%1' aus Liste und von der Festplatte entfernen?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Der Name dieser Wiedergabeliste existiert bereits"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Bitte einen anderen Namen für die Wiedergabeliste eingeben:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Untertitel auswählen"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Mediendatei:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Film auswählen"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Untertitel-Datei:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Abspielen / Pause"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Weiter"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "Stu&mm"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Thomas Ohms"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "t.ohms@freenet.de"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Ein Medienabspieler für KDE 3. Kann verschiedene Schnittstellen zum Abspielen "
+"benutzen.\n"
+"Grundsätzlich wird xine verwendet."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Die Kaffeine Autoren"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Aktueller Bearbeiter"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Ursprünglicher Autor"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM-Unterstützung."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Verschiedene Patches."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Patch zum Durchsuchen via DVB-OSD."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Patch für DVB-Kategorien."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logo für Kaffeine 0.8 und weitere Illustrationen."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Logo-Animation für Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Alternative Kodierung für Meta-Tags. Viele Patches."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Vorbehandlung für xine-Modul. Viele Patches."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Untertitel importieren."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U-Import. Testweise."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Untertitel-PIDs Editor"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Untertitel-PIDs"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Neues Element"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Nach oben verschieben"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Nach unten verschieben"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Markierte aktualisieren"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Neu"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Seite:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Unterseite:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Sprache:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Wiederholte Aufnahmezeit "
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Audio-PID(s) Editor"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Audio-PIDs"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Übertragungseditor"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Verfügbare Kanäle:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Übertragungsliste:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Rechts-Klick um zu bearbeiten/löschen)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Neu ..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Suche auf"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Versatz (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Suche starten"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filter"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Freie Programme"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Anbieter:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Ausgewählte hinzufügen"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Gefilterte hinzufügen"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Gefunden"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Fertig"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Kanaleditor"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polarität"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frequenz:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Schrittgeschwindigkeit:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Verschlüsselt"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Teletext-PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Service-ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Video-PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Transport-ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Untertitel-PIDs ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Audio-PIDs ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Bandbreite:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC Hoch:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Übertragung:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC Niedrig:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Schutzintervall:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarchie:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Aussteuerung:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Umkehrung:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Kodierung Eigenschaften"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Kodierer:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Hauptverzeichnis:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Alles Ausgewählte abschalten"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Normaler Modus"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoia Modus"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalisieren"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame mp3 Optionen"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bitrate:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis Optionen"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Qualität:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Wiedergabe&liste"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Abschaltoptionen"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "Abs&pielgerät"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Automatische G&rößenanpassung aktivieren"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Netzwerkübertragung"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigation"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD Menüs"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Audio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Seitenverhältnis"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Bildschirmfoto"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Steuerungen"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Lautstärke"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Position"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine einrichten"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Verhalten"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Video bei minimiertem Fenster anhalten"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "In Kontrollleiste einbetten"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " Sek"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "aus"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Dauer der Titelanzeige in Kontrollleiste"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "DVB-Client aktivieren"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Sonstige Optionen"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Alternative (nicht Unicode) Kodierung für Meta-Tags verwenden"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Alternative Kodierung für Meta-Tags auswählen\n"
+"(um sie in Unicode umzuwandeln)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Liste der zuletzt geöffneten Dateien leeren"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Sofort abspielen"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Im Vollbildmodus starten"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Audiotreiber einstellen"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Videotreiber einstellen"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Pfad zur Audio-CD/VCD/DVD setzen."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Ausgabe der xine-Speicherauszüge"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Installationshelfer starten"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Datei(en) zum abspielen. Lokale Datei, eine Adresse, ein Verzeichnis oder "
+"'DVD', 'VCD', 'Audio-CD' sind möglich."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Start"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Wiedergabe-Fenster"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Unterstützte Medienformate"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG Audio Dateien"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG Video Dateien"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis Dateien"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI Dateien"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime Dateien"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media Dateien"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska Dateien"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC Dateien"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media Dateien"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV Dateien"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Laden des Abspielgerätes '%1' fehlgeschlagen."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 nicht im Suchpfad gefunden."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "&Adresse öffnen ..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Verze&ichnis öffnen ..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Beenden und Monitor ausschalten nach diesem Stück"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Beenden nach diesem Stück"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Beenden wenn Wiedergabeliste abgespielt"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimaler Modus"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Zwischen Wiedergabeliste/Abs&pielgerät umschalten"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "&Ursprüngliches Seitenverhältnis beibehalten"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Orginalgröße"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Doppelte Größe"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Dreifache Größe"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Abs&pielgerät"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB-Client"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Abspielgerät"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Hauptfenster"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS XServer-Erweiterung wurde nicht gefunden."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Kaffeine wird nach diesem Stück/dieser Wiedergabeliste beendet und der Monitor "
+"ausgeschaltet. Die Option \"dpms\" muss in der X-Config Datei sein um den "
+"Monitor ausschalten zu können."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Datei(en) öffnen"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Adresse öffnen"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Bitte Adresse eingeben:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Ordner öffnen"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Keine %1 im Laufwerk, oder falsch gesetzter Pfad zum Gerät."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Bitte das richtige Laufwerk auswählen:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 Installationshelfer"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Installationsprüfung"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "OK."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Modul nicht gefunden. Bitte die Installation prüfen!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Gefundene Version"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine benötigt KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 Codecs"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Keine WIN32 Codecs gefunden in /usr/lib/win32. Es können keine Windows Media 9 "
+"Dateien, neuere Real Media Dateien und einige weniger gebräuchlichere Formate "
+"abgespielt werden. Die Codecs können hier heruntergeladen werden:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss nicht gefunden. Es können keine verschlüsselten (die meisten "
+"kommerziellen) DVD's abgespielt werden. Die Bibliothek gibt es hier (aber ihre "
+"Benutzung könnte geltende Copyright-Bestimmungen Ihres Landes verletzen):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD-Laufwerk"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"DMA Modus deaktiviert! Für flüssige DVD Wiedergabe muss folgendes als \"root\" "
+"eingegeben werden:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Kann DMA Modus nicht prüfen. Zugriff verweigert oder kein solches Gerät:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-Gerät"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Keine DVB-Geräte gefunden. Alle DVB-bezogene Funktionalität wird ausgeblendet."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribution"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"Die xine-lib die von SuSE mitgeliefert wird lässt einige Fähigkeiten nicht zu "
+"(wegen möglicher Patentverletzungen). Es sollten die Pakete von hier benutzt "
+"werden:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "ERGEBNIS"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Einige Probleme gefunden, aber Kaffeine dürfte trotzdem funktionieren."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Alles in Ordnung!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Kaffeine als Helfer-Applikation für mms:// (Microsoft Media) Streams benutzen"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Kaffeine als Helfer-Applikation für rtsp:// (Real Media und andere) Streams "
+"benutzen"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Ein Kaffeine-Symbol auf der Arbeitsfläche erzeugen"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Installationsoptionen"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Deinterlace Qualität"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Sehr, sehr geringe CPU Last, schlechteste Qualität.</b>"
+"<br>Die Hälfte der vertikalen Auflösung geht verloren. Für einige Systeme (mit "
+"PCI-Videokarten) kann das zu einer Verringerung der CPU-Last im Vergleich zur "
+"Wiedergabe ohne Deinterlacing führen."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Geringe CPU-Last, geringe Qualität.</b>"
+"<br>Interlacing Effekte werden behoben durch vertikales Verwischen des Bildes."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Mittlere CPU-Last, mittlere Qualität.</b>"
+"<br>Das Bild wird analysiert und Interlacing-Artefakte werden behoben "
+"(interpoliert)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Hohe CPU-Last, gute Qualität.</b>"
+"<br>Die Konvertierung des DVD Bildformats verbessert die Qualität und behebt "
+"einen Fehler in der Farbreinheit."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Sehr hohe CPU-Last, hervorragende Qualität.</b>"
+"<br>Benutzt hochwertige Deinterlacing-Algorithmen und verdoppelt die Bildrate "
+"(30->60 Bilder/Sekunde) um die Frequenz von TV Geräten zu treffen. Erkennt 3:2 "
+"Raten und macht diese rückgängig. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Sehr sehr hohe CPU Last, hervorragende Qualität mit (experimentellen) "
+"Verbesserungen.</b>"
+"<br>Aktiviert die Korrektur der Abspielgeschwindigkeit (spielt Filme mit "
+"originalen 24 Bildern/Sekunde) und vertikale Farbglättung (behebt kleine "
+"Farbstreifen, die bei einigen DVDs auftreten). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Benutzerdefiniert"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "tvtime Deinterlace-Modul konfigurieren ..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Benötigt möglicherweise einen gepatchten 2.4 Kernel (wie den von RedHat) "
+"oder Kernel 2.6.x</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "tvtime Deinterlace-Modul konfigurieren"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Effektmodule"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Audio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Audiofilter"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Audiofilter aktivieren"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Filter hinzufügen"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Alle Filter entfernen"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Videofilter"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Videofilter aktivieren"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "xine-Parameter"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 Optionen"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Anfänger Optionen"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Experten Optionen"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "Xine-Komponente"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Ein auf xine basierender Spieler für Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL (Synchronized Multimedia Integration Language) wird nur ansatzweise "
+"unterstützt.\n"
+"Die Xine-Komponente kann nun versuchen, die enthaltenen Videoquellen ohne "
+"Gestaltung wiederzugeben. Fortfahren?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Datenstrom speichern unter"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Untertitel"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Audiokanal"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 von %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-Datei\n"
+"*.bmp|BMP-Datei\n"
+"*.xbm|XBM-Datei"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Bildschirmfoto speichern unter"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Port der Übertragung:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Netzwerk-Empfang konfigurieren"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Senderadresse:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Zu Position springen:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine- Fehler"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine-Meldung"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Bereit"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Wiedergabe"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Untertitel Datei"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Datenstrom speichern unter"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Stück-Info"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Adresse in die Zwischenablage kopieren"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Außerhalb von Kaffeine abspielen"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "Übertragungsstrom &senden ..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "Übert&ragungsstrom empfangen ..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "Bildschirmfoto &speichern ..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Datenstrom speichern ..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Speichert den aktuellen Datenstrom auf die Festplatte. Diese Funktion wurde für "
+"einige Formate (z.b. Real Media) deaktiviert um rechtliche Probleme zu "
+"vermeiden."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Minimal-Modus umschalten"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pause"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "Schneller Vorlau&f"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "&Zeitlupe"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Vorspulen (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Zurückspulen (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Vorspulen (1min)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Zurückspulen (1min)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Vorspulen (10min)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Zurückspulen (10min)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Gehe zu Position ..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD-Menü links"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD-Menü rechts"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD-Menü aufwärts"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD-Menü abwärts"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD-Menü auswählen"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Audiokanal"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Audiokanal auswählen"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Audio-&Visualisierung"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Lautstärke erhöhen"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Lautstärke verringern"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Deinterlace"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+"Aktiviere diesen Punkt für Interlaced-Datenströme (einige DVD's zum Beispiel)."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Automatisch"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorph (16:9)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "Quadrati&sch (1:1)"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Horizontal vergrößern"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Horizontal verkleinern"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Vertikal vergrößern"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Vertikal verkleinern"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Deinterlace &Qualität"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Videoeinstellungen"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Equalizer"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Menü umschalten"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Titel"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Hauptmenü"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Unterbild"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Winkel"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "T&eil"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Titel"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Kapitel"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Winkel"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Stück-&Info"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Effekt&module ..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&xine-Parameter"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Lautstärke"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Position"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Kurzer Klick: Zähler Vorwärts/Rückwärts\n"
+"Langer Klick: Zähler OSD Ein/Aus"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Spielzeit"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Suche nach CDDB Einträgen ..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Audio-CD Stück %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD Titel %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Videoeinstellungen"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Farbe"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Sättigung"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Helligkeit"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Audio/Video Versatz"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Untertitel Versatz"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "automatisch"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Allgemeine Warnung: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Keine Informationen verfügbar."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Sicherheitswarnung: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Der Host ist unbekannt.\n"
+"Bitte den Namen/Adresse prüfen. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Das angegebene Gerät scheint ungültig zu sein. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Das Netzwerk scheint nicht erreichbar zu sein.\n"
+"Bitte Netzwerk-Einstellungen und den Server-Namen prüfen. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Audio-Ausgang nicht verfügbar. Gerät ist belegt. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Verbindung fehlgeschlagen.\n"
+"Bitte Host-Namen prüfen. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"Der angegebene Dateiname oder die Adresse wurde nicht gefunden. Bitte prüfen. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Zugriff auf die Quelle wurde verweigert. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Die Quelle kann nicht gelesen werden.\n"
+"Entweder haben Sie nicht genügend Rechte, oder die Quelle enthält keine Daten "
+"(z.B.: keine CD im Laufwerk) "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+"Es trat ein Problem beim Laden einer Bibliothek oder eines Dekodierers auf: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr ""
+"Die Quelle scheint verschlüsselt zu sein und kann nicht gelesen werden. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Die DVD ist wahrscheinlich verschlüsselt. Entsprechend den Gesetzen Ihres "
+"Landes kann libdvdcss installiert werden um sie abzuspielen oder nicht. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Unbekannter Fehler: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Fehler: Neuer Videotreiber %1 kann nicht eingerichtet werden -%2 wird benutzt!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Benutze Videotreiber: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Fehler: Audiotreiber %1 kann nicht eingerichtet werden - %2 wird benutzt!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Benutze Audiotreiber: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "xine wird eingerichtet ..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "xine kann nicht eingerichtet werden!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Zu benutzender Audiotreiber (Standard: automatisch)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Zu benutzender Videotreiber (Standard: automatisch)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Software-Audiomischgerät benutzen"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "OSD Meldungen anzeigen"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Größe des OSD-Textes"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Schriftart für OSD-Meldungen"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"Videotreiber '%1' kann nicht eingerichtet werden - 'automatisch' wird versucht "
+"..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Einrichtung aller Videotreiber fehlgeschlagen!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"Audiotreiber '%1' kann nicht eingerichtet werden - 'automatisch' wird versucht "
+"..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Einrichtung aller Audiotreiber fehlgeschlagen!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Neuer xine-Datenstrom kann nicht erzeugt werden!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: öffnen ..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Öffnen ..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Audiocodec"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Videocodec"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Kein Modul gefunden um diese Quelle zu handhaben"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Quelle scheint fehlerhaft zu sein"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Angefragte Quelle existiert nicht"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Quelle kann nicht geöffnet werden"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Allgemeiner Fehler"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Stumm aus"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Stumm an"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Schneller Vorlauf %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Zeitlupe %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Deinterlace: ein"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Deinterlace: aus"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Seitenverhältnis"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Automatisch"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Zoom X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Zoom Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msek"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Equalizer Einstellungen"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Tonverstärkung"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Verstärkung für den Equalizer - Sollte deaktiviert werden falls Störgeräusche "
+"hörbar sind"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Filter entfernen"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Suchen nach %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "GStreamer Einrichtung fehlgeschlagen!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Stumm"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Kommentar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "&GStreamer-Parameter"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer konnte nicht eingerichtet werden!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"GStreamer-Eintrag nicht gefunden! Haben Sie vergessen <b>gst-register</b>"
+"(als \"root\") nach der Installation auszuführen?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"Audiotreiber '%1' kann nicht eingerichtet werden - ein weiterer wird versucht "
+"..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Kein brauchbarer Audiotreiber gefunden!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"Videotreiber '%1' kann nicht eingerichtet werden - ein weiterer wird versucht "
+"..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Kein brauchbarer Videotreiber gefunden!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "GStreamer-Parameter"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Audio Optionen"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Bevorzugter Audiotreiber"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Video Optionen"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Bevorzugter Videotreiber"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Neustart erforderlich!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Medien"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Medien Optionen"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD Laufwerk"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
diff --git a/po/el.po b/po/el.po
new file mode 100644
index 0000000..525af81
--- /dev/null
+++ b/po/el.po
@@ -0,0 +1,3196 @@
+# translation of kaffeine.po to Greek
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Konstantinos Georgokitsos <kgeorgokitsos@nomioan.gr>, 2003, 2004.
+# Spiros Georgaras <sng@hellug.gr>, 2005, 2006, 2007.
+# Toussis Manolis <manolis@koppermind.homelinux.org>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-03-23 22:47+0200\n"
+"Last-Translator: Spiros Georgaras <sng@hellug.gr>\n"
+"Language-Team: Greek <i18ngr@lists.hellug.gr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Ανανέωση"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Προγραμματισμένο"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Τρέχον/επόμενο"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Κανάλι"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Έναρξη"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Διάρκεια"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Τίτλος"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Εμφάνιση όλων των προγραμμάτων"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Προσθήκη στα χρονόμετρα"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Όνομα:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Κανάλι:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Έναρξη:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Διάρκεια:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Τέλος:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Εγγραφή ως:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Κανένα"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Καθημερινά"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Εβδομαδιαία"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Μηνιαία"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Προσαρμοσμένο"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Επανάληψη..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Επεξεργαστής χρονομέτρου"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Πρέπει να δοθεί ένα όνομα!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Η διάρκεια πρέπει να είναι τουλάχιστον 1 λεπτό!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"Το όνομα δεν πρέπει να περιέχει κάποιον από τους ακόλουθους χαρακτήρες: > "
+"< \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Αρχικές ρυθμίσεις μεταδότη"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Αυτό το όνομα δεν είναι μοναδικό."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Λείπουν pid(s) ήχου!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Το Pid πρέπει να είναι μη μηδενικό!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Πρέπει να επιλέξετε κάποιες μέρες."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Κανάλια"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Χρονόμετρα"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Οδηγός ηλεκτρονικού προγράμματος"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Ρυθμίσεις DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Αριθμός"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Όνομα"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Κανάλι ήχου"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Στιγμιαία εγγραφή"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Εκπομπή"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Χρονική υστέρηση"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Εγγραφή"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Εκπομπή"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Επιλογή εικονιδίου..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Επιλογή εικονιδίου καναλιού"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Ψηφιακή τηλεόραση"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Η ζωντανή ψηφιακή τηλεόραση λειτουργεί μόνο με τη μηχανή xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD επόμενο κανάλι"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD προηγούμενο κανάλι"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD εναλλαγή"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD επόμενο γεγονός"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD προηγούμενο γεγονός"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Εμφάνιση OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Χρονόμετρα..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Εκπομπή..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Κανάλια..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Ρύθμιση DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Όλα"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Ραδιόφωνο"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Νέα κατηγορία..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Αλλαγή εικονιδίου..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Διαγραφή κατηγορίας..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Νέα κατηγορία"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Εισάγετε ένα όνομα γι' αυτή την κατηγορία:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Επιθυμείτε πραγματικά τη διαγραφή της κατηγορίας;"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Αδυναμία ανάκτησης δεδομένων DVB από "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tΕλέγξτε τη σύνδεσή σας με το διαδίκτυο, και επιλέξτε Ναι για "
+"προσπάθεια ξανά."
+"<br>\t\t\tΉ επιλέξτε Όχι για ακύρωση."
+"<br>\t\t\tΑν ήδη έχετε αυτή την αρχειοθήκη, αντιγράψτε την στο "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz και επιλέξτε Ναι."
+"<br>"
+"<br>Να γίνει προσπάθεια ξανά;</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Η εκπομπή απέτυχε."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Αδύνατη η έναρξη εκπομπής."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Το χρονόμετρο δημιουργήθηκε επιτυχώς και εκίνησε."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Ίσως να επιθυμείτε να ορίσετε πρώτα κάποια κανάλια!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Το χρονόμετρο εκίνησε επιτυχώς."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Εγγραφή ακόμα."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Εκπομπή ακόμα."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Αδυναμία συντονισμού dvb!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Αδυναμία ορισμού pid(s)"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Καμία ελεύθερη CAM"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Το Kaffeine ακόμα αντιγράφει. Επιθυμείτε πραγματικά την έξοδο;"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Το Kaffeine έχει χρονόμετρα σε αναμονή. Επιθυμείτε πραγματικά την έξοδο;"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Σήμα:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Κλείδωμα:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Επεξεργασία..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Επιθυμείτε πραγματικά τη διαγραφή όλων των καναλιών;"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "ΕΝΑΡΞΗ σάρωσης"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "ΣΤΑΜΑΤΗΜΑ σάρωσης"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Σταμάτημα..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Βρέθηκαν: %1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Αδυναμία ανοίγματος της υποδοχής πληροφοριών DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Λίστα χρονομέτρων:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Νέο"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Σταμάτημα/διαγραφή"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Το χρονόμετρο επαναλαμβάνεται. Επιθυμείτε την παράλειψη της τρέχουσας εργασίας "
+"ή τη διαγραφή του χρονομέτρου;"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Παράλειψη τρέχουσας"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Διαγραφή του επιλεγμένου χρονομέτρου;"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Λήψη αρχείου... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Αντιγραφή αρχείων δεδομένων..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Ρυθμίσεις DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Συσκευή DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Ρυθμίσεις συσκευής"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Όνομα:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Τύπος:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Καλωδιακό"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Σταθερό"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Δορυφορικό"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Άγνωστο"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Αριθμός LNB:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1ος δορ:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Ρυθμίσεις LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2ος δορ:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3ος δορ:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4ος δορ:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Ρυθμίσεις LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Πηγή:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Αυτή η συσκευή φαίνεται να υποστηρίζει <b><i>αυτόματη σάρωση</i> "
+"καναλιών</b>. Μπορείτε να επιλέξετε <b>Αυτόματο</b> στη λίστα πηγών ώστε να "
+"γίνει αναζήτηση της περιοχής συχνοτήτων."
+"<br>Αν η <b><i>αυτόματη σάρωση</i></b> αποτύχει να βρει τα κανάλια, επιλέξτε "
+"μία από τις Πηγές στη λίστα.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Αν δεν μπορείτε να βρείτε το δίκτυο/τοποθεσία σας στη λίστα πρέπει να "
+"δημιουργήσετε ένα. Δείτε το $HOME/.kde/share/apps/kaffeine/dvb-x/ και "
+"χρησιμοποιήστε ένα υπάρχον αρχείο ως σημείο εκκίνησης. Συμπληρώστε τις τιμές "
+"για το δίκτυο/τοποθεσία σας και δώστε ένα λογικό όνομα (προσπαθήστε να "
+"ακολουθήσετε τη λογική των ονομασιών). Αν πιστεύετε ότι το νέο σας αρχείο "
+"μπορεί να φανεί χρήσιμο σε άλλα άτομα, μπορείτε να το στείλετε στο "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Επιλογές εγγραφής DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Κατάλογος εγγραφών:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Κατάλογος χρονικής υστέρησης:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Περιθώριο έναρξης:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(λεπτά)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Περιθώριο τέλους:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Διάρκεια στιγμιαίας εγγραφής:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Προτεινόμενη μορφή:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Εκπομπή DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Διεύθυνση εκπομπής:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Θύρα εκπομπής:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Θύρα πληροφοριών:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Διάφορα"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Προκαθορισμένο σύνολο χαρακτήρων (απαιτείται επανεκκίνηση):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Ενημέρωση δεδομένων σάρωσης:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Λήψη"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Καταγραφή γεγονότων epg στο \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Καταγραφή"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Πρόσθετα DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Αδυναμία ανάκτησης δεδομένων DVB από "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tΕλέγξτε τη σύνδεση με το διαδίκτυο, και πείτε Ναι για προσπάθεια "
+"ξανά."
+"<br>\t\t\tΉ πείτε Όχι για ακύρωση."
+"<br> Να γίνει ξανά προσπάθεια;</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Μη έγκυρος κατάλογος εγγραφών."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Μη έγκυρος κατάλογος χρονικής υστέρησης."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Οι θύρες εκπομπής και πληροφοριών πρέπει να είναι διαφορετικές."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Μη έγκυρη διεύθυνση εκπομπής."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Ρυθμίσεις LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Καθολικό LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Διπλό LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Μονό LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Συχνότητα εναλλαγής διπλού LO:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Συχνότητα χαμηλού εύρους:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Συχνότητα υψηλού εύρους:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Συχνότητα μονού LO:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Συχνότητα κατακόρυφης πολικότητας LO:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Συχνότητα οριζόντιας πολικότητας LO:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Επαναφορά"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Αδυναμία ανοίγματος της υποδοχής εκπομπής DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Αδυναμία αρχικοποίησης της υποδοχής εκπομπής DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Δε βρέθηκαν κωδικοποιητές ήχου."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Η φόρτωση του κωδικοποιητή '%1' απέτυχε."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Αδύνατη η δημιουργία του φακέλου: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bytes"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD ήχου"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Αναπαραγωγή CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Εξαγωγή CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Καλλιτέχνης:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Άλμπουμ:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Κομμάτι"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Επιλέξτε τα κομμάτια που θέλετε να εξάγετε και κάντε κλικ στο κουμπί <b>"
+"Κωδικοποίηση</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Κωδικοποίηση..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Κωδικοποίηση CD ήχου"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Αναπαραγωγή CD ήχου"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Αναπαραγωγή DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Αναπαραγωγή VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Άνοιγμα &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Άνοιγμα &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Άνοιγμα CD ή&χου"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Πρέπει να επιλέξετε κομμάτια για εξαγωγή."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Βρέθηκαν πολλά CD ήχου. Επιλέξτε ένα:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Δε βρέθηκε CD ήχου."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "Βίντεο DVD"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Βρέθηκαν πολλά DVD βίντεο. Επιλέξτε ένα:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Βρέθηκαν πολλά (S)VCD. Επιλέξτε ένα:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Χωρίς τίτλο"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Κομμάτι %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Αναζήτηση στην τοπική cddb..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Αναζήτηση στην απομακρυσμένη cddb..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Βρέθηκε απόλυτο ταίριασμα στην cddb..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Βρέθηκε κοντινό ταίριασμα στην cddb..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "Ταιριάσματα στη CDDB"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Βρέθηκαν πολλά κοντινά ταιριάσματα στην CDDB. Επιλέξτε ένα:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Ένα πρόσθετο κωδικοποίησης mp3 μέσω του Lame για το Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Ένα πρόσθετο κωδικοποίησης Ogg Vorbis για το Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Πελάτης DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Αδυναμία ανοίγματος της υποδοχής πληροφοριών."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Αδυναμία σύνδεσης της υποδοχής πληροφοριών!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Αδυναμία ανοίγματος της υποδοχής."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Αδυναμία ορισμού επιλογής της υποδοχής!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Αδυναμία σύνδεσης υποδοχής!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Όλα τα μεγέθη"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Πολύ μικρό"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Μικρό"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Μεσαίο"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Μεγάλο"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Πολύ μεγάλο"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Νέα αναζήτηση"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+"Το εξώφυλλο που επιλέξατε δεν είναι διαθέσιμο. Παρακαλώ επιλέξτε κάποιο άλλο."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Το εξώφυλλο δεν είναι διαθέσιμο"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Εργαλείο λήψης εξωφύλλων"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+"Δε βρέθηκαν εικόνες που να ταιριάζουν. Παρακαλώ δώστε άλλους όρους αναζήτησης:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Δώστε νέους όρους αναζήτησης:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Αναπαραγωγή"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Αναπαραγωγή επόμενου/προσθήκη στην αναμονή"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Επιλογή όλ&ων"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Δημιουργία λίστας από τα επιλεγμένα"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Προσθήκη υπο&τίτλου..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "Επεξεργασία &τίτλου"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "Π&ληροφορίες"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Διάρκεια"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Καλλιτέχνης"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Άλμπουμ"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Έτος"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Είδος"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Υπότιτλοι"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "σε χρήση"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Αρχεία υποτίτλων\n"
+"*.*|Όλα τα αρχεία"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Επιλογή αρχείου υποτίτλων"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Επιλογή εξωφύλλου..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Συλλογή..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Φίλτρο"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Λίστα αναπαραγωγής:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Επιλογή της ενεργής λίστας αναπαραγωγής. Για αλλαγή του ονόματος της λίστας "
+"επεξεργαστείτε το και επιβεβαιώστε με το 'Return'."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Αναπαραγωγή λίστας"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Επανάληψη"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Επανάληψη λίστας"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Ανα&κάτεμα"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Αναπαραγωγή αντικειμένων σε τυχαία σειρά"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Αυτόματη λήψη εξωφύλλων"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Αυτόματη λήψη εξωφύλλων"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Καθαρισμός της τρέχουσας λίστας"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Νέ&α λίστα"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "Ε&ισαγωγή λίστας..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "Αποθήκευ&ση λίστας ως..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Α&φαίρεση της τρέχουσας λίστας"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Λίστες αναπαραγωγής Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Όλα τα αρχεία"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Άνοιγμα λίστας"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Λίστες αναπαραγωγής M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Λίστες αναπαραγωγής PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Αποθήκευση λίστας"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Λίστα αναπαραγωγής"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "ΝΕΟ"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Εισαγωγή πόρων πολυμέσων..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(χωρίς υπότιτλους)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Άλλος υπότιτλος..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Συλλογή"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Αναμονή: %1 καταχωρήσεις, χρόνος εκτέλεσης: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Καταχωρήσεις: %1, Χρόνος εκτέλεσης: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Αφαίρεση του '%1' από τη λίστα και από το δίσκο;"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Το όνομα λίστας υπάρχει ήδη"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Εισάγετε διαφορετικό όνομα λίστας:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Επιλογή υποτίτλων"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Αρχείο πολυμέσων:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Επιλογή ταινίας"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Αρχείου υποτίτλων:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Αναπαραγωγή / παύση"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "Επόμε&νο"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Χωρίς ήχο"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Αναπαραγωγέας Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Αναπαραγωγέας Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Κωνσταντίνος Γεωργοκίτσος,Σπύρος Γεωργαράς,Τούσης Μανώλης"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"kgeorgokitsos@nomioan.gr,sng@hellug.gr,manolis@koppermind.homelinux.org"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Ένας αναπαραγωγέας πολυμέσων για το KDE 3. Μπορεί να χρησιμοποιήσει διάφορα "
+"συστήματα υποστήριξης αναπαραγωγής, με προκαθορισμένο (και προτεινόμενο) το "
+"xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Οι συγγραφείς του Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Τρέχων συντηρητής"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Αρχικός συγγραφέας"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Υποστήριξη CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Διάφορες πολύτιμες διορθώσεις."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Διόρθωση περιήγησης DVB OSD."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Διορθώσεις κατηγοριών DVB."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Λογότυπο για το Kaffeine 0.8 κλπ."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Κίνηση λογοτύπου για του Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr ""
+"Εναλλακτική κωδικοποίηση για ετικέτες μεταδεδομένων. Πολλές διορθώσεις."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Χειρισμός πρόσθετων xine. Πολλές διορθώσεις."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Εισαγωγή αρχείου υποτίτλων."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Εισαγωγή M3U. Δοκιμές."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Επεξεργαστής PIDs υποτίτλων"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PIDs υποτίτλων"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Νέο αντικείμενο"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Μετακίνηση πάνω"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Μετακίνηση κάτω"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Ενημέρωση επιλογής"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Νέο"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Σελίδα:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Σελίδα υποτίτλων:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Γλώσσα:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Επανάληψη χρονομέτρου"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Επεξεργαστής PIDs ήχου"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "PIDs ήχου"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Επεξεργαστής εκπομπής"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Διαθέσιμα κανάλια:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Λίστα εκπομπής:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Δεξί κλικ για επεξεργασία/διαγραφή)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Νέο..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Αναζήτηση"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Μετατόπιση (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Έναρξη σάρωσης"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Φίλτρα"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Ελεύθερα"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Πάροχος:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Προσθήκη επιλεγμένων"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Προσθήκη φιλτραρισμένων"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Βρέθηκαν"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Έγινε"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Επεξεργαστής καναλιών"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Αρ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Πολικότητα"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Συχνότητα:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Ρυθμός συμβόλου:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Κωδικοποιημένο"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Teletext PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "ID υπηρεσίας:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID βίντεο:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "ID Ροής μεταφοράς:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PIDs υποτίτλων..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "PIDs ήχου..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Εύρος:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "υψηλό FEC:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Μετάδοση:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "Χαμηλό FEC:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Χρονικό διάστημα ελέγχου:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Ιεραρχία:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Διαμόρφωση:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Αντιστροφή:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Προτιμήσεις κωδικοποίησης"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Κωδικοποιητής:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Βασικός κατάλογος:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Απενεργοποίηση όλων των ελέγχων"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Κανονική λειτουργία"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Λειτουργία Paranoia"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Κανονικοποίηση"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Γραμμή εργαλείων CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Επιλογές Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Ρυθμός bit:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Επιλογές Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Ποιότητα:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Λίστα αναπαραγωγής"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Επιλογές εξόδου"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Αναπαραγωγέας"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Ενεργοποίηση αυτόματης αλλαγής &μεγέθους"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Εκπομπή στο δίκτυο"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Πλοήγηση"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Με&νού DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "Ή&χος"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Βίντεο"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Αναλογία διαστάσεων"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Γραμμή εργαλείων στιγμιότυπου οθόνης"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Γραμμή εργαλείων ελέγχου"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Γραμμή εργαλείων έντασης ήχου"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Γραμμή εργαλείων θέσης"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Ρύθμιση Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Συμπεριφορά"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Παύση όταν το παράθυρο είναι ελαχιστοποιημένο"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Ενσωμάτωση στο πλαίσιο συστήματος"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " δευτ"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "κλειστό"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Διάρκεια ανακοίνωσης του τίτλου στο πλαίσιο συστήματος"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Ενεργοποίηση πελάτη DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Διάφορες επιλογές"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr ""
+"Χρήση εναλλακτικής (μη Unicode) κωδικοποίησης για ετικέτες μεταδεδομένων"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Επιλογή εναλλακτικής κωδικοποίησης για ετικέτες μεταδεδομένων\n"
+"(για να γίνει δυνατή η μετατροπή σε Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Καθαρισμός λίστας προσφάτων αρχείων"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Έναρξη αναπαραγωγής αμέσως"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Έναρξη σε λειτουργία πλήρους οθόνης"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Ορισμός οδηγού ήχου"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Ορισμός οδηγού βίντεο"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Ορισμός της διαδρομής για τη συσκευή CD ήχου/VCD/DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Έξοδος μηνυμάτων αποσφαλμάτωσης του xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Εκτέλεση του μάγου εγκατάστασης"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Αρχεία για αναπαραγωγή. Μπορεί να είναι ένα τοπικό αρχείο, ένα URL, ένας "
+"κατάλογος ή 'DVD', 'VCD', 'CD ήχου'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Εκκίνηση"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Παράθυρο αναπαραγωγέα"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Υποστηριζόμενες μορφές πολυμέσων"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Αρχεία ήχου MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Αρχεία βίντεο MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Αρχεία Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Αρχεία AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Αρχεία Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Αρχεία Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Αρχεία Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Αρχεία FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Αρχεία Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Αρχεία WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Το φόρτωμα του τμήματος αναπαραγωγής '%1' απέτυχε."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "Το %1 δε βρέθηκε στη διαδρομή αναζήτησης."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Άνοι&γμα URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Άνο&ιγμα καταλόγου..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Έξοδος && κλείσιμο οθόνης μετά από αυτό το κομμάτι"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Έξοδος μετά από αυτό το κομμάτι"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Έξοδος μετά τη λίστα αναπαραγωγής"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Απλοποιημένη λειτουργία"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Εναλλαγή &λίστας/αναπαραγωγέα"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Διατήρηση αρ&χικών αναλογιών"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Αρχικό μέγεθος"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Διπλό μέγεθος"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Τριπλό μέγεθος"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Μηχανή αναπαραγωγής"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Πελάτης DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Αναπαραγωγέας"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Κύριο παράθυρο"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "Η επέκταση DPMS Xserver δε βρέθηκε."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Αυτό θα τερματίσει το Kaffeine και θα κλείσει την οθόνη μετά το τέλος του "
+"αρχείου/λίστας. Η επιλογή \"dpms\" πρέπει να υπάρχει στο αρχείο ρύθμισης του X "
+"για να είναι δυνατό το κλείσιμο της οθόνης."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Άνοιγμα αρχείου(ων)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Άνοιγμα URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Εισαγωγή ενός URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Άνοιγμα φακέλου"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Δεν υπάρχει %1 στη συσκευή, ή λάθος διαδρομή για τη συσκευή."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Παρακαλώ επιλέξτε σωστή συσκευή:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Μάγος εγκατάστασης Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Έλεγχος εγκατάστασης"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Εντάξει."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Το τμήμα δε βρέθηκε. Παρακαλώ ελέγξτε την εγκατάστασή σας!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Βρέθηκε έκδοση"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Το Kaffeine απαιτεί KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Κωδικοποιητές WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Δε βρέθηκαν WIN32 κωδικοποιητές στο /usr/lib/win32. Δε θα μπορείτε να "
+"αναπαράγετε αρχεία Windows Media 9, νεότερα αρχεία Real Media και κάποιες "
+"λιγότερο γνωστές μορφές. Κατεβάστε τους κωδικοποιητές εδώ:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"Δε βρέθηκε το libdvdcss. Δε θα είναι δυνατή η αναπαραγωγή κρυπτογραφημένων DVD "
+"(τα περισσότερα εμπορικά). Μπορείτε να βρείτε τη βιβλιοθήκη εδώ (η χρήση της "
+"μπορεί να παραβιάζει νομοθεσία πνευματικών δικαιωμάτων στη χώρα σας!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Οδηγός DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Η λειτουργία DMA είναι κλειστή! Για ομαλή αναπαραγωγή DVD εκτελέστε ως root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Αδυναμία ελέγχου της λειτουργίας DMA. Απαγόρευση πρόσβασης ή δεν υπάρχει τέτοια "
+"συσκευή:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Συσκευή DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "Δε βρέθηκαν συσκευές DVB. Οι λειτουργίες DVB δε θα εμφανίζονται."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Διανομή"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"Η βιβλιοθήκη xine-lib που δίνεται με το SuSE \"μπορεί να μην έχει συγκεκριμένα "
+"χαρακτηριστικά εξαιτίας νομικών θεμάτων (πιθανή παραβίαση πατέντων)\". Θα "
+"πρέπει να χρησιμοποιήσετε τα πακέτα από εδώ:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "ΑΠΟΤΕΛΕΣΜΑ"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Βρέθηκαν κάποια προβλήματα, ωστόσο το Kaffeine μπορεί να λειτουργήσει."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Όλα εντάξει!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Χρήση του Kaffeine ως βοηθητική εφαρμογή για ροές mms:// (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr "Χρήση του Kaffeine ως βοηθητική εφαρμογή για ροές rtsp:// (Real Media)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Δημιουργία εικονιδίου Kaffeine στην επιφάνεια εργασίας"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Επιλογές εγκατάστασης"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Ποιότητα απόπλεξης"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Πολύ χαμηλή χρήση κμε, χειρότερη ποιότητα.</b>"
+"<br>Η μισή κατακόρυφη ανάλυση χάνεται. Για μερικά συστήματα (με κάρτες γραφικών "
+"PCI) αυτό μπορεί να μειώσει τη χρήση της κμε σε σύγκριση με την απλή "
+"αναπαραγωγή βίντεο (χωρίς απόπλεξη)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Χαμηλή χρήση κμε, χαμηλή ποιότητα.</b>"
+"<br>Η εικόνα θολώνεται κατακόρυφα έτσι ώστε να αφαιρεθούν τα φαινόμενα πλέξης."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Μέση χρήση κμε, μέση ποιότητα.</b>"
+"<br>Η εικόνα αναλύεται σε περιοχές που εμφανίζουν προβλήματα πλέξης και "
+"διορθώνεται (παρεμβολή)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Υψηλή χρήση κμε, καλή ποιότητα.</b>"
+"<br>Η μετατροπή της μορφής της εικόνας dvd βελτιώνει την ποιότητα και διορθώνει "
+"το σφάλμα υπερδειγματοληψίας χρώματος ."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Πολύ ψηλή χρήση κμε, πολύ καλή ποιότητα.</b>"
+"<br>Εκτός της χρήσης έξυπνων αλγόριθμων απόπλεξης αυτό επίσης διπλασιάζει το "
+"ρυθμό καρέ (30->60fps) για να ταιριάξει με το ρυθμό πεδίων των τηλεοράσεων. "
+"Ανιχνεύει και διορθώνει τη στρέβλωση 3-2. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Πολύ ψηλή χρήση κμε, πολύ καλή ποιότητα με (πειραματικές) βελτιώσεις.</b>"
+"<br>Ενεργοποίηση της διόρθωσης τρεμοπαίγματος (αναπαραγωγή ταινιών στην αρχική "
+"τους ταχύτητα των 24 fps) και κάθετη εξομάλυνση χρώματος (διορθώνει κάποιες "
+"μικρές χρωματικές λωρίδες που εμφανίζονται σε κάποια dvds). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Καθορισμένο από χρήστη"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Ρύθμιση πρόσθετου απόπλεξης tvtime..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Μπορεί να χρειάζεται ένα διορθωμένο πυρήνα 2.4 (όπως του RedHat) ή πυρήνα "
+"2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Ρύθμιση πρόσθετου απόπλεξης tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Πρόσθετα εφέ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Ήχος"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Φίλτρα ήχου"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Ενεργοποίηση φίλτρων ήχου"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Προσθήκη φίλτρου"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Αφαίρεση όλων των φίλτρων"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Βίντεο"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Φίλτρα βίντεο"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Ενεργοποίηση φίλτρων βίντεο"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Παράμετροι της μηχανής xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Επιλογές %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Επιλογές νέου χρήστη"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Προχωρημένες επιλογές"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "Τμήμα Xine"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Ένα τμήμα αναπαραγωγής βασισμένο στο xine για το Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Η υποστήριξη της SMIL (Synchronized Multimedia Integration Language) είναι "
+"υποτυπώδης!\n"
+"Το τμήμα Xine μπορεί τώρα να δοκιμάσει την αναπαραγωγή των πηγών βίντεο χωρίς "
+"καμία διάταξη. Συνέχεια;"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Αποθήκευση ροής ως"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Υπότιτλοι"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Κανάλι ήχου"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 από %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|Αρχείο PNG\n"
+"*.bmp|Αρχείο BMP\n"
+"*.xbm|Αρχείο XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Αποθήκευση στιγμιότυπου ως"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Θύρα εκπομπής:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Ρύθμιση λήψης ροής εκπομπής"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Διεύθυνση αποστολέα:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Θύρα:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Μετάβαση στη θέση:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Σφάλμα xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Μήνυμα xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Έτοιμο"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Αναπαραγωγή"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Αρχείο υποτίτλων"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Αποθήκευση ροής ως"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Πληροφορίες κομματιού"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Αντιγραφή URL στο πρόχειρο"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Αναπαραγωγή στο Kaffeine εξωτερικά"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "Α&ποστολή ροής εκπομπής..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Λήψη ροής εκπομπής..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "Απο&θήκευση στιγμιότυπου..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Αποθήκευση ροής..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Αποθήκευση της τρέχουσας ροής στο σκληρό δίσκο. Αυτό το χαρακτηριστικό είναι "
+"απενεργοποιημένο για κάποιες μορφές (π.χ. Real Media) για να αποτραπούν πιθανά "
+"νομικά προβλήματα."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Εναλλαγή σε Απλοποιημένη λειτουργία"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Παύση"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Γρήγορη κίνηση"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Αργή &κίνηση"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Μετάβαση μπροστά (20δ)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Μετάβαση πίσω (20δ)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Μετάβαση μπροστά (1λ)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Μετάβαση πίσω (1λ)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Μετάβαση μπροστά (10λ)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Μετάβαση πίσω (10λ)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Μετάβαση στη θέση..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Μενού DVD αριστερά"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Μενού DVD δεξιά"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Μενού DVD πάνω"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Μενού DVD κάτω"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Επιλογή μενού DVD"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Κανάλι ήχου"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Επιλογή καναλιού ήχου"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Ο&πτικά εφέ ήχου"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Αύξηση έντασης"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Μείωση έντασης"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Απόπλεξη"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+"Ενεργοποιήστε αυτή την επιλογή για πλεγμένες ροές, σε κάποια DVD για "
+"παράδειγμα."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Αυτόματα"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "Α&ναμορφικό"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Τετράγωνο"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Μεγέθυνση οριζόντια"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Σμίκρυνση οριζόντια"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Μεγέθυνση κατακόρυφα"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Σμίκρυνση κατακόρυφα"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Ποιότητα απόπλεξης"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Ρυθμίσεις &βίντεο"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Ισοσταθμιστής"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Εναλλαγή &μενού"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Τίτλος"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Βάση"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Υπότιτλος"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Γωνία"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Τμήμα"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Τίτλοι"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Κεφάλαια"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Γωνίες"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Π&ληροφορίες κομματιού"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Πρόσθετα εφέ..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&παράμετροί της μηχανής xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Ένταση"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Θέση"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Σύντομο κλικ: Εναλλαγή χρονομέτρου μπροστά/πίσω\n"
+"Μακρύ κλικ: Εναλλαγή χρονομέτρου OSD"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Χρόνος εκτέλεσης"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Αναζήτηση καταχωρίσεων CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Κομμάτι CD ήχου %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Κομμάτι VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Ρυθμίσεις βίντεο"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Απόχρωση"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Κορεσμός"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Αντίθεση"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Φωτεινότητα"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Μετατόπιση ήχου/βίντεο"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Μετατόπιση υποτίτλων"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "αυτόματο"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Γενική προειδοποίηση: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Δεν υπάρχουν διαθέσιμες πληροφορίες."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Προειδοποίηση ασφαλείας: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Ο υπολογιστής που προσπαθείτε να συνδεθείτε είναι άγνωστος.\n"
+"Ελέγξτε την εγκυρότητα του ορισμένου ονόματος υπολογιστή. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Το όνομα συσκευής που ορίσατε φαίνεται να μην είναι έγκυρο. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Το δίκτυο μοιάζει μη προσβάσιμο.\n"
+"Ελέγξτε τη ρύθμιση του δικτύου σας και το όνομα του εξυπηρετητή. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Μη διαθέσιμη έξοδος ήχου. Η συσκευή είναι απασχολημένη. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Η σύνδεση απορρίφθηκε.\n"
+"Ελέγξτε το όνομα υπολογιστή. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Το καθορισμένο αρχείο η url δε βρέθηκε. Παρακαλώ ελέγξτε το. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Η πρόσβαση σε αυτή την πηγή απορρίφθηκε. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Η πηγή είναι αδύνατο να αναγνωσθεί.\n"
+"Ίσως δεν έχετε επαρκή δικαιώματα ή η πηγή δεν περιέχει δεδομένα (π.χ. δεν "
+"υπάρχει δίσκος στον οδηγό). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+"Συνέβη ένα πρόβλημα κατά το φόρτωμα της βιβλιοθήκης ή του αποκωδικοποιητή: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr ""
+"Η πηγή φαίνεται να είναι κρυπτογραφημένη, και είναι αδύνατο να αναγνωσθεί. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Το DVD σας φαίνεται να είναι κρυπτογραφημένο. Ανάλογα με τους νόμους της χώρας "
+"σας μπορείτε ή όχι να χρησιμοποιήσετε τη libdvdcss για να διαβάσετε αυτό το "
+"δίσκο. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Άγνωστο σφάλμα: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Σφάλμα: Αδύνατη η αρχικοποίηση του νέου οδηγού βίντεο %1 - χρησιμοποιώντας %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Χρησιμοποιώντας οδηγό βίντεο: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Σφάλμα: Αδύνατη η αρχικοποίηση του νέου οδηγού ήχου %1 - χρησιμοποιώντας %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Χρησιμοποιώντας οδηγό ήχου: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Αρχικοποίηση xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Αδυναμία αρχικοποίησης της μηχανής xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Οδηγός ήχου για χρήση (προκαθορισμένο: αυτόματο)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Οδηγός βίντεο για χρήση (προκαθορισμένο: αυτόματο)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Χρήση μείκτη ήχου με λογισμικό"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Εμφάνιση μηνυμάτων OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Μέγεθος του κειμένου OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Γραμματοσειρά μηνυμάτων OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"Αδυναμία αρχικοποίησης του οδηγού βίντεο %1 - δοκιμή του 'αυτόματου'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Όλοι οι οδηγοί βίντεο απέτυχαν να αρχικοποιηθούν!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Αδυναμία αρχικοποίησης του οδηγού ήχου %1 - δοκιμή του 'αυτόματου'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Όλοι οι οδηγοί ήχου απέτυχαν να αρχικοποιηθούν!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Αδύνατη η δημιουργία νέας ροής xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: άνοιγμα..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Άνοιγμα..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Κωδικοποιητής ήχου"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Κωδικοποιητής βίντεο"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Δεν βρέθηκε πρόσθετο να διαχειριστεί αυτόν τον πόρο"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Ο πόρος φαίνεται χαλασμένος"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Δεν υπάρχει ο ζητούμενος πόρος"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Δεν είναι δυνατό να ανοιχθεί ο πόρος"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Γενικό σφάλμα"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Με ήχο"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Χωρίς ήχο"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Γρήγορη κίνηση %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Αργή κίνηση %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Απόπλεξη: ανοικτή"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Απόπλεξη: κλειστή"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Αναλογία διαστάσεων"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Αυτόματο"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Εστίαση Χ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Εστίαση Υ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msec"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Ρυθμίσεις ισοσταθμιστή"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Ενίσχυση έντασης"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Ενίσχυση έντασης για τον ισοσταθμιστή - Αν ο ήχος παρουσιάζει θόρυβο "
+"απενεργοποιήστε το"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Διαγραφή φίλτρου"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Αναζήτηση στο %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Η αρχικοποίηση GStreamer απέτυχε!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "Τμήμα GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Χωρίς ήχο"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Σχόλιο"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Παράμετροί μηχανής &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "Αδυναμία αρχικοποίησης του GStreamer!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Λείπει το μητρώο GStreamer! Ξεχάσατε την εκτέλεση του <b>gst-register</b> "
+"(ως root) μετά την εγκατάσταση;"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Αδυναμία αρχικοποίησης του οδηγού ήχου %1 - δοκιμή ενός άλλου..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Δε βρέθηκε λειτουργικός οδηγός ήχου!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Αδυναμία αρχικοποίησης του οδηγού βίντεο %1 - δοκιμή ενός άλλου..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Δε βρέθηκε λειτουργικός οδηγός βίντεο!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Παράμετροι μηχανής GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Επιλογές ήχου"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Προτεινόμενος οδηγός ήχου"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Επιλογές βίντεο"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Προτεινόμενος οδηγός βίντεο"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Απαιτείται επανεκκίνηση!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Μέσο"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Επιλογές μέσου"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Οδηγός CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Τμήμα Dummy"
diff --git a/po/es.po b/po/es.po
new file mode 100644
index 0000000..f902ef8
--- /dev/null
+++ b/po/es.po
@@ -0,0 +1,3199 @@
+# translation of kaffeine.po to Spanish
+# Translation of kaffeine.po to Spanish
+# Translation of Kaffeine to Castilian aka Spanish
+# This file is distributed under the same license as the Kaffeine package.
+# Copyright (C) 2003 Juergen Kofler <juergen.kofler@chello.at>
+#
+# Enrique Matias Sanchez (aka Quique) <cronopios@gmail.com>, 2003, 2004, 2005, 2006.
+# Carlos Mayo Hernandez <carlos.mayo@hispalinux.es>, 2005.
+# Miguel Perez Ibars <mpi79470@alu.um.es>, 2006.
+# Jaime Robles <jaime@kde.org>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-01-14 20:16+0100\n"
+"Last-Translator: Jaime Robles <jaime@kde.org>\n"
+"Language-Team: Spanish <kde-es@kybs.de>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Guía de los programas"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Actualizar"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Planificado"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Actual/Siguiente"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Canal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Comienzo"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Duración"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Título"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Ver todos los programas"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Añadir a los temporizadores"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Nombre:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Canal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Comienzo:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Duración:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Final:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Grabar como:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Ninguno"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Diariamente"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Semanalmente"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Mensualmente"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Personalizado"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Repetir ..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Editor del temporizador"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "¡Debe darle un nombre!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "¡La duración debe ser de al menos 1 minuto!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"El nombre no debe contener ninguno de los siguientes caracteres: > "
+"< \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Opciones iniciales del «transpondedor»"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Este nombre no es único."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Falta(n) pid(s) de audio."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "¡El pid debe ser distinto de cero!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Debe elegir algunos días."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Canales"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Programaciones"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Guía electrónica de los programas"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Opciones de DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Número"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Nombre"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Canales de audio"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Grabación instantánea"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Difusión"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Diferido"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Grabación"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Difusión"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Seleccionar icono..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Escoger icono del canal"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "TV Digital"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "La TV digital en directo sólo funciona con el motor Xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Siguiente canal de OSD"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Canal anterior de OSD"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Navegación en OSD"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Siguiente suceso de OSD"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Suceso anterior de OSD"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Mostrar OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Temporizadores..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Difusión..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Canales..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Configurar DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Todo"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Nueva categoría ..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Cambiar icono ..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Eliminar categoría..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nueva categoría"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Introducir un nombre para esta categoría:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "¿Realmente desea borrar esta categoría?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>No se pueden obtener los datos DVB de "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t\t\tCompruebe su conexión a Internet, y pulse «Sí» para intentarlo de "
+"nuevo."
+"<br>\t\t\tO pulse «No» para cancelar."
+"<br>\t\t\tSi ya tiene este archivo, cópielo a "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz y pulse «Sí»."
+"<br>"
+"<br>¿Intentarlo de nuevo?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Error en la difusión"
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "No se pudo comenzar la difursión"
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Programación creada e iniciada con éxito."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Posiblemente quiera definir algún canal antes."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Programación creada con éxito."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Todavía grabando."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Todavía difundiendo."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "¡No se pude sintonizar el DVB!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "No se pueden definir los pids"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "No hay ninguna CAM libre"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine está grabando todavía. ¿Realmente desea salir?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine tiene temporizadores en espera. ¿Realmente desea salir?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Señal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Bloqueo:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Editar..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "¿Realmente desea borrar todos los canales?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "INIICIAR la exploración"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "DETENER la exploración"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Deteniendo..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Encontrado: %1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "No se puede abrir el 'socket' de información DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Lista de temporizadores:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Nuevo"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Parar/Eliminar"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Este temporizador está repetido. ¿Desea saltar la tarea actual o borrar el "
+"temporizador?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Omitir la actual"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "¿Borrar el temporizador seleccionado?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Descargando... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Copiando ficheros de datos..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Opciones de DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Dispositivo DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Opciones del dispositivo"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Nombre:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tipo:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Cable"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Terrestre"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satélite"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Número de LNBs:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "Primer satélite:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Opciones de LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "Segundo satélite:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "Tercer satélite:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "Cuarto satélite:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Opciones de LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Fuente:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Opciones de grabación DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Directorio de grabaciones:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+#, fuzzy
+msgid "Time shifting directory:"
+msgstr "Directorio de diferidos:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Margen de comienzo:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minutos)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Margen de fin:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Duración de la grabación instantánea:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Formato preferido:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Difusión DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Dirección de difusión:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Puerto de difusión:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Puerto de información:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Varios"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Juego de caracteres predefinido (necesitará reiniciar):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Actualizar los datos de exploración:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Descargar"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Volcar los sucesos de epg a \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Volcar"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Complementos DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+#, fuzzy
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>No se pueden obtener los datos DVB de "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz !"
+"<br>\t\t\tCompruebe su conexión a Internet, y pulse Sí para intentarlo de "
+"nuevo."
+"<br>\t\t\tO pulse No para cancelar."
+"<br> ¿Intentarlo de nuevo?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Directorio de grabaciones no válido."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Directorio de diferidos no válido."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Los puertos de difusión e información deben ser diferentes."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Dirección de difusión no válida."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Opciones de LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "LNB universal"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "LNB de banda C"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "LNB multipunto de banda C"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Dual LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Single LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+#, fuzzy
+msgid "Dual LO switch frequency:"
+msgstr "Frecuencia:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Frecuencia de banda baja:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Frecuencia de banda alta:"
+
+#: input/dvb/dvbconfig.cpp:996
+#, fuzzy
+msgid "Single LO frequency:"
+msgstr "Frecuencia:"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "Frecuencia:"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "Frecuencia:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Reiniciar"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "No se puede abrir el socket para la difusión DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr ""
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "No se ha encontrado ningún codificador de audio."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Ha fallado la carga del codificador «%1»."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "No se pudo crear el directorio:"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "kçB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bytes"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD de audio"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Reproducir CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Extraer CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artista:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Álbum:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Pista"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Seleccione las pistas que desea extraer y pulse el botón <b>Codificar</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Codificar..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Codificación de CD de audio"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Reproducir CD de audio"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Reproducir DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Reproducir VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Abrir &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Abrir &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Abrir CD de &audio"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Debe seleccionar las pistas a extraer."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Se han encontrado varios CD de audio. Elija uno:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "No se encontró ningún CD de audio."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD de vídeo"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Varios DVDs de vídeo encontrados. Elija uno:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Varios (S)VCD encontrados. Elija uno:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Ningún título"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Pista %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Buscando una entrada local cddb..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Buscando una entrada remota cddb..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Encontrada una coincidencia exacta cddb ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Encontrada una coincidencia de cddb ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "Coincidencias en CDDB"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Se han encontrado varias entradas parecidas en CDDB. Elija una:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Un complemento de codificación de MP3 con LAME para Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Un complemento de codificación de Ogg Vorbis para Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Cliente DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "No se puede abrir el 'socket' de información."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "No se puede conectar al 'socket' de información."
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "No se puede abrir el 'socket'."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "No se puede establecer la opción del 'socket'."
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "No se puede conectar al 'socket'."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Todos los tamaños"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Muy pequeño"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Pequeño"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Medio"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Grande"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Muy grande"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nueva búsqueda"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+"La portada que ha seleccionado no está disponible. Seleccione otra por favor."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Portada no disponible"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Descargador de portadas"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+"No se ha encontrado ninguna imagen que coincida, introduzca nuevo términos de "
+"búsqueda:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Introduzca nuevos términos de búsqueda:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Reproducir"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Reproducir el siguiente/Añadir a la cola"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Seleccion&ar todo"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Crear una lista de reproducción a partir de la selección"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Añadir sub&títulos..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Editar título"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Información"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Duración"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artista"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Álbum"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Año"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Género"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Subtítulos"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "en uso"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Ficheros de subtítulos\n"
+"*.*|Todos los ficheros"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Seleccionar fichero de subtítulos"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Elija una portada..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galería..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtro"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Lista de reproducción:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Seleccionar la lista de reproducción activa. Para cambiar el nombre de la "
+"lista, edítelo y confirme con «Intro»."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Reproducir la lista"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Repetir"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Reproducir en bucle"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Reproducción &aleatoria"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Reproducir los elementos en un orden aleatorio"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Descargar automáticamente las carátulas"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Descarga automática de carátulas"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "Limpiar la lista de reprodu&cción actual"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Nueva lista de reproducción"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importar lista de reproducción..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Guardar la lista de reproducción actual como..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Eli&minar la lista de reproducción actual"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Listas de reproducción de Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Todos los ficheros"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Abrir lista de reproducción"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Listas de reproducción M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Listas de reproducción PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Guardar la lista de reproducción"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Lista de reproducción"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NUEVO"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importando los recursos de medios..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(sin subtítulos)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Otros subtítulos..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galería"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Cola: %1 entradas, Tiempo de reproducción: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Entradas: %1, Tiempo de reproducción: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "¿Eliminar «%1» de la lista y el disco?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "El nombre de la lista de reproducción ya existe"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Introduzca un nombre diferente para la lista de reproducción:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Seleccionar subtítulo"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Fichero de medios:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Seleccionar película"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Fichero de subtítulos:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Reproducir / Pausa"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Siguiente"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Mudo"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Reproductor Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Reproductor Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Carlos Mayo Hernández, Enrique Matías Sánchez (aka Quique)"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "carlos.mayo@hispalinux.es, cronopios@gmail.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Un reproductor de medios para KDE 3. Puede usar varios motores para la "
+"reproducción, siendo xine el predeterminado (y el recomendado)."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Los autores de Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Mantenedor actual"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Autor original"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Soporte CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Varios valiosos parches."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animación del logotipo para Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Codificación alternativa para las metaetiquetas. Muchos parches."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Gestión de los complementos de xine. Muchos parches."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Importación del fichero de subtítulos."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Importación de M3U. Pruebas."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Editor de PID de subtítulos"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID de subtítulos"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Nuevo elemento"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Subir"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Bajar"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Actualizar la selección"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Nuevo"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Página:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Subpágina:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Idioma:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Temporizador repetido"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Editor de PID de audio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "PID de audio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Editor de difusión"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Canales disponibles:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Lista de difusión:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Pulse para editar/borrar)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Nuevo..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Buscar en"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Desplazamiento (kHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Comenzar exploración"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtros"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Emisión en abierto"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Proveedor:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Añadir la selección"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Añadir lo filtrado"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Encontrado"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Hecho"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Editor de canales"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nº:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaridad"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frecuencia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Tasa de símbolos:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Cifrado"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Pid del teletexto:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "ID de servicio:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Pid del vídeo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "ID del flujo de transporte:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PID de subtítulos..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "PID de audio..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Ancho de banda:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC alto:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Transmisión:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC bajo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Intervalo de vigilancia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Jerarquía:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulación:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversión:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Preferencias de codificación"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Codificador:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Directorio base:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Deshabilitar todas las comprobaciones"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Modo normal"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Modo paranoia"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalizar"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Barra de herramientas del CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Opciones de MP3 de Lame"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Tasa de bits:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Opciones de Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Calidad:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Lista de reproducción"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Opciones de salida"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "Re&productor"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Habilitar el &redimensionamiento automático"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Difusión por &red (broadcasting)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navegación"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Menús &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Audio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Vídeo"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Proporciones"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Barra de capturas de pantalla"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Barra de controles"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Barra de volumen"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Barra de posición"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Configuración de Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Comportamiento"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Pausar el vídeo cuando la ventana esté minimizada"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Embeber en la bandeja del sistema"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " seg"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "desactivado"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Duración del anuncio del título en la bandeja del sistema"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Activar cliente DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Opciones adicionales"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Usar una codificación alternativa (no Unicode) para las metaetiquetas"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Elija el nombre de la codificación alternativa para las metaetiquetas\n"
+"(para convertirlas a Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Limpiar la lista de ficheros recientes"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Empezar la reproducción inmediatamente"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Empezar en modo de pantalla completa"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Seleccionar el controlador de audio"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Seleccionar el controlador de vídeo"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Seleccionar la ruta al dispositivo CD de audio/VCD/DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Mostrar los mensajes de depuración de Xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Ejecutar el asistente de instalación"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Fichero(s) a reproducir. Puede ser un fichero local, un URL, un directorio o "
+"'DVD', 'VCD', 'AudioCD'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Iniciar"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Ventana del reproductor"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Formatos de media soportados"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Ficheros de audio MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Ficheros de vídeo MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ficheros Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Ficheros AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Ficheros Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Ficheros Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Ficheros Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Ficheros FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Ficheros Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Ficheros WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Fallo de la carga de la parte «%1» del reproductor."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "No se ha encontrado %1 en la ruta de búsqueda."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Abrir &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Abrir d&irectorio..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Salir y apagar el monitor después de esta pista"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Salir después de esta pista"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Salir después de la lista de reproducción"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "Modo &mínimo"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Conmutar lista de re&producción/lector"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Conservar el aspecto &original"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Tamaño original"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Tamaño doble"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Tamaño triple"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Motor de re&producción"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Cliente DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Lector"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Ventana principal"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "No se ha encontrado la extensión DPMS Xserver."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Esto saldrá de Kaffeine y cortará la alimentación del monitor cuando finalice "
+"la reproducción del fichero o lista. Su fichero de configuración de X debe "
+"tener la opción «dpms» para apagar el monitor."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Abrir fichero(s)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Abrir un URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Introduzca un URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Abrir directorio"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "No hay ningún %1 en el lector, o ruta incorrecta al dispositivo."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Por favor, seleccione el lector correcto:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Asistente de instalación de Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Verificación de la instalación"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Aceptar."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Part no encontrada. Por favor, compruebe su instalación."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Versión encontrada"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine requiere KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Códecs Win32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"No se ha encontrado ningún códec Win32 en /usr/lib/win32. No podrá reproducir "
+"los ficheros Windows Media 9, los ficheros Real Media más recientes y algunos "
+"formatos poco comunes. Descargue los códecs de aquí:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"No se ha encontrado libdvdcss. No podrá reproducir DVD cifrados (la mayoría de "
+"los comerciales). Puede conseguir esta biblioteca aquí (pero usarla puede "
+"violar las leyes de su país):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Lector de DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Modo DMA desactivado. Para una reproducción suave del DVD ejecute como root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"No se puede comprobar el modo DMA. Permiso denegado o no existe el dispositivo:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Dispositivo DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"No se encontraron dispositivos DVB. Las funciones relacionadas con DVB serán "
+"ocultadas."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribución"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"La «xine-lib» proporcionada por SuSE «puede carecer de algunas funcionalidades "
+"debido a requisitos legales (potencial violación de patentes)». Debería usar "
+"los paquetes disponibles aquí:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "RESULTADO"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+"Se han encontrado problemas, pero Kaffeine puede funcionar aún con todo."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Todo bien."
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Usar Kaffeine como aplicación auxiliar para los flujos mms:// (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Usar Kaffeine como aplicación auxiliar para los flujos rtsp:// (Real Media y "
+"otros)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Crear un icono de Kaffeine en el escritorio"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Opciones de instalación"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Calidad del desentrelazado"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Muy poco uso de la CPU, peor calidad.</b>"
+"<br>Se pierde la mitad de la resolución vertical. Para algunos sistemas (con "
+"tarjetas de vídeo PCI) esto puede reducir el uso de la CPU en comparación con "
+"la reproducción de vídeo sencilla (sin desentralazamiento)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Poco uso de la CPU, calidad pobre.</b>"
+"<br>La imagen es desenfocada verticalmente, eliminándose los efectos de "
+"entrelazamiento."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Uso medio de la cpu, calidad media.</b>"
+"<br>Se analiza la imagen y se arreglan (interpolan) las áreas que muestran "
+"efectos de entrelazamiento."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Mucho uso de la CPU, buena calidad.</b>"
+"<br>La conversión del formato de imagen de DVD mejora la calidad y arregla el "
+"fallo de <i>upsampling</i> de la crominancia."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Muchísimo uso de la CPU, excelente calidad.</b>"
+"<br>Además de usar algoritmos de desentrelazamiento inteligentes, también "
+"duplica la frecuencia de los fotogramas (30->60fps) para hacerla coincidir con "
+"la frecuencia de campo de la televisión. Detecta e invierte <i>3-2 pulldown</i>"
+". *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Uso extremadamente alto de la CPU, excelente calidad con mejoras "
+"(experimentales).</b>"
+"<br>Habilita la corrección de <i>judder</i> (reproduce películas a su velocidad "
+"original de 24 fps) y suavizado de color vertical (arregla las pequeñas tiras "
+"de colores que se ven en algunos DVD). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Definida por el usuario"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Configurar el complemento de desentrelazamiento de tvtime..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Puede requerir un núcleo 2.4 parcheado (como el de Red Hat) o el núcleo "
+"2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Configurar el complemento de desentralazado de tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Complementos de efectos"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Audio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Filtros de audio"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Habilitar los filtros de audio"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Añadir filtro"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Eliminar todos los filtros"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Vídeo"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Filtros de vídeo"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Habilitar los filtros de vídeo"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Parámetros del motor xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 Opciones"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Opciones para principiantes"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Opciones avanzadas"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Un part de reproducción basada en xine para Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+#, fuzzy
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"La gestión de SMIL (Lenguaje de Integración de Multimedia Sincronizado) es "
+"rudimentaria.\n"
+"La part Kaffeine intentará ahora reproducir las fuentes de vídeo contenidas sin "
+"ninguna disposición. ¿Proseguir?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Guardar flujo de datos como"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Subtítulos"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Canal de audio"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 de %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|Fichero PNG\n"
+"*.bmp|Fichero BMP\n"
+"*.xbm|Fichero XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Guardar captura de pantalla como"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Puerto de difusión:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+#, fuzzy
+msgid "Configure Receive Broadcast Stream"
+msgstr "&Recibir flujo de difusión"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Dirección del remitente:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Puerto:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Saltar a la posición:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Error de xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Mensaje de xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Preparado"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Reproducción"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Fichero de subtítulos"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Guardar el flujo como"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Información de la pista"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Copiar el URL al portapapeles"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Reproducir externamente en Kaffeine"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Enviar flujo de datos de difusión..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Recibir flujo de datos de difusión..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Guardar captura de pantalla..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Guardar flujo de datos..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Guarda el flujo actual al disco duro. Esta funcionalidad estaba desactivada "
+"para algunos formatos (por ejemplo Real Media) para evitar potenciales "
+"problemas legales."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "Modo &mínimo"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pausa"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Avanzar"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Cá&mara lenta"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Avanzar (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Retroceder (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Avanzar (1 m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Retroceder (1 m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Avanzar (10 m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Retroceder (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Saltar a la posición..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Menú DVD a la izquierda"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Menú DVD a la derecha"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Menú DVD arriba"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Menú DVD abajo"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Seleccionar menú DVD"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Canal de audio"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Seleccione un canal de audio"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Visualización del audio"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Subir volumen"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Bajar volumen"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Desentralazar"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Activar esto para flujos entrelazados, algunos DVD por ejemplo."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namórfico"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Cuadrado"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Acercar en horizontal"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Alejar en horizontal"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Acercar en vertical"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Alejar en vertical"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Calidad del desentrelazado"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Configuración de &vídeo"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Ecualizador"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Cambiar &menú"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Título"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Raíz"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Subimagen"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "An&gulo"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Parte"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Títulos"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Capítulos"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Ángulos"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Información de la pista"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Com&plementos de efectos..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Parámetros del motor de &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volumen"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Posición"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Pulsación breve: Conmuta la programación hacia adelante/atrás Pulsación larga: "
+"Conmuta la programación OSD"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Tiempo de reproducción"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Buscando las entradas CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Pista de CD audio %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Pista VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Configuración de vídeo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Tono"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Saturación"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Contraste"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Brillo"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Desplazamiento audio/vídeo"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Desplazamiento de los subtítulos"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Advertencia general: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "No hay información disponible."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Advertencia de seguridad: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"No se conoce el servidor al que se está intentando conectar.\n"
+"Compruebe la validez del nombre de servidor indicado. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "El nombre de dispositivo que ha indicado no parece ser válido. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Parece que no se puede acceder a la red.\n"
+"Compruebe su configuración de red y el nombre del servidor. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "La salida de audio no está disponible. El dispositivo está ocupado. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"La conexión ha sido rechazada.\n"
+"Compruebe el nombre del servidor. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"No se ha encontrado el fichero o URL indicado. Por favor, verifíquelo. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "No tiene permisos para acceder a esta fuente. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"No se puede leer la fuente.\n"
+"Puede ser que usted no tenga suficientes permisos para acceder a ésta, o que la "
+"fuente no contenga datos (por ejemplo, que no haya un disco en la unidad). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+"Se ha producido un error mientras se cargaba una biblioteca o un decodificador: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "La fuente parece cifrada, y no se puede leer. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Probablemente su DVD esté cifrado. Según las leyes de su país, usted puede o no "
+"usar libdvdcss para poder leer este disco. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Error desconocido: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Error: No se puede inicializar el nuevo controlador de vídeo %1 - se usa %2."
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Usando controlador de vídeo: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Error: No se puede inicializar el nuevo controlador de audio %1 - se usa %2."
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Usando controlador de audio: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Inicialización de xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "¡No se ha podido iniciar el motor de xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Controlador de audio a usar (predeterminado: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Controlador de vídeo a usar (predeterminado: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Usar el mezclador de audio por software"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Mostrar los mensajes OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Tamaño del texto OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Tipo de letra de los mensajes OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"No se puede inicializar el controlador de vídeo «%1» - intentando con «auto»..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Ha fallado la inicialización de todos los controladores de vídeo."
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"No se puede inicializar el controlador de audio «%1» - intentando «auto»..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Ha fallado la inicialización de todos los controladores de audio."
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "¡No se puede crear un nuevo flujo de xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: abriendo..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Abriendo..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Códec de audio"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Códec de vídeo"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "No se ha encontrado ningún complemento para manejar este recurso"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "El recurso parece estar dañado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "El recurso solicitado no existe"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "No se puede abrir el recurso"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Error genérico"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Silencio desactivado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Silencio activado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Avanzar %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Cámara lenta %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Desentralazado: activado"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Desentralazado: desactivado"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Proporciones"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Zoom X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Zoom Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr " ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Opciones del ecualizador"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Ganancia de volumen"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Ganancia de volumen del ecualizador - Si el sonido se vuelve ruidoso, desactive "
+"esta opción"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Borrar filtro"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Buscando %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "La inicialización de GStreamer ha fallado."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Silenciado"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Comentario"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parámetros del motor &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "No se pudo inicializar GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Falta el registro de GSTreamer. ¿Olvidó ejecutar <b>gst-register</b> "
+"(como root) tras la instalación?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"No se puede inicializar el controlador de audio '%1' - intentando con otro..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "No se ha encontrado ningún controlador de audio válido."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"No se puede inicializar el controlador de vídeo '%1' - intentando con otro..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "No se ha encontrado ningún controlador de vídeo válido."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parámetros del motor GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Opciones de audio"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Controlador de audio preferido"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Opciones de vídeo"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Controlador de vídeo preferido"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Requiere reiniciar"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Medio"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Opciones del medio"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "unidad de CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Part inútil"
diff --git a/po/et.po b/po/et.po
new file mode 100644
index 0000000..b1956e9
--- /dev/null
+++ b/po/et.po
@@ -0,0 +1,3165 @@
+# translation of kaffeine.po to
+#
+# Marek Laane <bald@starman.ee>, 2006-2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-05-05 22:09+0300\n"
+"Last-Translator: Marek Laane <bald@starman.ee>\n"
+"Language-Team: <kde-et@linux.ee>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Värskenda"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Ajastatud"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Aktiivne/Järgmine"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Algus"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Kestvus"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Pealkiri"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Vaata kõiki programme"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Lisa taimerisse"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Nimi:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Algus:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Kestvus:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Lõpp:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Salvestus:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Puudub"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Igapäevane"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Iganädalane"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Igakuine"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Kohandatud"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Kordus..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Taimeri redaktor"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Nimi tuleb anda!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Kestvus peab olema vähemalt 1 minut!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Nimi ei tohi sisaldada märke: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Transpondri algseadistused"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "See nimi pole unikaalne."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Audio Pid(id) on puudu!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Pid ei tohi olla null!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Valida tuleb vähemalt mõni päev."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanalid"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Taimerid"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektrooniline telekava"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB seadistused"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Number"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Nimi"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Audiokanalid"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Otsesalvestus"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Leviedastus"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Ajanihe"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Salvestamine"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Leviedastus"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Vali ikoon..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Vali kanali ikoon"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "DigiTV"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Otse-digiTV töötab ainult xine mootoriga."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Ekraanimenüü järgmine kanal"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Ekraanimenüü eelmine kanal"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Ekraanimenüü kanalivalik"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Ekraanimenüü järgmine sündmus"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Ekraanimenüü eelmine sündmus"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Näita ekraanimenüüd"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Taimerid..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Leviedastus..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanalid..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "DVB seadistamine..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Kõik"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Raadio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Uus kategooria..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Muuda ikooni..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Kustuta kategooria..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Uus kategooria"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Kategooria nimi:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Kas tõesti see kategooria kustutada?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>DVB andmete hankimine aadressilt http://hftom.free.fr/kaxtv/dvbdata.tar.gz "
+"ebaõnnestus!"
+"<br>\t\t\tKontrolli internetiühendust ja klõpsa Jah taasproovimiseks."
+"<br>\t\t\tKlõpsa Ei katkestamiseks."
+"<br>\t\t\tKui sul on juba see arhiiv, kopeeri see asukohta "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz ja klõpsa Jah."
+"<br>"
+"<br>Kas proovida uuesti?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Leviedastus ebaõnnestus."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Leviedastuse alustamine ebaõnnestus."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Taimer edukalt loodud ja käivitatud."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Kõigepealt tuleb mõni kanal defineerida!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Taimer edukalt loodud."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Veel salvestatakse."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Leviedastus veel käib."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "DVB häälestamine ebaõnnestus!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "PID-de määramine ebaõnnestus"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Vaba CAM puudub"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine salvestab veel. Kas tõesti väljuda?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeinel on ootel taimereid. Kas tõesti väljuda?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signaal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Lukk:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Muuda..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Kas tõesti kustutada kõik kanalid?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "ALUSTA skaneerimist"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "PEATA skaneerimine"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Peatamine..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Leiti: %1 TV - %2 raadio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "DVB infosokli avamine ebaõnnestus."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Taimerite nimekiri:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Uus"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Peata/Kustuta"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"See taimer on korduv. Kas jätta vahele aktiivne töö või kustutada taimer?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Jäta aktiivne vahele"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Kas kustutada valitud taimer?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Allalaadimine... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Andmefailide kopeerimine..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB seadistused"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB seade"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Seadme seadistused"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Nimi</b>:</qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tüüp</b>:</qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kaabel"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Maapealne"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satelliit"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "ATSC"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Tundmatu"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "LNB-de arv:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1. sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB seadistused..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2. sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3. sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4. sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB seadistused..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Allikas:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>See seade paistab toetavat <b><i>automaatskaneerimise</i></b> "
+"võimalust. Vali allikate nimekirjas <b>AUTOMAATNE</b> "
+"ning Kaffeine otsib ise sagedusvahemikud."
+"<br>Kui <b><i>automaatskaneerimisega</i></b> kanaleid ei leita, vali nimekirjas "
+"tegelik allikas.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Kui sa nimekirjas oma võrku/asukohta ei leia, tuleb see ise luua. Vaata "
+"asukohta $HOME/.kde/share/apps/kaffeine/dvb-x/ ja vali alustamiseks mõni "
+"olemasolev fail. Täida see oma võrgu/asukoha väärtustega ja anna failile "
+"mõistlik nimi (järgi olemasolevate failide eeskuju). Kui arvad, et uuest "
+"failist oleks kasu ka teistele, saada see aadressile "
+"kaffeine-user(ätt)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB salvestamise valikud"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Salvestiste kataloog:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Ajanihke kataloog:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Alguse lõtk:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(min)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Lõpu lõtk:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Otsesalvestamise kestvus:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Eelistatud vorming:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB leviedastus"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Leviedastuse aadress:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Leviedastuse port:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Info port:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Muud"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Vaikimisi kooditabel (vajab taaskäivitust):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Skaneerimisandmete uuendamine:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Laadi alla"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"EPG sündmuste salvestamine\n"
+"faili ~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Tõmmis"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB pluginad"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>DVB andmete hankimine aadressilt http://hftom.free.fr/kaxtv/dvbdata.tar.gz "
+"ebaõnnestus!"
+"<br>\t\t\tKontrolli internetiühendust ja klõpsa Jah taasproovimiseks."
+"<br>\t\t\tKlõpsa Ei katkestamiseks."
+"<br> Kas proovida uuesti?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Vigane salvestiste kataloog."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Vigane ajanihke kataloog."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Leviedastuse ja info port peavad olema erinevad."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Vigane leviedastuse aadress."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB seadistused"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Universaalne LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Kaksik-LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Üksik LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Kaksik-Lo lülitamissagedus:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Madalsagedusriba:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Kõrgsagedusriba:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Üksiku LO sagedus:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Vert. pol. LO sagedus:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Hor. pol. LO sagedus:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Lähtesta"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "DVB leviedastuse sokli avamine ebaõnnestus."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "DVB leviedastuse sokli initsialiseerimine ebaõnnestus."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Ühtegi audiokodeerijat ei leitud."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Kodeerija '%1' laadimine ebaõnnestus."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Kataloogi loomine ebaõnnestus: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "baiti"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Audio CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Esita CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Ripi CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Esitaja:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Rada"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "Vali rajad, mida soovid rippida, ja klõpsa nupule <b>Kodeeri</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Kodeeri..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Audio CD kodeerimine"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Audio CD esitamine"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "DVD esitamine"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "VCD esitamine"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Ava &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "A&va VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "&Ava audio CD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Rippimiseks tuleb valida rajad."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Leiti mitu audio CD-d. Vali neist üks:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Audio CD-d ei leitud."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD Video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Leiti mitu DVD videot. Vali neist üks:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Leiti mitu (S)VCD-d. Vali neist üks:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Tiitel puudub"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Rada %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Kohaliku CDDB kirje otsimine..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "CDDB kirje otsimine võrgust..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Leiti täpselt sobiv CDDB kirje..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Leiti sarnane CDDB kirje..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB vasted"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Leiti mitu lähedast CDDB kirjet. Vali neist üks:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Kaffeine Lame MP3 kodeerija plugin."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Kaffeine Ogg Vorbis kodeerija plugin."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB klient"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Infosokli avamine ebaõnnestus."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Infosokli sidumine ebaõnnestus!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Sokli avamine ebaõnnestus."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Sokli valikute määramine ebaõnnestus!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Sokli sidumine ebaõnnestus!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Kõik suurused"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Väga väike"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Väike"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Keskmine"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Suur"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Väga suur"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Uus otsing"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Valitud plaadiümbris pole kättesaadav. Palun vali mõni teine."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Plaadiümbris puudub"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Plaadiümbriste allalaadimine"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Ühtegi sobivat pilti ei leitud. Palun anna uued otsinguterminid:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Sisesta uued otsinguterminid:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Esitus"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Esita järgmine/Lisa järjekorda"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "V&ali kõik"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Loo valitutest esitusnimekiri"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Lisa sub&tiiter..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "R&edigeeri tiitlit"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Info"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Pikkus"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Esitaja"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Aasta"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Žanr"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Subtiitrid"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "kasutusel"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtiitrifailid\n"
+"*.*|Kõik failid"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Subtiitrifaili valik"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Vali plaadiümbris..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galerii..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filter"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Esitusnimekiri:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Vali aktiivne esitusnimekiri. Esitusnimekirja nime muutmiseks redigeeri seda ja "
+"kinnita muudatus klahvile Enter vajutades."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Esita esitusnimekiri"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "Ko&rda"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Korda esitusnimekirja"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "S&ega"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Esita palasid juhuslikus järjekorras"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Kaanepiltide automaatne allalaadimine"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Kaanepiltide automaatne allalaadimine"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Puhasta aktiivne esitusnimekiri"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Uus esitusnimekiri"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Impordi esitusnimekiri..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Salvesta aktiivne esitusnimekiri kui..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Ee&malda aktiivne esitusnimekiri"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine esitusnimekirjad"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Kõik failid"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Esitusnimekirja avamine"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U esitusnimekirjad"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS esitusnimekirjad"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Esitusnimekirja salvestamine"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Esitusnimekiri"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "UUS"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Meediaressursside import..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(subtiitrid puuduvad)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Muud subtiitrid..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galerii"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Järjekord: %1 kirjet, esitusaeg: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Kirjeid: %1, esitusaeg: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Kas eemaldada '%1' nimekirjast ja kettalt?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Sellise nimega esitusnimekiri on juba olemas"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Sisesta muu esitusnimekirja nimi:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Subtiitrifaili valik"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Meediafail:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Filmi valik"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Subtiitrifail:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Esitus/Paus"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Järgmine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "Tu&mm"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine mängija"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine mängija]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Marek Laane"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "bald@starman.ee"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"KDE 3 meediamängija. Võib kasutada esitamiseks paljusid taustaprogramme, "
+"vaikimisi (ja soovitatavalt) on selleks xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005: Kaffeine autorid"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Praegune hooldaja"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Originaali autor"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM-i toetus."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Mitmed väärtuslikud paigad."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "DVB OSD lehitsemise paik."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "DVB kategooriate paigad."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Kaffeine 0.8 logo ja muu graafika."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Kaffeine 0.5 logo animatsioon"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Metasiltide alternatiivne kodeerimine. Palju paiku."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Xine post-plugina käsitlemine. Palju paiku."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Subtiitrifaili import."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U import. Testimine."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Subtiitrite PID-de redaktor"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Subtiitrite PID-d"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Uus element"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Liiguta üles"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Liiguta alla"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Uuenda valitud"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Uus"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Lehekülg:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Subtiitri lehekülg:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Keel:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Korduv taimer"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Audio PID-de redaktor"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Audio PID-d"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Leviedastuse redaktor"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Saadaolevad kanalid:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Leviedastuse nimekiri:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Paremklõps redigeerimiseks/kustutamiseks)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Uus..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Otsi edasi"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Nihe (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Alusta skaneerimist"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtrid"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Tasuta vastuvõetav"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Pakkuja:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Lisa valitud"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Lisa filtreeritud"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Leitud"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Tehtud"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Kanalite redaktor"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaarsus:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Sagedus:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Sümbolikiirus:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Kodeeritud"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Teleteksti PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Teenuse ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Video PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Transpordivoo ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Subtiitrite PID-d..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Audio PID-d..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Ribalaius:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "Veaparanduse ülemine raja:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Ülekanne:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "Veaparanduse alumine raja:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Kaitseintervall:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarhia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulatsioon:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversioon:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Kodeerimisseadistused"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Kodeerija:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Baaskataloog:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Keela kõik kontrollid"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Tavaline režiim"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoiarežiim"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normaliseerimine"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD tööriistariba"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame MP3 valikud"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bitikiirus:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbise valikud"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Kvaliteet:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Esitusnimekiri"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Väljumisvalikud"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Mängija"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Automaatne suu&ruse muutmine"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "L&eviedastus"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Liikumine"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD menüüd"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Audio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "M&astaap"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Ekraanipildi riba"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Juhtimisriba"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Helitugevusriba"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Asukohariba"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine seadistamine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Käitumine"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Video peatamine akna minimeerimisel"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Põimimine süsteemsesse salve"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sek"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "väljas"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Pealkirja süsteemses salves näitamise aeg"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "DVB kliendi lubamine"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Muud valikud"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Alternatiivse (mitte-Unicode) kodeeringu kasutamine metasiltides"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Vali metasiltide alternatiivne kodeering\n"
+"(teisendamiseks Unicode'i)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Puhasta viimati kasutatud failide nimekiri"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Esituse käivitamine otsekohe"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Täisekraanrežiimis käivitamine"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Audiodraiveri määramine"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Videodraiveri määramine"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Audio CD/VCD/DVD-seadme asukoha määramine."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Xine silumisteadete väljastamine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Paigaldamisnõustaja käivitamine"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Esitatavad failid. Võivad olla kohalikud failid, URL-id, kataloog või 'DVD', "
+"'VCD', 'AudioCD'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Käivita"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Mängija aken"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Toetatud meediavormingud"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG audiofailid"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG videofailid"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbise failid"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI-failid"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime failid"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media failid"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska failid"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC-failid"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media failid"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV-failid"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Mängija komponendi '%1' laadimine ebaõnnestus."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 leidmine otsinguteelt ei õnnestunud."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Ava &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Ava &kataloog..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Välju ja lülita monitor välja pärast seda rada"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Välju pärast seda rada"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Välju pärast esitusnimekirja lõppu"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimaalne režiim"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Lül&ita esitusnimekirja/mängijat"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "&Säilita originaali mastaap"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Originaalsuurus"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Topeltsuurus"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Kolmekordne suurus"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Mängija mootor"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB klient"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Mängija"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Peaaken"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "X-serveri DPMS laiendust ei leitud."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"See sulgeb Kaffeine ja lülitab monitori välja pärast faili/esitusnimekirja "
+"esitamise lõpetamist. Monitori väljalülitamiseks peab X'i "
+"konfiguratsioonifailis leiduma võti \"dpms\"."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Failide avamine"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "URL-i avamine"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Kataloogi avamine"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "%1 ei ole seadmes või on asukoht valesti määratud."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Palun vali korrektne seade:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 paigaldamisnõustaja"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Paigaldamise kontroll"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "OK"
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Komponenti ei leitud. Palun kontrolli paigaldust!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Leiti versioon"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine vajab KDE versiooni >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 koodekid"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"WIN32 koodekeid ei leitud asukohast /usr/lib/win32. Sa ei saa esitada Windows "
+"Media 9 faile, uuemaid Real Media faile ja veel mõningaid vähemlevinud "
+"vorminguid. Koodekid saab alla laadida siit:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"Teeki libdvdcss ei leitud. Sa ei saa esitada krüptitud (peamiselt "
+"kommertslikke) DVD-sid. Teegi leiab siit (kuid arvesta, et selle kasutamine "
+"võib rikkuda sinu kodumaa autoriõiguseseadusi!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD-seade"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"DMA režiim on väljas! DVD edukaks taasesitamiseks anna administraatorina käsk:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "DMA režiimi kontroll ebaõnnestus. Õigusi napib või seade puudub:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-seade"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "DVB-seadmeid ei leitud. DVB-ga seotud funktsiooni peidetakse."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distributsioon"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"SuSE pakutaval teegil xine-lib \"võivad juriidiliste asjaolude (võimalik "
+"patendi rikkumine) tõttu puududa teatud võimalused\". Sel juhul tuleks kasutada "
+"pakette, mida saab hankida siit:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "TULEMUS"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Leiti mõned probleemid, kuid Kaffeine võib siiski töötada."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Kõik on korras!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "Kaffeine kasutamine mms:// (Microsoft Media) voogude puhul"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr "Kaffeine kasutamine rtsp:// (Real Media ja teised) voogude puhul"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Kaffeine ikooni loomine töölauale"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Paigaldamisvalikud"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Üleralaotuse eemaldamise kvaliteet"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Väga väike protsessori koormus, halvim kvaliteet.</b>"
+"<br>Pool vertikaalsest lahutusest läheb kaotsi. Mõnes süsteemis (PCI "
+"videokaardiga) võib see vähendada protsessori koormust võrreldes puhta video "
+"taasesitusega (ülerealaotuse eemaldamiseta)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Väike protsessori koormus, kehv kvaliteet.</b>"
+"<br>Pilt on vertikaalselt hägune, ülerealaotuse mõjud eemaldatakse."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Keskmine protsessori koormus, keskmine kvaliteet.</b>"
+"<br>Pilti analüüsitakse, ülerealaotuse artefaktidega piirkonnad parandatakse "
+"(interpoleeritakse)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Suur protsessori koormus, hea kvaliteet.</b>"
+"<br>DVD pildivormingu teisendamine parandab kvaliteeti ja likvideerib värvi "
+"ülediskreetimise vea."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Väga suur protsessori koormus, suurepärane kvaliteet.</b>"
+"<br>Lisaks nutikate ülerealaotuse eemaldamise algoritmine kasutamisele "
+"kahekordistatakse kaadrisagedust (30->60fps), mis vastab TV väljasagedusele. "
+"Tuvastab ja tühistab 3-2 pulldown-protsessi. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Ülisuur protsessori koormus, suurepärane kvaliteet (teatud "
+"eksperimentaalsete omadustega).</b>"
+"<br>Lülitab sisse vibratsioonikorrektsiooni (esitab filmi originaalkiirusega 24 "
+"fps) ja vertikaalse värvipehmenduse (parandab mõnel DVD-l esinevad pisikesed "
+"värvitriibud). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Kasutaja määratud"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "tvtime ülerealaotuse eemaldamise plugina seadistamine..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Võib vajada paigatud 2.4 kernelit (nagu RedHati oma) või 2.6 kernelit.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "tvtime ülerealaotuse eemaldamise plugina seadistamine"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Efektipluginad"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Audio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Audiofiltrid"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Audiofiltrite lubamine"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Lisa filter"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Eemalda kõik filtrid"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Videofiltrid"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Videofiltrite lubamine"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Xine mootori parameetrid"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 valikud"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Põhivalikud"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Ekspertvalikud"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Kaffeine xine-põhine mängija komponent."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL-i (sünkroniseeritud multimeediumi integreerimiskeel) toetus on algeline!\n"
+"Xine komponent võib nüüd üritada videoallikaid esitada ilma igasuguse "
+"paigutuseta. "
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Voo salvestamine"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Subtiiter"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Audiokanal"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 (kokku %2)"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-fail\n"
+"*.bmp|BMP-fail\n"
+"*.xbm|XBM-fail"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Ekraanipildi salvestamine"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Leviedastuse port:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Leviedastusvoo vastuvõtmise seadistamine"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Saatja aadress:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Hüpe asukohale:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Xine viga"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Xine teade"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Valmis"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Esitus"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Subtiitrifail"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Salvesta voog kui"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Raja info"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Kopeeri URL lõikepuhvrisse"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Esita Kaffeinega väliselt"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Saada leviedastusvoog..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Võta leviedastusvoog vastu..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Salvesta ekraanipilt..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Salvesta voog..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Salvestab voo kõvakettale. See on keelatud teatud vormingute puhul (nt. Real "
+"Media) võimalike juriidiliste probleemide vältimiseks."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "&Minimaalse režiimi lülitamine"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Paus"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Kiiresti edasi"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Ae&glaselt edasi"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Hüpe edasi (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Hüpe tagasi (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Hüpe edasi (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Hüpe tagasi (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Hüpe edasi (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Hüpe tagasi (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Hüpe asukohta..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD Menu Left"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD Menu Right"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD Menu Up"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD Menu Down"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD Menu Select"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Audiokanal"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Vali audiokanal"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Audio &visualiseerimine"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Heli tugevamaks"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Heli nõrgemaks"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "Üleralaotuse eemal&damine"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Aktiveeri see üleralaotusega voogude, näiteks mõne DVD jaoks."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Automaatne"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorfne"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Ruut"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Suurendus rõhtsuunas"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Vähendus rõhtsuunas"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Suurendus püstsuunas"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Vähendus püstsuunas"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Ülerealaotuse eemaldamise &kvaliteet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Videoseadistused"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Ekvalaiser"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Menüü"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Pealkiri"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "Juu&r"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "Nur&k"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Osa"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Tiitlid"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Peatükid"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Nurgad"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Raja &info"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Efekti&pluginad..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&Xine mootori parameetrid"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Helitugevus"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Positsioon"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Lühike klõps: taimer edasi/tagasi\n"
+"Pikk klõps: taimeri OSD"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Esitusaeg"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "CDDB kirjete otsimine..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Audio CD rada %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD rada %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Videoseadistused"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Toon"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Värviküllastus"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Heledus"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Audio/video nihe"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Subtiitrite nihe"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "automaatne"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Üldine hoiatus: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Info puudub."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Turvahoiatus: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Masin, millega püüad ühendust luua, on tundmatu.\n"
+"Kontrolli määratud masinanime õigsust. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Määratud seadmenimi paistab olevat vigane. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Võrk paistab olevat kättesaamatu.\n"
+"Kontrolli võrguseadistusi ja serveri nime. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Audioväljund on kättesaamatu. Seade on hõivatud. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Ühendusest keelduti.\n"
+"Kontrolli masinanime. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Määratud fail või URL-i ei leitud. Palun kontrolli seda. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Puuduvad õigused allikat kasutada. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Allikat ei õnnestunud lugeda.\n"
+"Võib-olla ei ole sul selleks õigusi või ei sisalda allikas andmeid (nt. pole "
+"seadmes plaati). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Tekkis probleem teegi või dekoodri laadimisel: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Allikas paistab olevat krüptitud, seda ei saa lugeda. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Sinu DVD on nähtavasti krüptitud. Vastavalt sinu maa seadustele ei pruugi sul "
+"olla õigust kasutada teeki libdvdcss plaadi lugemiseks. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Tundmatu viga: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Viga: uue videodraiveri %1 initsialiseerimine ebaõnnestus - kasutatakse %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Kasutatakse videodraiverit: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Viga: uue audiodraiveri %1 initsialiseerimine ebaõnnestus - kasutatakse %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Kasutatakse audiodraiverit: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Xine initsialiseerimine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Xine mootori initsialiseerimine ebaõnnestus!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Kasutatav audiodraiver (vaikimisi: automaatne)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Kasutatav videodraiver (vaikimisi: automaatne)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Tarkvaralise audiomikseri kasutamine"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "OSD teadete näitamine"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "OSD teksti suurus"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "OSD teadete font"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"Videodraiveri %1 initsialiseerimine ebaõnnestus - proovitakse 'automaatne'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Kõigi videodraiverite initsialiseerimine ebaõnnestus!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"Audiodraiveri %1 initsialiseerimine ebaõnnestus - proovitakse 'automaatne'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Kõigi audiodraiverite initsialiseerimine ebaõnnestus!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Uue xine Voo loomine ebaõnnestus!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: avamine..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Avamine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Audiokoodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Videokoodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Selle ressursi käsitlemiseks ei leitud ühtegi pluginat"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Ressurss paistab olevat katki"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Soovitud ressurssi pole olemas"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Ressursi avamine ebaõnnestus"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Üldine viga"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Heli sisse"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Heli välja"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Kiirelt edasi %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Aeglaselt edasi %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Ülerealaotuse eemaldamine: sees"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Ülerealaotuse eemaldamine: väljas"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Mastaap (kuvasuhe)"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Automaatne"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Suurendus X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Suurendus Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msek"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Ekvalaiseri seadistused"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Heli võimendus"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "Ekvalaiseri heli võimendus - kui helisse tekib müra, lülita välja"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Kustuta filter"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Hüppamine: %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "GStreameri initsialiseerimine ebaõnnestus!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Tumm"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Kommentaar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "&GStreameri mootori parameetrid"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreameri initsialiseerimine ebaõnnestus!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"GStreamer-registry puudub! Kas unustasid pärast paigaldamist käivitamast "
+"(administraatorina) <b>gst-register</b>?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Audiodraiveri %1 initsialiseerimine ebaõnnestus - proovitakse teist..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Ühtegi kasutatavat audiodraiverit ei leitud!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Videodraiveri %1 initsialiseerimine ebaõnnestus - proovitakse teist..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Ühtegi kasutatavat videodraiverit ei leitud!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "GStreameri mootori parameetrid"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Audiovalikud"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Eelistatud audiodraiver"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Videovalikud"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Eelistatud videodraiver"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Vajalik on taaskäivitamine!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Andmekandja"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Andmekandja valikud"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD/VCD/DVD-seade"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
diff --git a/po/fi.po b/po/fi.po
new file mode 100644
index 0000000..ccea786
--- /dev/null
+++ b/po/fi.po
@@ -0,0 +1,3190 @@
+# translation of kaffeine.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Mikko Virkkilä <mvirkkil(at)cc(dot)hut(dot)fi>, 2004.
+# Mikko Virkkilä <mikko.virkkila@saunalahti.fi>, 2004.
+# Mikael Lammentausta <mikael.lammentausta@student.savonia-amk.fi>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-11-13 21:12+0200\n"
+"Last-Translator: Mikael Lammentausta "
+"<mikael.lammentausta@student.savonia-amk.fi>\n"
+"Language-Team: <fi@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Ohjelmaopas"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Päivitä"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Kanavan tuleva ohjelmisto"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Kaikki ohjelmat (menossa/seuraava)"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanava"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Aloita"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Kesto"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Otsikko"
+
+# käytössä havaittu hyväksi
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Näytä kanavan tuleva ohjelmisto"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Tallenna ajastuksella"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Nimi:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanava:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Aloita:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Kesto:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Loppu:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Tallenna nimellä:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Ei mikään"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Päivittäin"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Viikottain"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Kuukausittain"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Mukautettu"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Toista..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Ajastetut ohjelmat"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Sinun on annettava sille nimi!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Keston pitää olla ainakin yksi minuutti."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Nimi ei saa sisältää seuraavia merkkejä: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Lähettimen oletusasetukset"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Tämä nimi ei ole yksilöllinen."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Äänikanavia ei löydy!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "PID ei saa olla nolla!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Sinun on valittava joitakin päiviä."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanavat"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Ajastukset"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Sähköinen ohjelmaopas (epg)"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "Kuvaruutunäyttö"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Digi-tv-asetukset"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Numero"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Nimi"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Äänikanavat"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Aloita tallennus heti"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Verkkolähetys"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Ajansiirto"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Tallennetaan"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Lähetetään"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Valitse kuvake..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Valitse kanavalle kuvake"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digitaalinen tv"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Digitaalisen tv-lähetyksen katselu toimii vain xine-moottorilla."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Seuraavan kanavan ohjelmatiedot"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Edellisen kanavan ohjelmatiedot"
+
+#: input/dvb/dvbpanel.cpp:333
+#, fuzzy
+msgid "OSD Zap"
+msgstr "Ohjelmatietojen alustus"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Seuraavan ohjelman tiedot"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Edellisen ohjelman tiedot"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Näytä ohjelmatiedot ruudulla"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "Ohjelmaopas (epg)..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Ajastukset..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Lähetetään..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanavat..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Muokkaa digi-tv-asetuksia..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Kaikki"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Uusi luokka..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Vaihda kuvake..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Poista luokka..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Uusi luokka"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Syötä nimi tälle luokalle"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Haluatko todella poistaa tämän luokan?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Verkkolähetys epäonnistui."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Verkkolähetystä ei voida aloittaa."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Tallennus aloitettu ja lisätty ajastinlistaan onnistuneesti."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Hae ensin kanavatiedot!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Ajastin onnistuneesti luotu."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Tallennus käynnissä."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Verkkolähetys yhä käynnissä."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Tv-kanavien viritys ei onnistu!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "PID-arvoja ei voida asettaa"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Ei vapaata CAM-laitetta"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr ""
+"Joitakin tallennuksia on yhä käynnissä. Oletko varma että haluat sulkea "
+"ohjelman?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Joitakin ajastuksia on vielä jäjellä. Oletko varma että haluat sulkea ohjelman?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signaali:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Lukitse:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Muokkaa..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Haluatko varmasti poistaa kaikki kanavat?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "ALOITA haku"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "LOPETA haku"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Pysäytetään..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Löydettiin: %1 tv - %2 radiokanava(a)"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Dvb-tietolähetinkantaa ei voitu avata."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Ajastukset:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Uusi"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Pysäytä/poista"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Tämä ajastus on toistuva. Haluatko keskeyttää nykyisen tallennuksen vai "
+"kokonaan poistaa ajastuksen?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Keskeytä"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Pysäytä valittu ajastus?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Ladataan..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Kopioidaan tiedostoja..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Digi-tv-asetukset"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Digi-tv-laite"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Laiteasetukset"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Nimi:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tyyppi:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kaapeli"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Antenni"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satelliitti"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Tuntematon"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Mikropäiden määrä:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1. sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Mikropään (LNB) asetukset..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2. sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3. sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4. sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Mikropään (LNB) asetukset..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Lähde:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Tämä laite vaikuttaa tukevan kanavien automaattista hakua. Valitse <b>"
+"AUTO</b> lähdeluettelosta, jotta Kaffeine etsisi kanavataajuudet itse. "
+"<br>Jos kanavien automaattinen haku ei löydä kanavia, valitse lähde listalta. "
+"<br>Tarkista kuitenkin YLEn kanavien tekstityksen PID-arvot vaikka haku "
+"onnistuisikin. Alla olevat arvot ovat voimassa v. 2006: "
+"<br>Kieli PID YLETV1 YLETV2 YLEFST YLE24 YLETeema"
+"<br>suomi 1027 2027 3027 5027 4027"
+"<br>ruotsi 1028 2028 3028 5028 4028 </qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Ellet löydä sijaintiasi listalta, sinun on luotava määritystiedosto "
+"itse. Katso esimerkkiä kansiosta $HOME/.kde/share/apps/kaffeine/dvb-x/. Täytä "
+"oikeat arvot ja anna tiedostolle kuvaava nimi (seuraa käytäntöä). Lähetä "
+"valmis, toimiva tiedosto Kaffeinen postituslistalle "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Digi-tv-tallennusasetukset"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Tallennuskansio:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Ajansiirto-tallennuskansio:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Aloitusmarginaali:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minuuttia)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Lopetusmarginaali:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Pikatallennuksen kesto:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Tallennusmuoto:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Digitv-verkkolähetys"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Verkkolähetyksen osoite:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Verkkolähetyksen portti:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Tietoportti:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Sekalaiset"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Oletusmerkistö (käynnistä Kaffeine uudelleen):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Päivitä tiedot:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Lataa"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Kirjoita ohjelmaoppaan tapahtumat tiedostoon \n"
+"~/kaffeine_dvb_events.txt:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Kirjoita"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Digi-tv-liitännäiset"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Epäkelpo kansio tallenteille."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Epäkelpo kansio ajansiirrolle."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Lähetysportin ja infoportin täytyy olla eri."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Epäkelpo lähetysosoite."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Mikropään (LNB) asetukset"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Mikropää (u-LNB)"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+#, fuzzy
+msgid "Dual LO"
+msgstr "Kaksois-LO"
+
+#: input/dvb/dvbconfig.cpp:981
+#, fuzzy
+msgid "Single LO"
+msgstr "Yksittäinen LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+#, fuzzy
+msgid "Dual LO switch frequency:"
+msgstr "Kaksois-LO:n vaihtotaajuus:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+# termi Prosessori-lehti 10/2005
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Koodinopeus LP:"
+
+# termi Prosessori-lehti 10/2005
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Koodinopeus HP:"
+
+#: input/dvb/dvbconfig.cpp:996
+#, fuzzy
+msgid "Single LO frequency:"
+msgstr "Yksittäisen LO:n taajuus:"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "Pystypolarisaation LO-taajuus:"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "Vaakapolarisaation LO-taajuus:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Reset"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Digi-tv-verkkolähetinkantaa ei voitu avata."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Digi-tv-verkkolähetinkantaa ei voitu alustaa."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Äänen pakkauskoodaajia ei löytynyt."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Pakkauskoodaajan '%1' lataus epäonnistui."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Ei voitu luoda kansiota: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "Mt"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "Kt"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "tavua"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Musiikkilevy"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Soita levy"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Kopioi levy"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artisti:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Levy:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Kappale"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Valitse kappaleet, jotka haluat kopioida ja paina <b>Pakkaa</b>-painiketta."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Pakkaa..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Musiikkilevyn pakkaus"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Soita musiikkilevy"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Toista dvd"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Toista video-cd"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Avaa &dvd"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Avaa &vcd"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Avaa &musiikkilevy"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Valitse kopioitavat kappaleet."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Löytyi useita musiikkilevyjä. Valitse yksi:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Musiikkilevyä ei löydy."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "Dvd-video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Havaittiin useita dvd-levyjä. Valitse yksi:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "Vcd-svcd"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Havaittiin useita (s)vcd-levyjä. Valitse yksi:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Ei otsikkoa"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Kappale %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Haetaan tietoja paikallisesta cddb-kannasta..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Haetaan tietoja cddb-kannasta..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Tarkka tietue löytyi cddb-kannasta..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Läheltä liippaava tietue löytyi cddb-kannasta..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Havaittiin useita dvd-levyjä. Valitse yksi:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Lame mp3-pakkaajan liitännäinen Kaffeineen."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Ogg Vorbis-pakkaajan liitännäinen Kaffeineen."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Digi-tv:n vastaanotto lähiverkosta"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Tietolähetinkantaa ei voitu avata."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Tietolähetinkantaan ei voitu sitoutua!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Lähetinkantaa ei voitu avata."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Lähetinkannan määritystä ei voida asettaa!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Lähetinkantaa ei voida sitoa!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Kaikki koot"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Hyvin pieni"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Pieni"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Keskikokoinen"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Suuri"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Hyvin suuri"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Uusi haku"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Valittua kantta ei ole saatavilla. Valitse toinen."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Kantta ei ole saatavilla"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Kansikuvien lataaja"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Haku ei löytänyt levykuvia. Syötä uudet hakusanat:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Syötä uudet hakusanat:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Toista"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Soita seuraava/Lisää jonoon"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Valitse k&aikki"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Luo soittolista valituista"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Lisää &tekstitys"
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Muuta nimeä"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "T&ietoja"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Pituus"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "Url"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artisti"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Levy"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Vuosi"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Tyylilaji"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Tekstitykset"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "käytössä"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Tekstitys tiedostot\n"
+"*.*|Kaikki tiedostot"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Valitse tekstitystiedosto"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Valitse kansikuva..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galleria..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Suodatin"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Soittolista:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Valitse aktiivinen soittolista. Vaihtaaksesi soittolistan nimi muoddaa sitä ja "
+"hyväksy painalla enteriä."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Toista soittolista"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Jatkuva toisto"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Toista soittolistaa tauotta"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Seko&ita"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Soita satunnaisessa järjesyksessä"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Hae kansikuvat automaattisesti"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Kansikuvien automaattinen lataus"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "Tyhjennä &nykyinen soittolista"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Uusi soittolista"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "T&uo soittolista..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Tallenna soittolista nimellä..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Poista &nykyinen soittolista"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeinen soittolistat"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Kaikki tiedostot"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Avaa soittolista"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3u-soittolistat"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Pls-soittolistat"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Tallenna soittolista"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Soittolista"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "uusi_soittolista"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Tuodaan mediaresursseja..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(ei tekstitystä)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Muu tekstitys..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galleria"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Jono: %1 elementtiä, Soittoaika: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Elementtejä: %1, Soittoaika: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Poista '%1' listalta ja kovalevyltä?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Soittolista on jo olemassa"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Anna soittolistalle toinen nimi:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Valtise tekstitys"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Mediatiedosto:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Valitse elokuva"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Tekstitystiedosto:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Soita / Tauko"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Seuraava"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Vaienna"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine-soitin"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine-soitin]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Mikko Virkkilä,Mikael Lammentausta,Matti Viljanen"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"mvirkkil(at)cc(dot)hut(dot)fi,lamikae@dnainternet.net,mattiviljanen@luukku.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Mediasoitin KDE3:lle. Osaa käyttää useita moottoreita soittamiseen, "
+"oletusmoottori on xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "© 2003-2005, Kaffeinen kehittäjäryhmä"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Nykyinen ylläpitäjä"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Alkuperäinen tekijä"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Cicam-tuki"
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr ""
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Vaihtoehtoinen koodaus meta-tageille. Paljon korjauksia."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "xinen jälkikäsittely. Paljon korjauksia."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Tekstitystiedoston tuonti"
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3u-tuonti. Testauksessa."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Tekstitysten PID-editori"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Tekstitysten PIDit"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Uusi elementti"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Siirrä ylös"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Siirrä alas"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Päivitä valitut"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Uusi"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Sivu:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Alasivu:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Kieli:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Toistuva ajastus"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Äänikanavien PID-editori"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Äänikanavien PIDit"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Verkkolähetyseditori"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Saatavilla olevat kanavat:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Verkkolähetysluettelo:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(oikea naksautus tuo muokkaa/poista-valikon)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Uusi..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Hae"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, fuzzy, no-c-format
+msgid "Offset (KHz)"
+msgstr "Poikkeuma (kHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Aloita hakeminen"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Suodattimet"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Vapaalähetteinen"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Tarjoaja:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Lisää valitut"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Lisää suodatetut"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Löydetty"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Sulje"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&Digi-tv"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Kanavalistan muokkaus"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polariteetti"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Taajuus:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Symbolinopeus:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Salattu"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Teksti-tv:n PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Palvelun PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Videon PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Lähetysvuon tunniste:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Tekstitysten PIDit..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Äänikanavan PIDit..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Kaistanleveys:"
+
+# FEC = virheenkorjaus
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, fuzzy, no-c-format
+msgid "FEC high:"
+msgstr "FEC ylempi:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Lähetysmuoto:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, fuzzy, no-c-format
+msgid "FEC low:"
+msgstr "FEC alempi:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Suojaväli:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarkia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulaatio:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversio:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Pakkauskoodaajan asetukset"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Pakkauskoodaaja:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Tallennuskansio:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Tarkkuus:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Poista kaikki tarkistukset"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Perustila"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Tarkkuustila"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Tasoita äänenvoimakkuudet"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Cd-työkalupalkki"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame-mp3-pakkaajan asetukset"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "Vaihteleva bittinopeus"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bittinopeus:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "kt/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis-pakkaajan asetukset"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Laadun taso:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Soitto&lista"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Poistu valinnoista"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Soitin"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Käytä automaattista s&kaalausta"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Verkkolähetys"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigointi"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&Dvd"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&Dvd-valikot"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Ääni"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Kuva"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "Kuv&asuhde"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Kuvakaappauksen työkalupalkki"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Ohjainten työkalupalkki"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Äänenvoimakkuuden työkalupalkki"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Sijainnin työkalupalkki"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeinen asetukset"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Käyttäytyminen"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Pysäytä toisto kun soitin on piilossa"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Sisennä tehtäväpalkkiin"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sek"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "pois"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Otsikon näytön kesto järjestelmäpalkissa"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Ota käyttöön digi-tv:n vastaanotto lähiverkosta"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Sekalaiset asetukset"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Käytä vaihtoehtoista (ei-unicode)-koodausta metatageille"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Valitse metatagien vaihtoehtoisen koodauksen nimi\n"
+"(jotta voidaan muuttaa unicodeksi)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Tyhjennä viimeaikaisten tiedostojen lista"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Aloita toisto heti"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Käynnistä kokoruututilassa"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Aseta ääniajuri"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Aseta videoajuri"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Aseta polku ääni-cd/vcd/dvd-asemalle."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Tulosta xinen virheilmoitukset"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Aja asennusvelho"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Soitettava(t) tiedosto(t). Voi olla paikallinen tiedosto, www-osoite, kansio, "
+"'dvd', vcd', tai 'musiikkilevy'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Aloita"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Soitinikkuna"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Tuetut mediamuodot"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG-äänitiedostot"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG-videotiedostot"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis -tiedostot"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Avi-tiedostot"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "QuickTime-tiedostot"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "RealMedia-tiedostot"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska-tiedostot"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Flac-tiedostot"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media -tiedostot"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Wav-tiedostot"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Soittimen osan '%1' lataus epäonnistui."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 ei löytynyt polusta."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Avaa &www-osoite..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Avaa &kansio..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Lopeta ja sammuta näyttö tämän kappaleen jälkeen"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Lopeta tämän raidan jälkeen"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Lopeta soittolistan jälkeen"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Pienennetty"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "&Valitse soittolista/soitin"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Säilytä &alkuperäinen kuvasuhde"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Alkuperäinen koko"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Kaksinkertainen koko"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Kolminkertainen koko"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Soitinmoottori"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Digi-tv:n vastaanotto lähiverkosta"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Soitin"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Pääikkuna"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "Xserverin DPMS-laajennusta ei löytynyt."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Tämä valinta sulkee Kaffeinen ja sammuttaa näytön virran kun tiedosto tai "
+"soittolista on toistettu. Valinta \"DPMS \" täytyy olla käytössä X:n "
+"asetuksissa jotta näyttö sammuisi."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Avaa tiedosto(t)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Avaa www-osoite"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Anna www-osoite:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Avaa kansio"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "%1 ei ole asemassa tai laitteen polku on asetettu virheellisesti."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Valitse oikea asema:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 -asennusvelho"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Asennuksen tarkistus"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "OK."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Osaa ei löydy. Tarkista asennus."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Versio löydetty"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine vaatii KDE:n version %1 tai uudemman."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 -koodekit"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"WIN32 -koodekkeja ei löytynyt kansiosta /usr/lib/win32. Windows Media "
+"9-tiedostoja, uudempia RealMedia-tiedostoja tai muita harvinaisempia "
+"tiedostomuotoja ei voida toistaa. Hae koodekit täältä: "
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss-kirjastoa ei löytynyt. Salattuja (usein kaupallisia) dvd-levyjä ei "
+"voida toistaa. Voit hakea kirjaston täältä (jos tekijänoikeuslaki maassasi sen "
+"sallii):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Dvd-asema"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Dma-tila on pois päältä! Dvd-levyn toisto saattaa nykiä. Kokeile toistoa "
+"pääkäyttäjänä:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "Dma-tilaa ei voitu tarkistaa. Ei oikeuksia tai tiedostoa ei löytynyt:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Digi-tv-laite"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "Digi-tv-laitteita ei löytynyt. Asianomaiset toiminnot piilotetaan."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Jakelu"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"Suse:n mukana tulevasta xine-lib-kirjastosta saattaa puttua joitain "
+"ominaisuuksia lain asettamien rajoituksien vuoksi (ohjelmistopatenttien "
+"vuoksi). Voit hakea vaihtoehtoiset paketit täältä:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "TULOS"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Ongelmia havaittu, mutta Kaffeine saattaa silti toimia."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Kaikki kunnossa!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Käytä Kaffeinea apuriohjelmana jos vuo on mms:// (Microsoft Media)-muotoinen"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Käytä Kaffeinea apuriohjelmana jos vuo on rtsp:// (RealMedia ja muut)-muotoinen"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Luo Kaffeinen kuvake työpöydälle."
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Asennuksen asetukset"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Lomituksenpoiston laatu"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Erittäin vähäinen suorittimen käyttö, erittäin heikko laatu.</b>"
+"<br>Puolet pystysuuntaisesta resoluutiosta menetetään. Joillakin järjestelmillä "
+"(pci-näytönohjaimella) tämä saattaa vähentää suorittimen rasitusta verrattaessa "
+"puhtaaseen videontoistoon (ilman lomituksenpoistoa)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Vähäinen suorittimen käyttö, heikko laatu.</b>"
+"<br>Kuvaa sumennetaan pystysuunnassa, jotta lomituksen vaikutukset katoavat."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Kohtalainen suorittimen rasitus, keskinkertainen laatu.</b>"
+"<br>Alueet joissa näkyy lomituksesta johtuvia virheitä korjataan (täydennetään "
+"interpoloimalla)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Korkea suorittimen kuormitus, hyvä laatu.</b>"
+"<br>Muunnos parantaa kuvanlaatua ja korjaa värisävyeron ylinäytteistysvirheen."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+#, fuzzy
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Erittäin korkea suorittimen käyttö, erinomainen laatu.</b>"
+"<br>Kehittyneiden lomituksenpoistoalgoritmien suorituksen ohella kuvataajuus "
+"kaksinkertaistetaan (30->60 kuvaa/sek), jolloin se vastaa tv:n kenttätaajuutta. "
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Suurin suorittimen käyttö, loistava laatu (kokeellisilla) parannuksilla.</b>"
+"<br>Tärinänkorjaus (näe videot alkuperäisellä 24 kuvaa/sek taajuudella) ja "
+"pystysuora värintasaus (korjaa pienet väriviivat jotka esiintyvät joissain "
+"elokuvissa). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Käyttäjän määrittämä"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Määritä \"tvtime\" lomituksenpoisto-liitännäinen..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Saattaa vaatia Linuxin 2.6-ytimen, tai muokatun 2.4 -ytimen (esim. Red "
+"Hatissa).</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Määritä \"tvtime\" lomituksenpoisto-liitännäinen"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Tehosteliitännäiset"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Ääni"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Äänisuodattimet"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Käytä äänisuodatusta"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Lisää suodatin"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Poista kaikki suodattimet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Videosuodattimet"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Käytä videosuodattimia"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "xine-moottorin parametrit"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 asetukset"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Aloittelijan asetukset"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Asiantuntija-asetukset"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "xineen pohjautuva soitin Kaffeinelle."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL (Synchronized Multimedia Integration Language)-tuki on alkutekijöissään!\n"
+"Kaffeine voi nyt yrittää toistaa sisälletyn videon ilman kuvakerrosta (layout) "
+"xinella. Jatketaanko?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Tallenna vuo nimellä"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Tekstitys"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Äänikanava"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 / %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|png-tiedosto\n"
+"*.bmp|bmp-tiedosto\n"
+"*.xbm|xmb-tiedosto"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Tallenna kuvakaappaus nimellä"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Verkkolähetysportti:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Lähetyksen vastaanoton asetukset"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Lähettäjän osoite:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Portti:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Siirry sijaintiin:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine-virhe"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine-viesti"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Valmis"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Toistaa"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Tekstitystiedosto"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Tallenna vuo nimellä"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Kappaleen tiedot"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Kopioi www-osoite leikepöydälle"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Soita ulkoisesti Kaffeinessä"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "Lähetä verkkolähetysvuo..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Vastaanota verkkolähetysvuo..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "Tallenna &kuvakaappaus..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Tallenna vuo..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Tallentaa tämänhetkisen vuon kovalevylle. Tämä ominaisuus oli estetty joillekin "
+"formaateille (esim. RealMedia) koska oikeuksien haltija ei sitä ehkä suvaitse."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "Pienennetty tila"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Tauko"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "Pikakelaus &eteenpäin"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "&Hidastus"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Hyppää eteenpäin (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Hyppää taaksepäin (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Hyppää eteenpäin (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Hyppää taaksepäin (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Hyppää eteenpäin (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Hyppää taaksepäin (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Siirry kohtaan..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Dvd-valikko vasemmalle"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Dvd-valikko oikealle"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Dvd-valikko ylös"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Dvd-valikko alas"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Dvd-valikon valinta"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Äänikanava"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Valitse äänikanava"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Äänen &visualisointi"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Voimista"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Hiljennä"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Lomituksenpoisto"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Käytä tätä lomitetun vuon kanssa (esimerkiksi eräät dvd-elokuvat)."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorfinen"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Neliö"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Lähennä vaakasuunnassa"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Loitonna vaakasuunnassa"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Lähennä pystysuunnassa"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Loitonna pystysuunnassa"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Lomituksenpoiston &laatu"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Videoasetukset"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "Taa&juuskorjain"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Menun piilotus/näyttö"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Otsikko"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Juuri"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Alikuva"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Kuvakulma"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "O&sa"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Otsikot"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Kappaleet"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Kuvakulmat"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "T&ietoja raidasta"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Tehosteliitännäiset..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&xine-moottorin parametrit"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Äänenvoimakkuus"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Sijainti"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Lyhyt napsautus: ajastin eteenpäin/taaksepäin\n"
+"Pitkä napsautus: ajastimen näyttö ruudulla päälle/pois"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Toiston kesto"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Etsitään CDDB-listauksia..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Kappale %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Vcd-raita %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Videoasetukset"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Värisävy"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Värikylläisyys"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrasti"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Kirkkaus"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Äänen/videon sijainnin poikkeutus"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Tekstityksen sijainnin poikkeutus"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Yleinen varoitus: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Ei tietoja saatavilla."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Tietoturvavaroitus: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Palvelin johon yhteyttä yritetään muodostaa on tuntematon.\n"
+"Tarkista etta palvelimen nimi on.oikea. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Määritetty laite ei vaikuta olevan kelvollinen."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Verkkoon ei saada yhteytta.\n"
+"Tarkista verkkoasetuksesi ja palvelimen nimi. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Äänilähtö ei ole käytettävissa. Laite on varattu."
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Yhteydenmuodostus torjuttu.\n"
+"Tarkista palvelimen nimi. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"Määritettyä tiedostoa tai www-osoitettaa ei löytynyt. Ole hyvä ja tarkista se."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Pääsy tähän lähteeseen on evätty."
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Lähteestä ei voida lukea.\n"
+"Sinulla ei välttämättä ole tarvittuja oikeuksia, tai lähde ei sisällä dataa "
+"(esim ei levyä asemassa)."
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Ongelma ladattaessa kirjastoa tai purkajaa."
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Lähde vaikuttaa salatulta, eikä sitä voida lukea."
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Dvd vaikuttaa salatulta. Riippuen maan laeista, "
+"libdvdcss-salauksenpurkukirjastoa voidaan tai ei voida käyttää tämän dvd:n "
+"lukemiseen."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Tuntematon virhe. \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Virhe: Videoajuria %1 ei pystytä alustamaan - käytetään ajuria %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Käytettävä videoajuri: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Virhe: Ääniajuria %1 ei pystytä alustamaan - käytetään ajuria %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Käytettävä ääniajuri: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Käynnistä xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Xine-moottoria ei pystytä käynnistämään!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Käytettävä ääniajuri (oletus: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Käytettävä videoajuri (oletus: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Käytä ohjelmistopohjaista äänenvoimakkuudensäätöä"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Näytä viestit (osd) ruudulla"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Viestien (osd) koko"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Viestien (osd) kirjasin"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Videoajuria %1 ei voida käynnistää - yritetään videoajuria 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Jokaisen videoajurin alustus epäonnistui!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Ääniajuria %1 ei voida käynnistää - yritetään ääniajuria 'auto'"
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Kaikkien ääniajurien alustus epäonnistui!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Uutta xine-vuota ei voida luoda!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "Avataan digi-tv..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Avataan..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Äänikoodekki"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Videokoodekki"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Resurssin käsittelyyn ei löytynyt sopivaa liitännäistä"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Resurssi vaikuttaa rikkinäiseltä"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Pyydettyä resurssia ei ole olemassa"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Resurssia ei voida avata"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Yleinen virhe"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Vaiennus pois"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Vaiennus päällä"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Pikakelaus eteenpäin %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Hidastettu soitto %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Lomituksenpoisto: päällä"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Lomituksenpoisto: poissa"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Kuvasuhde"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+#, fuzzy
+msgid "Zoom X"
+msgstr "Lähennä X-suunnassa"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+#, fuzzy
+msgid "Zoom Y"
+msgstr "Lähennä Y-suunnassa"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msek"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Taajuuskorjaimen asetukset"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Äänenvoimakkuuden vahvistus"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Äänenvoimakkuuden vahvistus taajuuskorjainta varten - Jos ääni alkaa särkeä, "
+"ota tämä toiminto pois päältä."
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Poista suodatin"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Haetaan kohtaa %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "GStreamerin alustus epäonnistui!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Vaienna"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Kommentti"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "&GStreamer-moottorin parametrit"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreameria ei pystytty alustamaan!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"GStream-rekisteri puuttuu! Ajoitko <b>gst-register</b>"
+"-komennon (pääkäyttäjänä) asennuksen jälkeen?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Ääniajuria %1 ei voida käynnistää - yritetään toista ääniajuria..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Ei löydetty käyttökelpoista ääniajuria!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Videoajuria %1 ei voida käynnistää - yritetään muuta videoajuria..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Ei löydetty käyttökelpoista videoajuria!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "GStreamer-moottorin parametrit"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Äänen valinnat"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Mieluinen ääniajuri"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Videoasetukset"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Mieluinen videoajuri"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Uudelleenkäynnistystä vaaditaan!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Median asetukset"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Cd, vcd, dvd-asema"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Nämä kanavat ovat jo listassa eikä niitä lisätty:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Yhteyden muodostus X-palvelimeen epäonnistui!"
diff --git a/po/fr.po b/po/fr.po
new file mode 100644
index 0000000..77fb129
--- /dev/null
+++ b/po/fr.po
@@ -0,0 +1,3204 @@
+# translation of kaffeine.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER, 2003, 2004.
+#
+# Matthieu Philip <matthieu.philip@m4x.org>, 2004.
+# Nicolas Ternisien <nicolast@libertysurf.fr>, 2004.
+# Christophe Thommeret <hftom@free.fr>, 2005, 2006.
+# Nicolas Ternisien <nicolas.ternisien@gmail.com>, 2005.
+# Jiel Beaumadier <jiel@campux.org>, 2005.
+# Matthieu Robin <kde@macolu.org>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-11-21 15:49+0100\n"
+"Last-Translator: Christophe Thommeret <hftom@free.fr>\n"
+"Language-Team: <fr@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Guide des programmes"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Rafraîchir"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Tous les programmes de la chaîne"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Actuel / Suivant"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Chaîne"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Début"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Durée"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Titre"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Afficher tous les programmes"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Ajouter à la programmation"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Nom :"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Chaîne :"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Début :"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Durée :"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Fin :"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Enregistrer sous :"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Aucun"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Quotidien"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Hebdomadaire"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Mensuel"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Personnalisé"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Répétition ..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Éditeur de programmation"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Vous devez lui donner un nom !"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "La durée doit être d'au moins une minute !"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Le nom ne doit contenir aucun des caractères suivant : > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Configuration initiale du transpondeur"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Ce nom n'est pas unique."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "PID audio manquant !"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Le PID doit être différent de zéro !"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Vous devez choisir un ou des jours."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Chaînes"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Programmations"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Guide électronique des programmes"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Réglages DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Nombre"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Nom"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Pistes audio"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Enregistrement instantané"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Diffusion"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Différé"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Enregistrement"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Diffusion"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Sélectionner une icône"
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Choisir une icône"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Télévision numérique"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "La télévision numérique ne peut être vue qu'avec le moteur xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD Chaîne suivante"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD Chaîne précédente"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Zapper"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD Programme suivant"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD Programme précédent"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Afficher l'OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Programmations..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Diffusion..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Chaînes..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Configuration DVB ..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Tout"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Nouvelle catégorie ..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Changer l'icône ..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Supprimer la catégorie..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nouvelle catégorie"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Entrez un nom pour cette catégorie :"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Êtes-vous certain de vouloir supprimer cette catégorie ?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Impossible d'obtenir les données DVB depuis "
+"« http://hftom.free.fr/kaxtv/dvbdata.tar.gz » !"
+"<br>\t\t\tVérifiez votre connexion internet, et cliquez « Oui » pour réessayer."
+"<br>\t\t\tOu cliquez « Non » pour annuler."
+"<br>\t\t\tSi vous possédez déjà cette archive, copiez-la dans "
+"« ~/.kde/share/apps/kaffeine/dvbdata.tar.gz » et validez."
+"<br>"
+"<br>Dois-je réessayer ?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Échec de la diffusion."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Impossible de diffuser."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Programmation créée et démarrée avec succès."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Vous devez d'abord ajouter des chaînes !"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Programmation créée avec succès."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Enregistrement en cours."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Diffusion en cours."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Impossible de régler le tuner !"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Impossible de définir les PID"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Pas de CAM libre"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr ""
+"Kaffeine est entrain d'enregistrer. Êtes-vous certain de vouloir quitter ?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Kaffeine a des enregistrements en attente. Êtes-vous certain de vouloir quitter "
+"?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signal :"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR :"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Verrouillage :"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Editer..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Êtes-vous certain de vouloir supprimer toutes les chaînes ?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "DÉMARRER le scanner"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "STOPPER le scanner"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Arrêt..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Trouvé : %1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Impossible d'ouvrir la socket d'information DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Liste des programmations :"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Nouveau"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Arrêter/Supprimer"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Cette programmation est répétée. Voulez-vous passer la date courante ou "
+"supprimer la programmation entière ?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Passer la date courante"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Voulez-vous supprimer la programmation sélectionnée ?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Téléchargement ..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Copie des données..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Réglages DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Périphérique DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Réglages du périphérique"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Nom :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Type :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Cable"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Terrestre"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satellite"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Nombre de LNB :"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "Satellite 1 :"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Réglages LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "Satellite 2 :"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "Satellite 3 :"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "Satellite 4 :"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Réglages LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Source :"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Ce périphérique semble supporter l'<b><i>autoscan</i></b>. Choisissez <b>"
+"AUTO</b> dans la liste pour laisser Kaffeine rechercher les fréquences."
+"<br>SI l'<b><i>autoscan</i></b> echoue dans la recherche des chaînes, "
+"choisissez la Source correspondant à votre situation géographique dans la "
+"liste.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Si vous ne trouvez pas d'entrée pour votre ville/réseau dans la liste, "
+"vous devrez en crée une. Allez dans $HOME/.kde/share/apps/kaffeine/dvb-x/ et "
+"prenez un fichier existant comme point de départ. Entrez les valeurs pour votre "
+"ville/réseau et enregistrez ce fichier sous le nom crrespondant. Si vous pensez "
+"que votre fichier peut être utile à d'autre, envoyez le à "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Options d'enregistrement DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Répertoire des enregistrements :"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Répertoire des différés :"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Marge de début :"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minutes)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Marge de fin :"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Durée d'enregistrement instantané :"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Format préféré :"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Diffusion DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Adresse de diffusion :"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Port de diffusion :"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Port d'informations :"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Divers"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Table de caractères par défaut (redémarrage requis) :"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Mise à jour des données de scanner :"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Télécharger"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Enregistrer les évènements epg dans\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Enregistrement"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Greffons DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Impossible d'obtenir les données DVB depuis "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz !"
+"<br>\t\t\tVérifiez votre connexion internet, et cliquez « Oui » pour réessayer."
+"<br>\t\t\tOu cliquez « Non » pour annuler."
+"<br> Dois-je réessayer ?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Répertoire des enregistrements invalide."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Répertoire des différés invalide."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Les ports de diffusion et d'informations doivent être différents."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Adresse de diffusion non valable."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Réglages LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "LNB universel"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Duo LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Simple LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Duo LO fréquence de bascule :"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Fréquence bande basse :"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Fréquence bande haute :"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Fréquence simple LO :"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Vertical pol. LO frequency:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Horizontal pol. LO frequency:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Remise à zéro"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Impossible d'ouvrir la socket de diffusion DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Impossible d'initialiser la socket de diffusion DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Pas d'encodeur audio trouvé."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Échec du chargement de l'encodeur « %1 »."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Impossible de créer le dossier :"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "Mo"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "Ko"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Octets"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD audio"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Lire le CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Extraction"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artiste :"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album :"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Piste"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Selectionnez les pistes à extraire et cliquez sur le bouton <b>Encoder</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Encoder ..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Encoder un CD audio"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Lire un disque audio"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Lire un DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Lire un VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Lire un &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Lire un &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Lire un CD &audio"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Vous devez sélectionner les pistes à extraire."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Plusieurs CD audio trouvés. Choisissez celui que vous voulez lire :"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Pas de CD audio trouvé."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD Vidéo"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Plusieurs DVD vidéo trouvés. Choisissez celui que vous voulez lire :"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Plusieurs (S)VCD trouvés. Choisissez celui que vous voulez lire :"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Pas de titre"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Piste %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Recherche cddb locale ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Recherche cddb distante ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Found exact match cddb entry ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Found close cddb entry ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "Correspondances CDDB"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Plusieurs entrées CDDB approchantes. Choisissez en une :"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Un plugin d'encodage Lame mp3 pour Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Un plugin d'encodage Ogg Vorbis pour Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Client DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Impossible d'ouvrir la socket d'information DVB."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Impossible d'ouvrir le socket d'information !!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Impossible d'ouvrir le socket."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Impossible de définir les options du socket !!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Impossible d'ouvrir le socket !!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Toutes les tailles"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Trés petit"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Petit"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Moyen"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Grand"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Trés grand"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nouvelle recherche"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+"La pochette que vous avez choisi n'est pas disponible. Veuillez en sélectionner "
+"une autre."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Pochette non disponible"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Téléchargeur de pochette"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+"Pas d'images correspondantes trouvées, entrez de nouveaux termes de recherche :"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Entrez de nouveaux termes de recherche :"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Lecture"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Lecture du suivant / Ajouter à la file"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Tout &sélectionner"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Créer une liste à partir de la sélection"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Ajouter un sous-&titre..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "É&diter le titre"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Information"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Longueur"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artiste"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Année"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Genre"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Sous-titres"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "en cous d'utilisation"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt|Fichiers sous-titres\n"
+"*.*|Tous les fichiers"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Sélectionnez un fichier de sous-titres"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Choisir une pochette ..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Gallerie ..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtrer"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Liste de lecture :"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Choisir la liste de lecture active. Pour changer le nom de la liste, éditez-la "
+"et confirmez en appuyant sur la touche « Entrée »."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Lire la liste de lecture"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "Mode &répétition"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Lire en boucle la liste de lecture"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Mode aléa&toire"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Lire les pistes dans un ordre aléatoire"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Téléchargement Automatique des pochettes"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Téléchargement Automatique des pochettes"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Vider la liste de lecture"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Nouvelle liste de lecture"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importer une liste de lecture ..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Enregistrer la liste de lecture active sous..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "&Supprimer la liste de lecture active"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Listes de lecture Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Tous les fichiers"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Ouvrir une liste de lecture"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Listes de lecture M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Listes de lecture PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Enregistrer la liste de lecture"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Liste de lecture"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NOUVELLE"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importation des ressources du média..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(pas de sous-titres)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Autre sous-titrage..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Gallerie"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "File : %1 entrées, durée de lecture : %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Entrées : %1, Durée de lecture : %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Supprimer « %1 » de la liste et du disque ?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Ce nom de liste de lecture existe déjà"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Entrez un nom de liste de lecture différent:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Sélectionnez un sous-titrage"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Fichier de média :"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Sélectionner une vidéo"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Fichier de sous-titres:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Lecture / Pause"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Suivant"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Muet"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Lecteur Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Lecteur Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Jiel Beaumadier, Pascal Leroux, Nicolas Ternisien, Yannick Torrès"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"jiel@campux.org, kaffeine@gmx.net, nicolas.ternisien@gmail.com, "
+"yannick.torres@keliglia.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Un lecteur multimédia pour KDE 3, pouvant utiliser plusieurs moteurs de "
+"lecture, Xine étant celui par défaut (et recommandé)."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Les auteurs de Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Mainteneur actuel"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Auteur original"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "support CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Plusieurs correctifs."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Navigateur OSD pour DVB."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Correctifs des catégories DVB."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logo de Kaffeine 0.8 et autres icones."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Logo animé de Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Encodage alternatif pour les balises Meta. Beaucoup de correctifs."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Gestion des modules Xine. Beaucoup de correctifs."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Fichier de sous-titres."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Importation du M3U. Test."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Éditeur de PID de sous-titres"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID des sous-titres"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Nouvel élément"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Monter"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Descendre"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Actualiser la sélection"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Nouveau"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID :"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Page :"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Sous-page :"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Langue :"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Programmation répétée"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Éditeur des PID audio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "PID Audio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Éditeur de diffusion"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Chaînes disponibles :"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Liste de diffusion :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Clic droit pour éditer/supprimer)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Nouveau..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Chercher à propos de"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Décalage (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Commencer l'analyse"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtres"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Non cryptée"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Diffuseur :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Ajouter la sélection"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Ajouter par filtrage"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Trouvé"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Terminé"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Éditeur de chaînes"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "N° :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polarité"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Fréquence :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Taux symbole :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Cryptée"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID télétexte :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "ID de service :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID vidéo :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "ID de flux de transport :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PID de sous-titres..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "PID audio ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Bande passante :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "Haut FEC :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Transmission :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "Bas FEC :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Intervalle de garde :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hiérarchie :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulation :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversion :"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Préférences d'encodage"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Encodeur :"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Dossier de base :"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia :"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Aucun contrôle"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Mode normal"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Mode paranoïaque"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normaliser"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Barre de CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Options Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "Débit variable"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Débit :"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Options Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Qualité :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Liste de lecture"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Options de fermeture"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Lecteur"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "&Redimensionnement automatique"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Diffusio&n réseau"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigation"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Menus du &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Audio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Vidéo"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Aspect"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Barre d'outils de capture d'écran"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Barre des contrôles"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Barre de volume"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Barre de position"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Configuration de Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Comportement"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Mettre la vidéo en pause lorsque la fenêtre est minimisée"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Intégrer au tableau de bord"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sec"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "off"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Durée d'affichage du titre dans la boîte à miniatures"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Activer le client DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Options diverses"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Utiliser un encodage alternatif (non Unicode) pour les balises Meta"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Choisissez un nom d'encodage alternatif pour les balises Meta\n"
+"(afin de les convertir en Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Effacer la liste des fichiers récents"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Démarrer la lecture immédiatement"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Démarrer en plein écran"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Choisir le pilote audio"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Choisir le pilote vidéo"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Choisir le chemin du périphérique de disque Audio / VCD / DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Message de débogage de Xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Lancer l'assistant d'installation"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Fichier(s) à lire. Celui-ci peut être un fichier local, une URL, un dossier, un "
+"DVD, un VCD, ou encore un disque audio."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Démarrer"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Fenêtre de lecteur"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Formats de médias gérés"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Fichiers audio MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Fichiers vidéo MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Fichiers Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Fichiers AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Fichiers Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Fichiers Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Fichiers Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Fichiers FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Fichiers Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Fichiers WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Échec du chargement du module « %1 » du lecteur."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "Impossible de trouver %1 dans le chemin de recherche."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Ouvrir une &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Ouvrir un doss&ier..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Quitter et éteindre l'écran après cette piste"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Quitter après cette piste"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Quitter à la fin de la liste de lecture"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Mode minimal"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Basculer la &Liste de lecture / le Lecteur"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Conserver l'aspect &original"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Taille originale"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Taille double"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Taille triple"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Moteur de lecture"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Client DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Lecteur"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Fenêtre principale"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "Impossible de trouver l'extension Xserver DPMS."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Cela va quitter Kaffeine et éteindre l'écran après que le fichier ou la liste "
+"de lecture soit terminé(e). L'option « dpms » doit être présente dans votre "
+"fichier de configuration de X pour que l'écran puisse s'éteindre."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Ouvrir un ou plusieurs fichiers"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Lire une URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Saisissez une URL :"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Ouvrir un dossier"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Aucun %1 dans le lecteur, ou mauvais chemin vers le périphérique."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Veuillez sélectionner le périphérique correct :"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Assistant d'installation de Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Vérification de l'installation"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "OK."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr ""
+"Impossible de trouver le module. Veuillez vérifier votre installation !"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Version trouvée"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine requiert une version de KDE supérieure à %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Codecs « Win32 »"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Aucun codec « Win32 » trouvé dans « /usr/lib/win32 ». Vous ne pourrez pas lire "
+"les fichiers Windows Media 9, les fichiers Real Media les plus récents et "
+"certains formats peu communs. Téléchargez les codecs ici :"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"Impossible de trouver « libdvdcss ». Vous ne pourrez pas lire les DVD cryptés "
+"(surtout commerciaux). Vous pouvez obtenir la bibliothèque ici (mais l'utiliser "
+"peut violer les lois sur le copyright de votre pays !) :"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Lecteur DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Mode DMA inactif ! Pour une lecture fluide des DVD, lancez en mode "
+"superutilisateur :"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Impossible de vérifier le mode DMA. Permission refusée ou aucun périphérique "
+"trouvé :"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Périphérique DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Aucun périphérique DVB trouvé. Les fonctions DVB ne seront pas disponibles."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribution"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"La « xine-lib » fournie par SuSE « risque de ne pas avoir certaines "
+"fonctionnalités à cause de conditions légales (violation potentielle de "
+"brevets) ». Vous devriez utiliser les paquets disponibles ici :"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "RESULTAT"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+"Des problèmes ont été trouvé, mais cependant, Kaffeine devrait fonctionner."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Tout est valide !"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Utiliser Kaffeine comme application pour les flux « mms:// » (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Utiliser Kaffeine comme application pour les flux « rstp:// » (Real Media et "
+"autres)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Créer une icône Kaffeine sur le bureau"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Options d'installation"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Qualité de désentrelacement"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Utilisation très faible du processeur, qualité très faible.</b>"
+"<br>La moitié de la résolution verticale est perdue. Pour certains systèmes "
+"(avec des cartes vidéos PCI) cela peut faire baisser l'utilisation du "
+"processeur lorsque l'on compare à une lecture de vidéo pleine (sans "
+"entrelacement)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Utilisation faible du processeur, qualité faible.</b>"
+"<br>L'image est recopiée verticalement, les effets d'entrelacement sont donc "
+"supprimés."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Utilisation moyenne du processeur, qualité moyenne.</b>"
+"<br>L'image est analysée et les zones affichant des artefacts d'entrelacements "
+"sont corrigées (par interpolation)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Utilisation importante du processeur, bonne qualité.</b>"
+"<br>La conversion du format d'image DVD augmente la qualité et corrige les "
+"bogues d'échantillonnages chromatiques."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Utilisation très importante du processeur, très bonne qualité.</b>"
+"<br>En plus de l'utilisation d'algorithmes de désentrelacement, cela va "
+"également doubler le rafraîchissement de l'image (de 30 à 60 img/sec) afin de "
+"correspondre au taux d'une télévision. Détecte et inverse les 3-2 tirages bas. "
+"*"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Utilisation extrême du processeur, meilleure qualité avec des améliorations "
+"(expérimentales).</b>"
+"<br>Activation de la correction Judder (lecture des films à leur vitesse "
+"originelle de 24 img/sec) et lissage vertical des couleurs (corrige les petits "
+"écarts de couleurs que l'on peut apercevoir dans certains DVD). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Défini par l'utilisateur"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Configurer le module de désentrelacement de « tvtime »..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Nécessite un noyau 2.4 patché (comme celui de Red Hat) ou un noyau 2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Configurer le module de désentrelacement de « tvtime »"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Modules externes d'effet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Audio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Filtres audio"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Activer les filtres audio"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Ajouter un filtre"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Enlever tous les filtres"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Vidéo"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Filtres vidéo"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Activer les filtres vidéo"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Paramètres du moteur Xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 Options"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Options de débutant"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Options avancées"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Un module du lecteur basé sur Xine pour Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Le support SMIL (Synchronized Multimedia Integration Language) est rudimentaire "
+"!\n"
+"XinePart peut essayer de lire les sources vidéos sans aucun "
+"placement/disposition. Continuer ?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Enregistrer le flux sous"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Sous-titres"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Canal audio"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 sur %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|Fichier PNG\n"
+"*.bmp|Fichier BMP\n"
+"*.xbm|Fichier XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "&Enregistrer la capture d'écran sous"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Port de diffusion :"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Configurer la réception du flux de diffusion"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Adresse de l'expéditeur :"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port :"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Aller à la position :"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Erreur Xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Message Xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Prêt"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Lecture"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Fichier de sous-titres"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Enregistrer le flux sous"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Informations sur la piste"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Copier l'URL dans le presse-papiers"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Lire dans une fenêtre Kaffeine externe"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Envoyer un flux de diffusion..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Recevoir un flux de diffusion..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Enregistrer la capture d'écran..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Enregistrer le flux..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Enregistre le flux courant sur le disque dur. Cette fonctionnalité a été "
+"désactivée sur certains formats (ex : Real Media) pour éviter des problèmes "
+"légaux potentiels."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Basculer le mode minimal"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pause"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "Avance &rapide"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Ra&lenti"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Avancer (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Reculer (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Avancer (1min)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Reculer (1min)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Avancer (10min)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Reculer de (10min)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Aller à la position..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Menu DVD à gauche"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Menu DVD à droite"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Menu DVD en haut"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Menu DVD en bas"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Menu de sélection du DVD"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Piste sonore"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Sélectionnez une piste sonore"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Visualisation audio"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Augmenter le volume"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Baisser le volume"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Désentrelacer"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+"Activer ceci pour les flux entrelacés, certains DVD ont besoin de cette "
+"fonctionnalité."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorphique"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Carré"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Zoomer horizontalement"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Dé-zoomer horizontalement"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Zoomer verticalement"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Dé-zoomer verticalement"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Qualité de désentrelacement"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Configuration &vidéo"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Égalisateur"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Changer de &menu"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Titre"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Racine"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Sous-image"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "An&gle"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Partie"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Titres"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Chapitres"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Angles"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Informations sur la piste"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Modules externes d'effet..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Configuration du moteur &Xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volume"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Position"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Clic court : Affichage du temps passé ou restant\n"
+"Clic long : Affichage du temps à l'écran"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Durée de lecture"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Recherche des entrées CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Piste %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Piste %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Configuration vidéo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Nuance"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Saturation"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Contraste"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Luminosité"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Décalage audio / vidéo"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Décalage des sous-titres"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Avertissement général : \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Aucune information disponible."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Avertissement de sécurité : \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"L'hôte que vous tentez de joindre est inconnu.\n"
+"Veuillez vérifier la validité du nom de l'hôte spécifié."
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Le nom du périphérique spécifié semble invalide."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Le réseau semble inaccessible.\n"
+"Vérifiez la configuration de votre réseau et le nom du serveur."
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Sortie audio indisponible. Le périphérique est occupé."
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"La connexion a été refusée.\n"
+"Vérifiez le nom de l'hôte."
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"Impossible de trouver le fichier ou l'URL indiqué. Veuillez le vérifier."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "L'accès à la ressource a été refusée."
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"La source ne peut être lue.\n"
+"Vous n'avez sûrement pas les droits nécessaires pour cela, ou bien la source ne "
+"contient aucune donnée (ex : aucun disque dans le lecteur)."
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+"Un problème est survenu pendant le chargement d'une bibliothèque ou d'un "
+"décodeur : "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "La source semble cryptée et ne peut être lue."
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Votre DVD semble crypté. Selon les lois de votre pays, vous pouvez ou non "
+"utiliser « libdvdcss » afin de lire ce disque."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Erreur inconnue : \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Erreur : Impossible d'initialiser le nouveau pilote vidéo %1 - utilisation de "
+"%2 !"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Utilisation du pilote vidéo : %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Erreur : Impossible d'initialiser le nouveau pilote audio %1 - utilisation de "
+"%2 !"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Utilisation du pilote audio : %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Initialisation de Xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Impossible de démarrer le moteur Xine !"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Pilote audio à utiliser (par défaut : « auto »)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Pilote vidéo à utiliser (par défaut : « auto »)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Utiliser le mixeur audio logiciel"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Afficher les messages de l'OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Taille de la police OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Police des messages OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Impossible d'initialiser le pilote vidéo « %1 » - essai de « auto »..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Échec de l'initialisation de l'ensemble des pilotes vidéos !"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Impossible d'initialiser le pilote audio « %1 » - essai de « auto »..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Échec de l'initialisation de l'ensemble des pilotes audios !"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Impossible de créer un nouveau flux Xine !"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB : ouverture ..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Ouverture..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Codec audio"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Codec vidéo"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Aucun module trouvé pour prendre en charge cette ressource"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "La ressource semble être endommagée"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "La ressource demandée n'existe pas"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Impossible d'ouvrir la ressource"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Erreur générique"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Non Muet"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Muet"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Avance rapide %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Ralenti %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Désentrelacement activé"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Désentrelacement désactivé"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Aspect"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Zoom X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Zoom Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Réglages de l'égalisateur"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Gain de volume"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Gain de volume pour l'égalisateur - Si le son devient mauvais désactiver cette "
+"option"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Détruire le filtre"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Aller à %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Échec de l'initialisation de GStreamer !"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Muet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Commentaire"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Paramètres du moteur &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "Échec de l'initialisation de GStreamer !"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Le registre GStreamer est manquant ! Auriez-vous oublié d'exécuter <b>"
+"gst-register</b> (en tant que root) après installation ?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Impossible d'initialiser le pilote audio « %1 » - essai d'un autre..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Aucun pilote audio utilisable trouvé !"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Impossible d'initialiser le pilote vidéo « %1 » - essai d'un autre..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Aucun pilote vidéo utilisable trouvé !"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Paramètres du moteur GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Options audio"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Pilote audio préféré"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Options vidéo"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Pilote vidéo péféré"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Redémarrage requis !"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Média"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Options de média"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Lecteur CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Module inactif"
diff --git a/po/ga.po b/po/ga.po
new file mode 100644
index 0000000..9f2e489
--- /dev/null
+++ b/po/ga.po
@@ -0,0 +1,3174 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: extragear-multimedia/kaffeine.po\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2005-09-21 02:16-0500\n"
+"Last-Translator: Kevin Patrick Scannell <scannell@SLU.EDU>\n"
+"Language-Team: Irish <gaeilge-gnulinux@lists.sourceforge.net>MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Athnuaigh"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Sceidealta"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr ""
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Cainéal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Tosaigh"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Aga"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Teideal"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Féach ar Gach Clár"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Cuir leis na hUaineadóirí"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Ainm:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Cainéal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Tosach:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Aga:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Críoch:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Taifead mar:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Neamhní"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Go Laethúil"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Go Seachtainiúil"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Go Míosúil"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Saincheaptha"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Arís..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Eagarthóir Uaineadóra"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Caithfidh tú ainm a chur air!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"Ní cheadaítear aon cheann de na carachtair seo a leanas: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Bunsocruithe an Trasfhreagóra"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Níl an t-ainm uathúil."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "PID(anna) fuaime ar iarraidh!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr ""
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Ní mór duit laethanta a roghnú."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Cainéil"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Uaineadóirí"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Socruithe DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Uimhir"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Ainm"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Cainéil Fhuaime"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Taifead Meandarach"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Craoladh"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Aistriú ama"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Á thaifeadh"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Craolachán"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Roghnaigh deilbhín..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Roghnaigh deilbhín cainéil"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Teilifís Digiteach"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD An Chéad Chainéal Eile"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD An Cainéal Roimhe Seo"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Taispeáin OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Uaineadóirí..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Á Chraoladh..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Cainéil..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Cumraigh DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Gach Rud"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Raidió"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Catagóir Nua..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Athraigh Deilbhín..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Scrios Catagóir..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Catagóir Nua"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Iontráil ainm don chatagóir seo:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "An bhfuil tú cinnte gur mhaith leat an chatagóir seo a scriosadh?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Theip ar chraoladh."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Ní féidir craolachán a thosú."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "D'éirigh le cruthú agus tosú an uaineadóra."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "D'éirigh le cruthú an uaineadóra."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Á thaifeadadh fós."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Á chraoladh fós."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Ní féidir pid(anna) a shocrú"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Tá Kaffeine ag taifeadh fós. An bhfuil tú cinnte gur mhaith leat scor?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Tá uaineadóirí ciúáilte ag Kaffeine. An bhfuil tú cinnte gur mhaith leat scor?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Comhartha:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Glas:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Eagar..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "An bhfuil tú cinnte gur mhaith leat gach cainéal a scriosadh?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Á Stopadh..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Aimsíodh: %1 TV - %2 raidió"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr ""
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Liosta na n-uaineadóirí:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Nua"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Stop/Scrios"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr ""
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Scrios an t-uaineadóir roghnaithe?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Á Íosluchtú... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Comhaid shonraí á gcóipeáil..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Socruithe DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Gléas DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Socruithe Gléis"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Ainm:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Cineál:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Cábla"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Domhanda"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satailít"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Anaithnid"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Líon na LNBanna:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "An chéad sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Socruithe LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "An dara sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "An tríú sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "An ceathrú sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Socruithe LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Foinse:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Roghanna Taifeadta DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(nóiméad)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Críoch :"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Formáid de rogha:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Craoladh DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Seoladh craolta:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Port craolta:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Éagsúil"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Íosluchtaigh"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Dumpáil teagmhais epg i \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Dumpáil"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Breiseáin DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Comhadlann neamhbhailí taifead."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Seoladh neamhbhailí craolta."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Socruithe LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "LNB Comhchoiteann"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Athshocraigh"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Ní féidir soicéad craolta DVB a oscailt."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Ní féidir soicéad craolta DVB a thúsú."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr ""
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Theip ar luchtú ionchódóra '%1'."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Ní féidir fillteán a chruthú: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "kB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Beart"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD Fuaime"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Seinn CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Srac CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Ealaíontóir:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Albam:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Amhrán"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Ionchódaigh..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Ionchódú CD Fuaime"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Seinn CD Fuaime"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Seinn DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Seinn VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Oscail &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Oscail &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Oscail CD &Fuaime"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr ""
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Níor aimsíodh CD fuaime."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "Físeán DVD"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr ""
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Gan Teideal"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Amhrán %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr ""
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Cliant DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Ní féidir soicéad eolais a oscailt."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Ní féidir ceangal le soicéad eolais!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Ní féidir soicéad a oscailt."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Ní féidir rogha shoicéid a shocrú!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Ní féidir ceangal le soicéad!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Gach Méid"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "An-Bheag"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Beag"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Measartha"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Mór"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "An-Mhór"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Cuardach Nua"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Níl aon fháil ar an gclúdach roghnaithe. Roghnaigh ceann eile."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Níl an Clúdach ar Fháil"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Iontráil téarmaí nua cuardaigh:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Seinn"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Roghnaigh G&ach Rud"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Cruthaigh seinmliosta ó na cinn roghnaithe"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Cuir Fo&theideal Leis..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "Cuir T&eideal in Eagar"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Eolas"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Fad"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Ealaíontóir"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Albam"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Bliain"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Seánra"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Fotheideil"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "in úsáid"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Comhaid Fho-Theidil\n"
+"*.*|Gach Comhad"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Roghnaigh Comhad Fotheidil"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Roghnaigh Clúdach..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Gailearaí..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Scagaire"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Seinmliosta:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Seinn an Seinmliosta"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Arís"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Lúb an Seinmliosta"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Su&aitheadh"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Seinn míreanna in ord randamach"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Glan an Seinmliosta Reatha"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Seinmliosta Nua"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Iompórtáil Seinmliosta..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Sábháil an Seinmliosta Reatha Mar..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Bai&n an Seinmliosta Reatha"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Seinmliostaí Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Gach Comhad"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Oscail Seinmliosta"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Seinmliostaí M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Seinmliostaí PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Sábháil Seinmliosta"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Seinmliosta"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NUA"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Acmhainní meáin á n-iompórtáil..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(gan fotheideal)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Fotheideal eile..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Gailearaí"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Ciú: %1 Iontráil, Am Iomlán: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Iontrálacha: %1, Am seinnte: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Iontráil ainm difriúil ar an seinmliosta:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Roghnaigh Fotheideal"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Comhad meáin:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Roghnaigh Scannán"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Comhad fotheidil:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Seinn / Sos"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Ar Aghaidh"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Gan fuaim"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Seinnteoir Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Seinnteoir Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Séamus Ó Ciardhuáin,Kevin Scannell"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "seoc at iolfree.ie,scannell at slu dot edu"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "© 2003-2005, Údair Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Cothaitheoir reatha"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Bunúdar"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Tacaíocht CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr ""
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr ""
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr ""
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Iompórtáil M3U. Tástáil."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Mír Nua"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Bog Suas"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Bog Síos"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Nua"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Leathanach:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Fo-leathanach:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Teanga:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Eagarthóir Craolta"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Cainéil atá le fáil:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Liosta craolta:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Nua..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Fritháireamh (kHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Scagairí"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Soláthraí:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Aimsithe"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Críochnaithe"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Eagarthóir Cainéil"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Uimh:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaraíocht"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Minicíocht:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Scrofa"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID Teilitéacs:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID Físe:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Bandaleithead:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Tarchur:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Ordlathas:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modhnú:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inbhéartú:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Sainroghanna Ionchódaithe"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Ionchódóir:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Bunchomhadlann:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Gnáthmhód"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Mód Paranoia"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalaigh"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Roghanna Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Ráta giotán:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "kB/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Roghanna Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Cáilíocht :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Seinm&liosta"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr ""
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Seinnteoir"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Nascleanúint"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Roghchláir &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Fuaim"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Físeán"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "Cóimhe&as Treoíochta"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr ""
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Socrú Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Oibriú"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr ""
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Leabaigh i dtráidire an chórais"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " s"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "múchta"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr ""
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Cumasaigh cliant DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Roghanna Éagsúla"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr ""
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr ""
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Seinn anois láithreach"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Tosaigh sa mhód lánscáileán"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Socraigh tiománaí fuaime"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Socraigh tiománaí físe"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Socraigh an chonair ghléis VCD/DVD/CD-Fuaime."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Taispeáin teachtaireachtaí dífhabhtaithe xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Rith an treoraí suiteála"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Tosaigh"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Fuinneog an tSeinnteora"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr ""
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Comhaid Fhuaime MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Comhaid Fhíse MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Comhaid Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Comhaid AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Comhaid Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Comhaid Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Comhaid Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Comhaid FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Comhaid Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Comhaid WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr ""
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr ""
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Oscail &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Osca&il Comhadlann..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Scoir && Múch an Monatóir Tar Éis an Amhráin Seo"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Scoir Tar Éis an Amhráin Seo"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Scoir Tar Éis an tSeinmliosta"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Mód Íosta"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Scoránaigh &Seinmliosta/Seinnteoir"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr ""
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Bunmhéid"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Méid Dúbailte"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr ""
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Inneall Seinnteora"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Cliant DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Seinnteoir"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Príomhfhuinneog"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr ""
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Oscail Comha(i)d"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Oscail URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Cuir isteach URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Oscail Fillteán"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr ""
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr ""
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Treoraí Suiteála Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr ""
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ok."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Comhpháirt gan aimsiú. Déan seiceáil ar do chóras!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Aimsíodh leagan"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr ""
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "(Dí-)Chomhbhrúiteoirí WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Tiomántán DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Gléas DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Dáileadh"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "TORADH"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Tá go maith!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Cruthaigh deilbhín Kaffeine ar an deasc"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Roghanna Suiteála"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Cáilíocht an Díchrosfhí"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Sainithe ag an úsáideoir"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Cumraigh Breiseán Díchrosfhí tvtime..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Cumraigh Breiseán Díchrosfhí tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Breiseáin Mhaisíochta"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Fuaim"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Scagairí Fuaime"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Cumasaigh scagairí fuaime"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Cuir Scagaire Leis"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Bain Gach Scagaire"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Físeán"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Scagairí Físe"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Cumasaigh scagairí físe"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Paraiméadair Innill xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Roghanna le haghaidh %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Bunsocruithe"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Ardsocruithe"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Sábháil an Sruth Mar"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Fotheideal"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Cainéal Fuaime"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 as %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|Comhad PNG\n"
+"*.bmp|Comhad BMP\n"
+"*.xbm|Comhad XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Sábháil Seat den Scáileán Mar"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Port craolta:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Seoladh an tseoltóra:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Earráid xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Teachtaireacht xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Réidh"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Á Sheinm"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Comhad Fotheidil"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Sábháil an Sruth mar"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Cóipeáil URL go dtí an Ghearrthaisce"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Seol Sruth Craolta..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Sábháil Seat den Scáileán..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Sábháil an Sruth..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Scoránaigh an Mód Íosta"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Sos"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "&Mallghluaiseacht"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Cainéal Fuaime"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Díchrosfhigh"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Uathoibríoch"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorfach"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Cearnóg"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Cáilíocht an Díchrosfhí"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Socruithe &Físe"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Cothromóir"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Scoránú an Roghchláir"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Teideal"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Fréamh"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Fophictiúr"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "U&illinn"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Páirt"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Teidil"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Caibidlí"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Uillinneacha"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Paraiméadair Innill &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Imleabhar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Ionad"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Iontrálacha CDDB á lorg..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Amhrán AudioCD %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Amhrán VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Socruithe Físe"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Lí"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Sáithiú"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Codarsnacht"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Gile"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Fritháireamh Fuaime/Físe"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "uath"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Rabhadh Ginearálta: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Rabhadh Slándála: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Earráid anaithnid: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Túsaigh xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: á oscailt..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Á Oscailt..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "(Dí-)Comhbhrú Fuaime"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "(Dí-)Comhbhrú Físe"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Earráid ghinearálta"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Le Fuaim"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Gan Fuaim"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Mallghluaiseacht %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Díchrosfhí: ann"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Díchrosfhí: as"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Cóimheas Treoíochta"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Uathoibríoch"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Súmáil X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Súmáil Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Scrios Scagaire"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Gan fuaim"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Nóta"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Roghanna Fuaime"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Roghanna Físe"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Meáin"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Tiomántán CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "No player"
+#~ msgstr "Gan seinnteoir"
+
+#~ msgid "No layer"
+#~ msgstr "Gan sraith"
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "Comhpháirt Kaffeine"
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-C"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-T"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-S"
+
+#~ msgid "No DVD Video found."
+#~ msgstr "Níor aimsíodh Físeán DVD."
+
+#~ msgid "No (S)VCD found."
+#~ msgstr "Níor aimsíodh (S)VCD."
+
+#~ msgid "Developer"
+#~ msgstr "Forbróir"
+
+#~ msgid "DVB Support"
+#~ msgstr "Tacaíocht DVB"
+
+#~ msgid "DVD"
+#~ msgstr "DVD"
+
+#~ msgid "VCD"
+#~ msgstr "VCD"
+
+#~ msgid " min"
+#~ msgstr " nóiméad"
+
+#~ msgid "Open Files"
+#~ msgstr "Oscail Comhaid"
+
+#~ msgid "Open DVD"
+#~ msgstr "Oscail DVD"
+
+#~ msgid "Open VCD"
+#~ msgstr "Oscail VCD"
+
+#~ msgid "Audio Browser"
+#~ msgstr "Brabhsálaí Fuaime"
+
+#~ msgid "Name must not start with ( > )!"
+#~ msgstr "Ní cheadaítear slaiseanna ( / ) san ainm!"
+
+#~ msgid "Audio:"
+#~ msgstr "Fuaim:"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Roghnaigh Seinmliosta"
+
+#~ msgid "&Next in Playlist/Queue"
+#~ msgstr "A&n Chéad Cheann Eile sa Seinmliosta/Ciú"
+
+#~ msgid "Pre&vious in Playlist"
+#~ msgstr "An &Ceann Roimhe Seo sa Seinmliosta"
+
+#~ msgid "Next Channel"
+#~ msgstr "An Chéad Chainéal Eile"
+
+#~ msgid "Previous Channel"
+#~ msgstr "An Cainéal Roimhe Seo"
+
+#~ msgid "Go!"
+#~ msgstr "Téigh!"
+
+#~ msgid "Kaffeine Playlist"
+#~ msgstr "Seinmliosta Kaffeine"
+
+#~ msgid "Undock"
+#~ msgstr "Tóg as Duga"
+
+#~ msgid "Undock Playlist Window"
+#~ msgstr "Tóg Fuinneog an tSeinmliosta as an Duga"
+
+#~ msgid "Dock"
+#~ msgstr "Cuir i nDuga"
+
+#~ msgid "Properties:"
+#~ msgstr "Airíonna:"
+
+#~ msgid "Channels:"
+#~ msgstr "Cainéil:"
+
+#~ msgid "Delete all"
+#~ msgstr "Scrios gach rud"
+
+#~ msgid "Filters :"
+#~ msgstr "Scagairí :"
+
+#~ msgid "Found:"
+#~ msgstr "Aimsíodh:"
+
+#~ msgid "Select a subtitle"
+#~ msgstr "Roghnaigh fotheideal"
diff --git a/po/gl.po b/po/gl.po
new file mode 100644
index 0000000..fcb6282
--- /dev/null
+++ b/po/gl.po
@@ -0,0 +1,3209 @@
+# translation of kaffeine.po to
+# translation of kaffeine.po to Galician
+# Translation of Kaffeine to Galician
+# This file is distributed under the same license as the Kaffeine package.
+# Copyright (C) 2003 Juergen Kofler <juergen.kofler@chello.at>
+# Daniel Díaz De La Iglesia <danieldiazdelaiglesia@gmail.com>, 2006.
+# Xabi G. Feal <xabigf@gmx.net>, 2006.
+# daniel <daniel@dygrafilms.es>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-09-12 21:39+0200\n"
+"Last-Translator: Daniel Diaz De La Iglesia <danieldiazdelaiglesia@gmail.com>\n"
+"Language-Team: <gl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Actualizar"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Programado"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Actual/Seguinte"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Canle"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Comezo"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Duración"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Título"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Ver Todos os Programas"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Programar"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Nome:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Canle:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Comezo:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Duración:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Fin:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Gravar como:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Nada"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Diaria"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Semanal"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Mensual"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Auto"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "&Repetir..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Editor de programacions"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "¡Debe darlle un nome!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "¡A duración debe ser de polo menos un minuto!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"O nome non debe conter ningún dos seguintes caracteres: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Opcións iniciais do transpondedor"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Este nome non é único."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "¡Falta(n) pid(s) de audio!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "¡O pid debe ser diferente de cero!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Tes que elexir algúns días."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Canais"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Programacions"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Guía electrónica dos programas"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Opcións de DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Numero"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Nome"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Canles de Son"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Grabación instantánea"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Difusión"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Diferido"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Grabación"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Difusión (Broadcast)"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Seleccionar icono"
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Elixe icono de canal"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "TV Dixital"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "A TV dixital en directo só funciona co mecanismo xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Seguinte Canle OSD"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Anterior Canle OSD"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Zap "
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD Seguinte Evento"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Envento previo OSD"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Mostrar OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "(EPG) Guía dos programas..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Programacions..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Difusión ..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Canais..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Configurar DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Todo"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Nova categoría"
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Cambiar icono... "
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Borrar Categoria..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nova Categoría"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Introduce un nome para esta categoría"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "¿Realmente desexa borrar esta categoría?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Non se poden obter os datos DVB de "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t\t\tCompruebe a súa conexión a Internet, e pulse Sí para intentalo de "
+"novo."
+"<br>\t\t\tOu pulse Non para cancelar."
+"<br>\t\t\tSe xa ten este arquivo, cópieo a "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz e pulse Sí."
+"<br>"
+"<br>¿Intentalo de novo?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Fallou difusión (Broadcast)difusión DVB"
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Non podo iniciar difusión DVB (broadcasting)"
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Programación creada e iniciada con éxito."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Antes debería definir algunha canel!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Programación creada con éxito."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Todavía grabando. Non se pode cambiar."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Manter difusión DVB"
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "¡Non se pode sintonizar o DVB!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Non se poden definir os pids"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "CAM non está dispoñible"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine todavía está gravando. Realmente desexa saír?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine ten programacións en cola. ¿Realmente desexa sair? "
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Sinal: "
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR: "
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Bloqueo: "
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Editar..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "¿Realmente desexa borrar tódos-los canais?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "INICIAR a exploración"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "DETER a exploración"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Detendo..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Atopado: %1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Non podo abrir socket info DVB"
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Lista de programacións:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Novo"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Parar/Suprimir"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Esta programación está repetida..¿Queres saltar o traballo actual ou borrar "
+"esta programación?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Saltar actual"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "¿Borrar a programación seleccionada?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Descargando... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Copiando os ficheiros de datos..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Opcións de DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Dispositivo DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Opcións do dispositivo"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Nome:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tipo:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Cable"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Terrestre"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satélite"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Descoñecido"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Número de LNBs:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "Satélite 1:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Opcións de LNB:"
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "Satélite 2:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "Satélite 3:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "Satélite 4:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Opcións de LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Orixe:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Este dispostivo parece soportar a característica de <b><i>"
+"búsqueda automática</i></b> Ti podes elexir <b>AUTO</b> "
+"na lista de Orixes pra deixar a Kaffeine buscar por un rango de frecuencias."
+"<br>Si a<b><i>busqueda automática</i></b> non atopa os teus canais, eleixe un "
+"Orixe real dentro da lista.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Se non podes atopar a túa rede/lugar na lista, tu podes crear unha nova. "
+"Mira en $HOME/.kde/share/apps/kaffeine/dvb-x/ e colle un ficheiro existen como "
+"punto de partida.Cubreo cos valores das túas redes e dalle un nome descriptivo "
+"(sigue as convencións de nombrado) . Se consideras que o novo ficheiro pode ser "
+"útil pra outros, contribúe enviandoo a kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Opcións de grabación DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Directorio de grabacións:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Directorio de diferidos:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Marxe de comezo:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minutos)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Marxe de fin:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Duración da grabación instantánea:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Formato preferido:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "difusión DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Direccion de difusión:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Porto de difusión:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Porto de info:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Miscelánea"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Codificación por defecto (precísase reiniciar):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Actualizar os datos de exploración:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Descargar"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Volcar enventos epg a: \n"
+" ~/kaffeine_dvb_events.tx: "
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Volcar"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Plugins DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Non se poden obter os datos DVB de "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz !"
+"<br>\t\t\tComprobe a súa conexión a Internet, e pulse Sí para intentalo de "
+"novo."
+"<br>\t\t\tOu pulse Non para cancelar."
+"<br> ¿Intentalo de novo?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Directorio de grabacións non válido."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Directorio de diferidos non válido."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Portos de difusión (broadcast) e de info deben ser distintos."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Dirección de difusión (broadcast) non valida"
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Opcións de LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "LNB Universal"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "LO Dual"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "LO Unico"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Cambio frecuencia dual LO"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Frecuencia Lo-band"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Frecuencia Hi-band:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Frecuencia única LO"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "Frecuencia única LO"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "Frecuencia única LO"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "&Reiniciar"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Non podo abrir socket de difusión (broadcast) DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Non podo iniciar socket de difusión (broadcast) DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Non se puideron atopar codificadores de son."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Carga de codificador «%1» fallida"
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Imposíbel crear o cartafol: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bytes"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD Audio"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Reproducir CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Extraer CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artista"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Álbume:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Pista"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Escolla as pistas que queira extraer e prema no botón <b>Codificar</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Codificar..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Codificar CD Audio"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Reproducir un CD de audio"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Reproducir DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Reproducir VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Abrir un &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Abrir un &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Abrir un CD de&audio"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Precisa escoller as pistas a se extraer."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Varios CD de Audio atopados. Escolla un:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Non se atopou un CD de Audio."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "Vídeo DVD"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Varios DVD de Video atopados. Escolla un:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Varios (S)VCD atopados. Escolla un:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Sin Título"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Pista %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Procurando por unha entrada na cddb local ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Procurando por unha entrada na cddb remota ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Atopada unha entrada exacta na cddb ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Atopada unha entrada semellante na cddb ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Varios DVD de Video atopados. Escolla un:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Un plugin codificador de mp3 lame àra Kaffeine"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Un plugin para codificar Ogg Vorbis para Kaffaine"
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Cliente DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Non podo abrir socket "
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Non podo unirme a socket "
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Non podo abrir socket "
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Non podeo establecer opción de socket !!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Non podo abrir socket "
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Tódo-los tamaños"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Moi Pequena"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Pequena"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Media"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Grande:"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Moi Grande"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nova Procura:"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "A carátula que escolleu non está dispoñíbel. Por favor, escolla outra."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Carátula Non Dispoñíbel"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Descargar caratulas"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+"Non se atoparon imaxes coincidintes, por favor, insira novos termos de procura:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Insira novos termos de procura:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Reproducir"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Reproducir o seguinte/Engadir á cola"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Seleccionar &todo"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Crear unha lista de reproducción a partir da selección"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Engadir sub&títulos...."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Editar o título "
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Información"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Duración"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artista"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Álbume"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Ano"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Xénero"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Subtítulos"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "en uso"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Ficheiros de subtítulos\n"
+"*.*|Todo-los ficheiros"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Seleccionar un ficheiro de subtítulos"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Escolla unha Carátula..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galería..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtro"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Lista de reproducción:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Seleccionar a lista de reproducción activa. Pra cambiar o nombe da lista, "
+"edíteo e confirme con «Intro»."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Reproduci-la lista"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Repetir"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Reproducir en bucle"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Reproducción &aleatoria"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Reproducir os elementos nunha orde aleatoria"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Baixar caratulas automáticamente"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Bajando automáticamente caratulas"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "Eli&minar a lista de reproducción actual:"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Nova lista de reproducción"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importar unha lista de reproducción...."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Gravar a lista de reproducción actual coma...."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Eli&minar a lista de reproducción actual"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Listas de reproducción de Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Tódo-los ficheiros"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Abrir lista de reproducción"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Listas de reproducción M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Lista de reproducción PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Gravar a lista de reproducción"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Lista de reproducción"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NOVO"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importando os recursos de medios..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(sen subtítulos)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Outros subtítulos..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galería"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Cola: %1 entradas, Tempo de reproducción: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Entradas: %1, Tempo de reproducción: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "¿Eliminar «%1» da lista e o disco?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Esta lista de reproducción xa existe"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Poñer un nome distinto na lista de reproducción"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Seleccionar un subtítulo"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Ficheiro de media:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Seleccionar a película"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Ficheiro de subtítulos:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Reproduci-la lista"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Siguiente"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Mudo"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Reproductor Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Reproductor Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Daniel Díaz De La Iglesia"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "danieldiazdelaiglesia@gmail.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Un reproductor multimedia para KDE 3. Pode empregar varios motores pra a "
+"reproducción, sendo xine o predeterminado."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Os autores de Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Mantedor actual"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Autor orixinal"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Soporte para CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Varios parches de valor."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Parche de navegación DVB OSD"
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Parches de categorias DVB"
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logotipo para Kaffeine 0.8 e outros traballos de deseño."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animación do logotipo pra Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Codificación alternativa pra as metaetiquetas. Moitos parches."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Xestión dos complementos de xine. Moitos parches."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Importación do ficheiro de subtítulos."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Importación de M3U. Probas."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Editor PID de subtítulos:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Subtítulos PID's"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Novo elemento"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Subir "
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Baixar "
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Actualizar a Selección"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Novo"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid: "
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Paxina:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Sub paxina:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Idioma: "
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Programacion repetida"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Editor de pids de audio "
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "PIDs de Audio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Editor de difusión "
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Canais dispoñibles: "
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "lista de difusión "
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Pulse pra editar/borrar)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Novo..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Activar Buscar:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Desprazamento (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Iniciar Búsqueda"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtros"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Emisión en abierto"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Proveedor: "
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Engadir a selección "
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Engadir Filtro"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Atopado"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR: "
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Feito"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Editor de canais "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nº: "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaridade"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frecuencia: "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Tasa símbolo: "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Cifrado"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Pid de teletexto: "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "ID de servicio: "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Pid de vídeo: "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Id do fluxo de transporte:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Pid de subtítulos..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Pids de audio... "
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Ancho de banda:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC alto:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Transmisión:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC baixo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Intervalo de vixiancia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Xerarquía:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulación:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversión:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Preferencias de Codificación"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Codificador:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Directorio base:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Deshabilitar todas as comprobacións"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Modo normal"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Modo paranoia"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalizar"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Barra de CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Opcións de mp3 de lame"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Razón de bits:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Opcións de Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Calidade :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Lista de reproducción"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Salir de Opcións"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "Re&productor"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Habilitar o &redimensionamento automático"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Difusión por &red (broadcasting)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navegación"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Menús &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Audio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Vídeo"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Proporcións"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Barra de ferramentas de pantallazos...."
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Barra de controles"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Barra de volume"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Barra de posición"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Configuración de Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Comportamento"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Pausar o vídeo cando a fiestra sexa minimizada"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Embeber na bandexa do sistema"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " seg"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "desactivado"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Duración do anuncio do título na bandexa do sistema"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Activar cliente DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Opcións varias"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Usar unha codificación alternativa (non Unicode) pra as metaetiquetas"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Elixa o nome da codificación alternativa pra as metaetiquetas\n"
+"(pra convertilas a Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Limpa-la lista de ficheiros recentes"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Escomezar a reproducción inmediatamente"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Escomezar en modo de pantalla completa"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Seleccionar o controlador de audio"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Seleccionar o controlador de vídeo"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Seleccionar a ruta ó dispositivo CD de audio/VCD/DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Mostrar as mensaxes de depuración de Xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Executar o asistente de instalación"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Ficheiro(s) a reproducir. Pode ser un ficheiro local, unha URL, un directorio "
+"ou 'DVD', 'VCD', 'AudioCD'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Iniciar"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Fiestra de reproducción"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Formatos de media soportados"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Ficheiros de audio MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Ficheiros de vídeo MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ficheiros Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Ficheiros AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Ficheiros Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Ficheiros Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Ficheiros Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Ficheiros FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Ficheiros Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Ficheiros WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Fallo da carga da parte «%1» do reproductor."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "Non se atopou %1 na ruta de búsqueda."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Abrir unha &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Abrir un d&irectorio..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Sair e apagar o monitor despois desta pista."
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Sair despois desta pista"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Sair despois desta lista de reproducción"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "Modo &mínimo"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Conmutar lista de re&producción/lector"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Conservar o aspecto &orixinal"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Tamaño orixinal"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Tamaño dobre"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Tamaño triple"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Motor de re&producción"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Cliente DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Reproductor"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Fiestra principal"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "Non se atopou a extensión DPMS Xserver."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Esto cerrará Kaffeine e cortará a alimentación do monitor cando finalice a "
+"reproducción do ficheiro ou lista. O seu ficheiro de configuración de X debe "
+"ter a opción «dpms» para apagar o monitor."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Abrir ficheiro(s)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Abrir unha URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Introduza unha URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Abrir Carpeta"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Non hai ningún %1 no lector, ou ruta incorrecta ó dispositivo."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Por favor, seleccione o lector correcto:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Asistente de instalación de Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Verificación da instalación"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Aceptar."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Part non atopada. Por favor, comprobe a súa instalación."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Versión atopada"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine require KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Códecs Win32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Non se atopou ningún códec Win32 en /usr/lib/win32. Non poderá reproducir os "
+"ficheiros Windows Media 9, os ficheiros Real Media máis recientes e algúns "
+"formatos menos comúns. Descargueos códecs de eiquí:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"Non se atopou libdvdcss. Non poderá reproducir DVD cifrados (a maioría dos "
+"comerciais). Pode conseguir esta biblioteca eiquí (pero usala pode violar as "
+"leis do seu país):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Lector de DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Modo DMA desactivado. Pra uhna reproducción suave do DVD execute como root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Non se pode comprobar o modo DMA. Permiso denegado ou non existe o dispositivo:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Dispositivo DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Non se atopan dispositivos DVB. As funcións relativas a DVB vanse ocultar."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribución"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"A «xine-lib» proporcionada por SuSE «pode carecer dalgunas funcionalidades "
+"debido a requisitos legais (potencial violación de patentes)». Debería usar os "
+"paquetes dispoñibles aquí:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "RESULTADO"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+"Atopáronse problemas, pero Kaffeine pode funcionar aínda de todos modos."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "¡Todo ben!."
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Usar Kaffeine como aplicación auxiliar pros fluxos mms:// (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Usar Kaffeine como aplicación auxiliar prs fluxos rtsp:// (Real Media e demáis)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Crear un icono de Kaffeine no escritorio"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Opcións de instalación"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Calidade do desentrelazado"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Moi pouco uso do procesador, peor calidade.</b>"
+"<br>Perdese a metade da resolución vertical. Pra algúns sistemas (con tarjexas "
+"de vídeo PCI) esto pode reducir o uso do procesador en comparación co "
+"reproducción de vídeo sinxela (sen desentralazamento)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Pouco uso de procesador, calidade pobre.</b>"
+"<br>A imaxen é desenfocada verticalmente, eliminándose os efectos de "
+"entrelazamento."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Uso medio do procesador, calidade media.</b>"
+"<br>Analízase a imaxe e arranxanse (interpolan) as áreas que mostran efectos "
+"de entrelazamento."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Moito uso da CPU, boa calidade.</b>"
+"<br>A conversión do formato de imaxe de DVD mellora a calidade e arranxa o "
+"fallo de <i>upsampling</i> da crominancia."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Moitísimo uso do procesador , excelente calidade.</b>"
+"<br>Ademais de usar algoritmos de desentrelazamento intelixentes, tamén duplica "
+"a frecuencia dos fotogramas (30->60fps) pra facela coincidir coaa frecuencia de "
+"campo da televisión. Detecta e invirte <i>3-2 pulldown</i>. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Uso extremadamente alto do procesador, excelente calidade con melloras "
+"(experimentaies).</b>"
+"<br>Habilita a corrección de <i>judder</i> (reproduce películas á súa "
+"velocidade orixinal de 24 fps) e suavizado de color vertical (arranxa as "
+"pequenas tiras de cores que se ven nalgúns DVD). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Definida polo usuario"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Configurar o compremento de desentralazado de tvtime...."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Pode requerir un núcleo 2.4 parcheado (como o de Red Hat) ou el núcleo "
+"2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Configurar o compremento de desentralazado de tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Comprementos de efectos"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Audio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Filtros de audio"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Habilita-los filtros de audio"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Engadir filtro"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Eliminar tódos-los filtros"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Vídeo"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Filtros de vídeo"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr " Habilitar os filtros de vídeo"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Parámetros do motor xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 Opcións"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Opcións pra principiantes"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Opcións avanzadas"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Un \"part\" reproductor basado en xine para Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"A xestión de SMIL (Linguaxe de Integración de Multimedia Sincronizado) é "
+"rudimentaria.! \n"
+"XinePart tentará agora reproducir as fontes de vídeo contidas sen ningunha "
+"disposición. ¿Proseguir?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Gravar o fluxo coma..."
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Subtítulos"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Canle de son"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 de %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|Ficheiro PNG\n"
+"*.bmp|Ficheiro BMP\n"
+"*.xbm|Ficheiro XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "&Gravar volcado de pantalla como"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Porto de difusión "
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Configurar-&Recibir fluxo de difusión (broadcast)"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Dirección do remitente:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Porto:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Saltar á posición:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Erro de xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Mensaxe de xine:"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Preparado"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Reproducción"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Ficheiro de subtítulos"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Gravar o fluxo coma"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "&Información da pista"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Copiar a URL ó portapapeis"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Reproducir en Kaffeine externamente"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Enviar difusión de stream (broadcast)"
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Recibir difusión de stream (broadcast)"
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Gravar captura de pantalla..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Gravar Stream coma..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Garda o fluxo actual ó disco duro. Esta funcionalidade estaba desactivada pra "
+"algúns formatos (por ejempro Real Media) pra evitar potenciais problemas "
+"legais."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Cambiar a modo &mínimalista"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pausa"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Avanzar"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Cá&mara lenta"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Saltar adiante (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Saltar atrás ( 20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Saltar adiante (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Saltar atrás (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Saltar adiante (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Saltar atrás (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Saltar á Posición..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Menú DVD á esquerda"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Menú DVD á dereita"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Menú DVD arriba"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Menú DVD abaixo"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Seleccionar menú DVD"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Canle de Sudio"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Seleccione unha canle de son"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Visualización do audio"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Subir volume"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Baixar volume"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Desentralazar"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Activar esto pra fluxos entrelazados, algúns DVD por ejempro."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namórfico"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Cadrado"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Aumentar Zoom horizontal"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Reducir Zoom horizontal "
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Aumentar Zoom Vertical "
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Reducir Zoom Vertical"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Calidade do desentrelazado"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Configuración de &vídeo"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Ecualizador"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Cambiar &menú"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Título"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Raíz"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Subimaxe"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "Án&gulo"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Parte"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Títulos"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Capítulos"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Ángulos"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Información da pista"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Com&prementos de efectos..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Parámetros do motor de &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volume"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Posición"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Pulsación breve: Conmuta a programación cara adiante/atrás Pulsación longa: "
+"Conmuta a programación OSD"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Tempo de reproducción"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Buscando as entradas CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Pista do AudioCD %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Pista do VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Configuración de vídeo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Tono"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Saturación"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Contraste"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Brillo"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Desplazamento audio/vídeo"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Desplazamento dos subtítulos"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Advertencia xeral: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Non hay información dispoñible."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Advertencia de seguridade: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Non se coñece o servidor ó que se está intentando conectar.\n"
+"Comprobe a validez do nome de servidor indicado. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "O nome de dispositivo que indicou non parece ser válido. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Parece que non se pode acceder á rede.\n"
+"Comprobe a súa configuración de rede e o nome do servidor. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "A saída de audio non está dispoñible. O dispositivo está ocupado. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"A conexión foi rexeitada.\n"
+"Comprobe o nome do servidor. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Non se atopou o ficheiro ou URL indicado. Por favor, verifíqueo. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Non ten permisos pra acceder a esta fonte. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Non se pode ler a fonte.\n"
+"Pode ser que vostede non teña suficientes permisos pra acceder a ésta, ou que a "
+"fonte non conteña datos (por exemplo, que non haxa un disco na unidade). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+"Produciuse un erro mentras se cargaba unha biblioteca ou un decodificador: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "A fonte parece cifrada, e non se pode ler. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Probablemente o seu DVD esté cifrado. Segúndo as leis do seu país, vostede pode "
+"ou non usar libdvdcss pra poder ler este disco. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Erro descoñecido: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Erro: Non se pode inicializar o novo controlador de vídeo %1 - úsase %2."
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Controlador de vídeo usado: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Erro: Non se pode inicializar o novo controlador de audio %1 - úsase %2."
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Controlador de audio usado: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Inicialización de xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "¡Non se puido iniciar o motor de xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Controlador de audio a usar (predeterminado: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Controlador de vídeo a usar (predeterminado: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Usar o mesturador de audio por software"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Mostrar as mensaxes OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Tamaño do texto OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Tipo de letra das mensaxes OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"Non se pode inicializar o controlador de vídeo «%1» - intentando con «auto»..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Fallou a inicialización de tódo-los controladores de vídeo."
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"Non se pode inicializar o controlador de audio «%1» - intentando «auto»..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Fallou a inicialización de tódos-los controladores de audio."
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "¡Non se pode crear un novo fluxo de xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "Abrindo DVB..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Abrindo..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Códec de audio"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Códec de vídeo"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Non se atopou ningún compremento pra manexar este recurso"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "O recurso parece estar danado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "O recurso solicitado non existe"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Non se puede abrir o recurso"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Erro xenérico"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Sin sonido Desactivado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Sin Sonido Activo"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Avanzar %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Cámara lenta %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Desentralazamento: activado"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Desentralazamento: desactivado"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Proporcións"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Zoom X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Zoom Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr " ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Opcións do ecualizador"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Gañancia do volume"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Gañancia de volume do ecualizador - Se o son se volve ruidoso, desactive esta "
+"opción"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Borrar filtro"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Saltando a %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "¡Fallou a inicialización de GStreamer !"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Mudo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Comentario"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parámetros do motor de &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer non pode ser inicializado"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"¡Non atopo rexistro GStreamer! ¿Fixeches <b>gst-register</b> "
+"(como root) despois da instalación?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"Non se pode inicializar o controlador de audio «%1» - intentando con outro..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "!Non se atopa driver de audio utilizable!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"Non se pode inicializar o controlador de vídeo «%1» - intentando con outro..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "¡Non se atopa driver de video utilizable!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parámetros do motor GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Opcións de Audio"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Seleccionar o controlador de audio preferido"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Opciós de vídeo"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Seleccionar o controlador de vídeo preferido"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Necesario reiniciar"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Media:"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Opcións de Media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Unidade de CD,VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Part inútil"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Esta canle xa existe asi que non se engade nada:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "¡Non se puido conectar ó servidor X!"
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "Cerrar a fiestra principal manterá Kaffeine executándose na bandexa do sistema. Utilice Arquivo/Sair pra sair da aplicación."
+
+#~ msgid "No player"
+#~ msgstr "Ningún reproductor"
+
+#~ msgid "No layer"
+#~ msgstr "No layer"
diff --git a/po/he.po b/po/he.po
new file mode 100644
index 0000000..3c0ecfc
--- /dev/null
+++ b/po/he.po
@@ -0,0 +1,3292 @@
+# translation of kaffeine.po to HEBREW
+# This file is distributed under the same license as the PACKAGE package.
+# Assaf Gillat,<gillata@gmail.com> 2004,2005,2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-10-01 14:13+0200\n"
+"Last-Translator: Assaf Gillat\n"
+"Language-Team: HEBREW <kde-il@yahoogroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "רענן"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "מתוזמן"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "הנוכחי/הבא"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "ערוץ"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "התחל"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "משך זמן"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "שם רצועה"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "צפה בכל התוכניות"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "הוסף למתזמנים"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "שם:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "ערוץ:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "התחלה:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "משך זמן:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "סיום:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "הקלט בשם:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "ללא"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "יומי"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "שבועי"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "חודשי"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "מותאם אישית"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "חזור..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "עורך מתזמנים"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "חובה לתת שם."
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "משך הזמן צריך להיות לפחות דקה אחת."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "אסור שיופיעו הסימנים הבאים בשם: < > \\ / : /\" |."
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "הגדרות ראשוניות של המקלט"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "השם אינו ייחודי."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "חסר/ים pid שמע."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "ל־pid אסור להיות אפס."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "חובה לבחור ימים."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "ערוצים"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "מתזמנים"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "מדריך שידורים אלקטרוני"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "תצוגה על המסך"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "הגדרות DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "מספר"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "שם"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "ערוצי שמע"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "הקלטה מידית"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "שידור"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "העתקה בזמן"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "מקליט"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "שידור"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "בחר סמל..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "בחר סמל לערוץ"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "טלויזיה דיגיטלית"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "שידור חי של טלויזיה דיגיטלית עובד רק עם מנוע xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "תצוגה על המסך של הערוץ הבא"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "תצוגה על המסך של הערוץ הקודם"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "זפזף (OSD)"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "האירוע הבא (OSD)"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "אירוע קודם (OSD)"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "הראה הודעות על המסך"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "מתזמנים..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "שידור..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "ערוצים..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "הגדר DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "הכל"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "טלוויזיה"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "רדיו"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "קטגוריה חדשה..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "שנה סמל..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "מחק קטגוריה..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "קטגוריה חדשה"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "הכנס שם עבור קטגוריה זו:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "האם ברצונך למחוק את הקטגוריה הזאת?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>לא יכול להשיג מידע DVB מאתר http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tבדוק את חיבור האינטרנט שלך, ובחר כן על מנת לנסות שוב."
+"<br>\t\t\tאו בחר לא לביטול."
+"<br>\t\t\tאם יש לך כבר את הארכיב, העתק אותו אל "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz ובחר כן."
+"<br>"
+"<br>האם לנסות שוב?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "שידור נכשל."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "אי אפשר להתחיל שידור."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "מתזמן נוצר ואותחל בהצלחה."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "בוודאי תרצה להגדיר מספר ערוצים תחילה."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "מתזמן נוצר בהצלחה."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "עדיין מקליט."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "עדיין משדר."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "אין אפשרות לכוון dvb."
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "אי אפשר לכוון pid־ים"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "אין CAM פנוי"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "היישום Kaffeine עדיין מקליט. האם למרות זאת ברצונך לצאת?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "יש ל־Kaffeine מתזמנים בתור. האם למרות זאת ברצונך לצאת?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "אות:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "נעילה:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "ערוך..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "האם ברצונך למחוק את כל הערוצים?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "התחל סריקה"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "עצור סריקה"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "עוצר..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "נמצאו: %1 תחנות טלוויזיה - %2 תחנות רדיו"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "אי אפשר לפתוח שקע מידע של DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "רשימת מתזמנים:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "חדש"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "עצור/מחק"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"המתזמן הזה חוזר על עצמו. האם אתה רוצה לדלג על העבודה הנוכחית או למחוק את "
+"המתזמן?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "דלג על הנוכחי"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "מחק את המתזמן הנבחר?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "מוריד..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "מעתיק קבצי מידע..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "הגדרות DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "התקן DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "הגדרות התקן"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>שם:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>סוג:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "כבלים"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "ארצי"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "לויין"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "לא ידוע"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "מספר ה־LNB־ים:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "לוויין ראשון:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "אפשרויות LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "לוויין שני:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "לוויין שלישי:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "לוויין רביעי:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "אפשרויות LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "מקור:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>התקן זה כנראה תומך בתכונת <b><i>סריקה אוטומטית</i></b>. אתה יכול לבחור <b>"
+"אוטומטי</b> ברשימת המקורות על מנת ש Kaffeine תסרוק את טווח התדירויות."
+"<br>אם <b><i>סריקה אוטומטית</i></b> לא תמצא את הערוצים שלך , בחר מקור אמיתי "
+"ברשימה.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>אם אתה לא מוצא את הרשת/מיקום שלך ברשימה, אתה תצטרך ליצוא אחת. התסכל בתוך "
+"$HOME/.kde/share/apps/kaffeine/dvb-x/ וכך את הקובץ הקיים בתור נקודת התחלה. מלא "
+"עם ערכים את הרשת/מיקום ותן לזה שם מתאים (בהתאם למדיניות נתינת השמות). אם אתה "
+"חושב שהשם החדש יכול להתאים לאחרים, שלח אותו אל "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "אפשרויות הקלטת DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "תיקיית רשומות:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "תיקיית העתקה בזמן:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "התחלת מרווח:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(דקות)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "סיום מרווח:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "משך הזמן של הקלטה מידית:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "תבנית מועדפת:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "שידור DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "כתובת שידור:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "יציאת שידור:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "יציאת מידע:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "שונות"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "קידוד שפה כברירת מחדל (נחוץ איתחול):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "עדכן מידע סריקה:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "הורד"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"שפוך את אירועי ה-epg ל-\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "קובץ שפיכה"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "תוספי DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>אי אפשר להשיג מידע DVB מאתר http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tבדוק את חיבור האינטרנט שלך, ובחר כן לנסות שוב."
+"<br>\t\t\tאו בחר לא לביטול."
+"<br> האם לנסות שוב?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "תיקיית הקלטות לא תקינה."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "תיקיית העתקה בזמן לא תקינה."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "יציאות שידור ומידע חייבות להיות שונות."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "כתובת שידור לא תקינה."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "אפשרויות LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "התקן LNB אוניברסלי"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "התקן LO כפול"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "התקן LO בודד"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "תדירות ההחלפה של התקן LO כפול:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "תדירות band נמוכה:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "תדירות band גבוהה:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "תדירות LO בודד:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "תדירות LO של קוטביות אנכית:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "תדירות LO של קוטביות אופקית :"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "איפוס"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "אי אפשר לפתוח שקע שידור של DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "אי אפשר לאתחל שקע שידור של DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "לא נמצאו מקודדי שמע."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "טעינה של מקודד '%1' נכשלה."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "לא מסוגל ליצור תיקיה:"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "בתים"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "תקליטור שמע"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "נגן תקליטור"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "קרע תקליטור"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "ביצוע:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "כותר:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "רצועה"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "בחר את הרצועה שברצונך לקרוע ולחץ על כפתור <b>Encode</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "קודד..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "קידוד תקליטור שמע"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "נגן תקליטור שמע"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "נגן DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "נגן VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "פתח תקליטור &וידאו (DVD)"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "פתח &תקליטור וידאו (VCD)"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "פתח תקליטור &שמע"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "חובה לבחור את הרצועה שאותה תרצה לקרוע."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "נמצאו מספר תקליטורי שמע. בחר אחד:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "לא נמצא תקליטור שמע."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "וידאו DVD"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "נמצאו מספר תקליטורי וידאו DVD. בחר אחד:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "נמצאו מספר תקליטורי וידאו S)VCD). בחר אחד:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "ללא שם"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "רצועה %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "מחפש רשומת cddb מקומית ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "מחפש רשומת cddb מרוחקת ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "נמצאה רשומת cddb מדוייקת ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "נמצאה רשומת cddb קרובה ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "נמצאו מספר תקליטורי וידאו DVD. בחר אחד:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "תוסף מקודד mp3 של Lame עבור Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "תוסף מקודד Ogg Vorbis עבור Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "לקוח DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "אי אפשר לפתוח שקע מידע תקשורת."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "אי אפשר לקשור שקע מידע תקשורת."
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "אי אפשר לפתוח שקע תקשורת."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "לא מסוגל לקבוע אפשרות שקע תקשורת."
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "אי אפשר לקשור שקע תקשורת."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "כל הגדלים"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "קטנטן"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "קטן"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "בינוני"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "גדול"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "ענק"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "חיפוש חדש"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "העטיפה שבחרת לא זמינה. אנא בחר אחרת."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "עטיפה לא זמינה"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "מוריד העטיפות"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "לא נמצאו תמונות מתאימות, אנא הכנס מושג חיפוש חדש:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "הכנס מושג חיפוש חדש:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "נגן"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "נגן הבא/הוסף לתור"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "בחר ה&כל"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "צור רשימת ניגון מהבחירה"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "הוסף כ&תוביות..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&ערוך שם רצועה"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&מידע"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "אורך"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "נתיב/כתובת"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "ביצוע"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "כותר"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "שנה"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "סגנון"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "כתוביות"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "בשימוש"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|קבצי כתוביות\n"
+"*.*|כל הקבצים"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "בחר קובץ כתוביות"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "בחר עטיפה..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "גלריה..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "מסנן"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "רשימת ניגון:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"בחר את רשימת הניגון הפעילה. על מנת לשנות את שם הרשימה ערוך אותה ואשר עם "
+"\"Return\"."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "נגן רשימת ניגון"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&חזרה"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "נגן רשימת ניגון בלולאה"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&ערבוב"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "נגן פריטים בסדר אקראי"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "הורדת עטיפות אוטומטית"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "הורדת עטיפות אוטומטית"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "ה&סר רשימת ניגון נוכחית"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "רשימת ניגון &חדשה"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&יבא רשימת ניגון..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&שמור רשימת ניגון נוכחית בשם..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "ה&סר רשימת ניגון נוכחית"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "רשימות ניגון של Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "כל הקבצים"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "פתח רשימת ניגון"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "רשימות ניגון מסוג M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "רשימות ניגון מסוג PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "שמור רשימת ניגון"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "רשימת ניגון"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "חדש"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "מייבא משאבי מדיה..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(ללא כתוביות)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "כתובית אחרת..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "גלריה"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "תור: %1 כניסות, זמן ניגון: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "כניסות: %1, זמן ניגון: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "האם להסיר את \"%1\" מהרשימה ומהדיסק?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "רשימת ניגון כבר קיימת"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "הכנס שם רשימת ניגון אחרת:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "בחר כתובית"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "קובץ מדיה:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "בחר את הסרט"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "קובץ כתוביות:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "נגן/השהה"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&הבא"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "ה&שתק"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "נגן Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[נגן Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "אסף גילת"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "gillata@gmail.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"נגן מדיה עבור KDE 3. מסוגל להשתמש במנועי ניגון מרובים, ברירת המחדל (והמומלץ)הוא "
+"xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, היוצרים של Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "מתחזק נוכחי"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "מחבר מקורי"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "תמיכה ב CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "טלאים חשובים אחרים."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "טלאי עבור תצוגה על המסך של DVB."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "טלאים עבור קטגוריות של DVB."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "הלוגו עבור Kaffeine 0.8 ושאר עבודות אמנות."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "אנימציית לוגו של קפאין 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "קידוד חלופי של תגיות מידע. יצירת טלאים רבים."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "טיפול בתוצרי התוספים של xine. יצירת טלאים רבים."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "יבוא קבצי כתוביות."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "ייבוא רשימות M3U. בדיקות."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "עורך PID של הכתוביות"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "ה־PID־ים של הכתוביות"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "פריט חדש"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "העלה"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "הורד"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< עדכן בחירה"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< חדש"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "עמוד:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "עמוד Sub:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "שפה:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "מתזמן חוזר"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "עורך PID של שמע"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "ה־PID־ים של השמע"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "עורך שידורים"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "ערוצים זמינים:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "רשימת שידור:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(לחיצה ימנית לעריכה/מחיקה)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "חדש..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "חפש ב"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "היסט (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "התחל סריקה"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "מסננים"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "חופשי באוויר"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "ספק:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< הוסף בחירה"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< הוסף מסוננים"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "נמצא"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "סיים"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "עורך ערוצים"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "קוטביות"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "תדירות:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "קצב אותות:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "מעורבל"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "ה־PID של הטלטקסט:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "מזהה שירות:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "ה־PID של הווידאו:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "מזהה Transport stream:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "ה־PID של הכתוביות..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "ה־PID־ים של השמע..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "רוחב פס:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC גבוה:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "שידור:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC נמוך:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "פרק הזמן של ה־Guard:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "מדרג:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "אפנון:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "היפוך:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "העדפות קידוד"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "מקודד"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "תיקיית בסיס:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "פאראנויה:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "בטל את כל הבדיקות"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "מצב רגיל"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "מצב פאראנויה"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "נרמל"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "סרגל כלים תקליטור"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "אפשרויות Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "קצב סיביות"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "אפשרויות Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "איכות:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "רשימת &ניגון"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "אפשרויות יציאה"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&נגן"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "אפשר שינוי גודל &אוטומטי"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "שידור &רשת"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&ניווט"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "ת&פריט DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&שמע"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&וידאו"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&יחס תמונה"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "סרגל כלים תצלום מסך"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "סרגל כלים בקרה"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "סרגל כלים עצמת קול"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "סרגל כלים מיקום"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "הגדרות Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "התנהגות"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "השהה את הוידאו כאשר החלון ממוזער"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "שיבוץ במגש המערכת"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " שניות"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "מכובה"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "זמן הצגת הודעת שם רצועה במגש המערכת"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "אפשר לקוח DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "אפשרויות אחרות"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "השתמש בקידוד חלופי נוסף (לא יוניקוד) בשביל תגיות מידע"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"בחר שם קידוד חלופי עבור תגיות מידע\n"
+"(בכדי להפוך מקידוד זה ליוניקוד)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "נקה רשימת קבצים אחרונים"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "התחל לנגן מיד"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "התחל במצב מסך מלא"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "קבע מנהל התקן שמע"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "קבע מנהל התקן וידאו"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "קבע נתיב התקן תקליטור שמע/תקליטור וידאו VCD/תקליטור וידאו DVD"
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "הוצא הודעות ניפוי שגיאות של xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "הפעל אשף התקנה"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"קובץ/קבצים לניגון. יכול להיות קובץ מקומי, כתובת אינטרנט, תיקייה, \"DVD\", "
+"\"VCD\" או תקליטור שמע."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "התחל"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "חלון רשימת ניגון"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "תבניות מדיה נתמכות"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "קבצי שמע MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "קבצי וידאו MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "קבצי Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "קבצי AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "קבצי Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "קבצי מדיה של Real"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "קבצי Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "קבצי FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "קבצי מדיה של חלונות"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "קבצי WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "טעינה של חלק הנגן \"%1\" נכשלה."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "לא נמצא \"%1\" בנתיב החיפוש."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "פתח &כתובת..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "פתח תי&קייה..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "צא וכבה צג בסיום רצועה זאת"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "צא בסיום רצועה זאת"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "צא בסיום רשימת ניגון"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "מצב &מינימלי"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "&החלף בין רשימת ניגון/נגן"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "שמור &יחס תמונה מקורי"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "גודל מקורי"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "גודל כפול"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "גודל משולש"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "מנוע ה&נגן"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "לקוח DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "נגן"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "חלון ראשי"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "ההרחבה DPMS של Xserver לא נמצאה."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"אפשרות זאת תצא מ־Kaffeine ותכבה את הצג בסיום הקובץ/רשימת ניגון. האפשרות "
+"\"dpms\" חייבת להיות בתוך קובץ הקונפיגורציה של X על מנת שהצג יכבה."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "פתח קובץ(ים)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "פתח נתיב/כתובת"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "הכנס נתיב/כתובת:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "פתח תיקיה"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "אין %1 בכונן, או נתיב שגוי להתקן."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "בחר בבקשה את הכונן הנכון:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "אשף ההתקנה של Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "בדיקת התקנה"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "תקין."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "חלק לא נמצא. בבקשה בדוק את ההתקנה שלך."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "נמצאה גרסה"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine דורשת גרסת KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "מפענחי WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"אין מפענחי WIN32 בתיקייה /usr/lib/win32. אתה לא תהיה מסוגל לנגן קבצי מדיה של "
+"חלונות 9, קבצי מדיה חדשים של Real וסוגי מדיה לא נפוצים. הורד את המפענחים כאן:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"לא נמצא libdvdcss. אתה לא תהיה מסוגל לנגן תקליטורי DVD מקודדים (רוב המסחריים). "
+"אפשר להשיג את הספרייה כאן (אבל שימוש בה יכול להפר את חוקי זכויות היוצרים במדינה "
+"שלך.):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "כונן DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "מצב DMA מכובה. לנגינה חלקה של DVD יש להפעיל בתור root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "לא יכול לבדוק מצב DMA. הרשאה נדחתה או אין התקן כזה:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "התקן DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "לא נמצאו התקני DVB. הפונקציות הנוגעות ל-DVB יוסתרו."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "הפצה"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"ספרית xine-lib שמופצת על ידי SuSE \"חסרת מספר מאפיינים עקב דרישות חוקיות (הפרת "
+"פטנטים פוטנציאלית)\". רצוי להשתמש בחבילות מכאן:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "תוצאה"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "נמצאו מספר בעיות, אך למרות זאת Kaffeine יעבוד"
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "הכל תקין."
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"השתמש ב־Kaffeine בתור יישום עוזר של mms:// url (מדיה זורמת של מיקרוסופט)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"השתמש ב־Kaffeine בתור יישום עוזר של rtsp:// url (יישומי מדיה זורמת של Real "
+"ואחרים)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "צור סמל Kaffeine על שולחן העבודה"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "אפשרויות התקנה"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "איכות שזירת תמונה"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>שימוש נמוך ביותר במעבד, האיכות הגרועה ביותר.</b>"
+"<br>חצי מהרזולוציה האנכית הולכת לאיבוד. עבור מספר מערכות (עם כרטיסי וידאו PCI) "
+"זה יכול להקטין את השימוש במעבד בהשוואה לניגון וידאו רגיל (ללא שזירת תמונה)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>שימוש נמוך במעבד, איכות גרועה.</b>"
+"<br>התמונה מטושטשת אנכית ולכן אפקטי שזירת תמונה מוסרים."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>שימוש בינוני במעבד, איכות בינונית.</b>"
+"<br>התמונה מנותחת ואזורים המכילים רעשי רקע שזורים מתוקנים (על ידי אינטרפולציה)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>שימוש גבוה במעבד, איכות טובה.</b>"
+"<br>המרה של תבנית תמונת dvd משפרת איכות ומתקנת את איכות הצבע של תקלות דגימת "
+"יתר של תמונה."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>שימוש גבוה מאוד במעבד, איכות מעולה.</b>"
+"<br>חוץ משימוש באלגוריתם שזירה חכם אפשרות זו תגדיל את קצב המסגרות (מ30- ל60- "
+"מסגרות לשנייה) כדי להתאים לקצב רענון המסך בטלוויזיה. גילוי ותיקון תופעת 3-2 "
+"הנובעת מהמרת סרטים לפורמט NTSC. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>שימוש גבוה מאוד מאוד במעבד, איכות מעולה עם שיפורים (ניסיוניים).</b>"
+"<br> מאפשר תיקון סרטים ל24 מסגרות בשנייה כמו במקור והחלקת צבעים אנכית (תיקון "
+"פסי צבע שנראים בכמה סרטי DVD). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "הגדרות משתמש"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "הגדר תוסף שזירת תמונה של tvtime..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr "* <i> עשוי לדרוש קרנל 2.4 מוטלא (כגון אלו של RedHat) או קרנל 2.6 .</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "הגדר התקן שזירת תמונה של tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "תוספי אפקטים"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "שמע"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "מסנני שמע"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "הפעל מסנני שמע"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "הוסף מסנן"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "הסר את כל המסננים"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "וידאו"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "מסנני וידאו"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "הפעל מסנני וידאו"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "ערכי מנוע xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "אפשרויות %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "אפשרויות רגילות"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "אפשרויות מתקדמות"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "החלק מבוסס xine עבור Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"תמיכה ב־ (SMIL (Synchronized Multimedia Integration Language היא בסיסית ביותר.\n"
+"הנגן יכול לנסות לנגן את קטעי הווידאו המצורפים ב SMIL. האם לנסות?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "שמור זרם מידע בשם"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "כתובית"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "ערוץ שמע"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 - %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|קובץ־PNG\n"
+"*.bmp|קובץ־BMP\n"
+"*.xbm|קובץ־XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "שמור צילום מסך בשם"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "יציאת שידור:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "&הגדר זרם מידע קליטה"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "כתובת השולח:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "יציאה:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "קפוץ למיקום:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "שגיאת xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "הודעת xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "מוכן"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "מנגן"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "סוג קובץ"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "קובץ כתוביות"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "שמור זרם מידע בשם"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "מידע רצועה"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "העתק נתיב/כתובת ללוח העריכה"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "נגן ב Kaffeine חיצונית"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&שלח זרם מידע שידור..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&קבל זרם מידע שידור..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&שמור צילום מסך..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "שמור זרם מידע..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"שמור מידע זרם נוכחי לדיסק הקשיח. אפשרות זו בוטלה לתבניות מסוימות (לדוגמה: Real "
+"Media( על מנת למנוע בעיות חוקיות פוטנציאליות."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "החלפת מצב מינימלי"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "השהה"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "הילוך &מהיר"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "הילוך &אטי"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "דלג קדימה (20 שניות)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "דלג אחורה (20 שניות)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "דלג קדימה (1 דקה)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "דלג אחורה (1 דקה)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "דלג קדימה (10 דקות)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "דלג אחורה (10 דקות)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "קפוץ למיקום..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "תפריט DVD שמאלה"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "תפריט DVD ימינה"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "תפריט DVD למעלה"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "תפריט DVD למטה"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "תפריט DVD - בחירה"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "ערוץ שמע"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "בחר ערוץ שמע"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "ה&דמיית שמע"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "הגברת עוצמת קול"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "הפחתת עוצמת קול"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&שזירה"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "הפעל את זה בשביל זרם מידע שזור על אותו DVD לדוגמה."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "או&טומטי"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "א&נמורפי"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&ריבועי"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "התקרבות אופקית"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "התרחקות אופקית"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "התקרבות אנכית"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "התרחקות אנכית"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "איכות ש&זירה"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "הגדרות &וידאו"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&אקולייזר"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "החלפת &תפריט"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&כותר DVD"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&שורש"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&תמונה משנית"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&זווית"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "ח&לק"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "שמות הרצועות"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "פרקים"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "זוויות"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "מידע &רצועה"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&תוספי אפקטים"
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "פרמטרים של &מנוע הxine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "עוצמת קול"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "מיקום"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"לחיצה קצרה: החלפת כיוון מונה הזמן.\n"
+"לחיצה ארוכה: הפעלה/כיבוי של מונה הזמן המוטבע בתמונה."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "זמן ניגון"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "מחפש אחר רשומות CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "רצועת תקליטור שמע %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "רצועת (VCD) תקליטור וידאו %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "הגדרות וידאו"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "גוון"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "רוויה"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "חדות"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "בהירות"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "היסט שמע/וידאו"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "היסט כתוביות"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "אוטומטי"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"אזהרה כללית: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "אין מידע זמין."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"אזהרת אבטחה: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"השרת שאת מנסה להתחבר אליו לא ידוע.\n"
+"בדוק את תקינות שם השרת המבוקש. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "שם ההתקן שציינת נראה לא תקין. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"כנראה שאין גישה לרשת.\n"
+"בדוק את הגדרות הרשת ושם השרת."
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "יציאת שמע לא זמינה. ההתקן תפוס. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"החיבור נדחה.\n"
+"בדוק את שם השרת."
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "שם הקובץ המבוקש או הנתיב/כתובת לא נמצאו. בדוק זאת בבקשה. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "הרשאה למקור זה נדחתה. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"לא יכול לקרוא מהמקור.\n"
+"אולי אין לך מספיק זכויות למקור זה או שהמקור לא מכיל מידע (למשל: אין דיסק "
+"בכונן)."
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "תקלה אירעה בעת טעינת ספריה או מפענח: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "המקור נראה מוצפן, ולא ניתן לקריאה. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"תקליטור ה-DVD שלך כנראה מוצפן. לפי חוקי המדינה שלך, אתה יכול או לא להשתמש "
+"ב-libdvdcss על מנת לקרוא את התקליטור. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"תקלה לא ידועה: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "תקלה: לא יכול לאתחל את מנהל התקן הווידאו החדש %1 - משתמש ב- %2."
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "משתמש במנהל התקן וידאו: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "תקלה: לא יכול לאתחל את מנהל התקן השמע החדש %1 - משתמש ב- %2."
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "משתמש במנהל התקן שמע: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "אתחל xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "לא יכול לאתחל את מנוע הxine."
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "(שימוש במנהל התקן שמע (ברירת מחדל: אוטומטי"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "(שימוש במנהל התקן וידאו (ברירת מחדל: אוטומטי"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "השתמש במערבל שמע תוכנה"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "הראה הודעות על המסך"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "הגודל של הטקסט על המסך (OSD)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "גופנים בשביל הודעות טקסט על המסך (OSD)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "לא יכול לאתחל מנהל התקן וידאו \"%1\" - מנסה \"אוטומטי\"..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "כל מנהלי התקן הווידאו נכשלו באתחול."
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "לא יכול לאתחל התקן שמע \"%1\" - מנסה \"אוטומטי\"..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "כל מנהלי התקן השמע נכשלו באתחול."
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "לא מסוגל ליצור זרם-מידע xine חדש."
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "התקן DVB : פותח..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "פותח..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "מפענח שמע"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "מפענח וידאו"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "לא נמצא תוסף לטיפול במשאב זה"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "נראה שמשאב זה שבור"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "משאב מבוקש לא קיים"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "משאב לא יכול להיפתח"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "תקלה כללית"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "השתקה מבוטלת"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "השתקה מופעלת"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "הילוך מהיר %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "הילוך אטי %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "שזירה: פועל"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "שזירה: כבוי"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "יחס תמונה"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "אוטומטי"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "זום על ציר X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "זום על ציר Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr " מילי־שניות"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "הגדרות אקולייזר"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "הגבר עוצמת שמע"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "הגברת עוצמת הקול של האקולייזר - אם יש רעשים בשמע, בטל אפשרות זאת"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "מחק מסנן"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "מכוון ל־%s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "אתחול GStreamer נכשל."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "השתק"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "הערה"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "פרמטרים של &מנוע הGStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "אי אפשר לאתחל את GStreamer."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"חסר קובץ רישום של GStreamer. האם שכחת להריץ <b>gst-register</b> "
+"(בתור root) אחרי ההתקנה?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "לא יכול לאתחל התקן שמע \"%1\" - מנסה אחד אחר..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "לא נמצא התקן שמע ראוי לשימוש."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "לא יכול לאתחל מנהל התקן וידאו \"%1\" - מנסה אחד אחר..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "לא נמצא התקן וידאו ראוי לשימוש."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "משתני מנוע GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "אפשרויות שמע"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "מנהל התקן שמע מועדף"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "הגדרות וידאו"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "מנהל התקן וידאו מועדף"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* הפעלה מחדש חובה."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "מדיה"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "אפשרויות מדיה"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "כונן CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "הערוצים הללו כבר קיימים ולכן לא הוספו:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "נכשל בחיבור לשרת ה־X."
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "סגירת החלון הראשי תשאיר את הנגן Kaffeine במגש המערכת. השתמש ביציאה מתפריט קובץ על מנת לצאת מהיישום."
+
+#~ msgid "No player"
+#~ msgstr "אין נגן"
+
+#~ msgid "No layer"
+#~ msgstr "ללא שכבה"
+
+#~ msgid "Ch %1"
+#~ msgstr "ערוץ %1"
+
+#~ msgid "Alternate Layout"
+#~ msgstr "תצורת תצוגה חליפית"
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "החלק של Kaffeine"
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-C"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-T"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-S"
+
+#~ msgid "Developer"
+#~ msgstr "מפתח"
+
+#~ msgid "DVB Support"
+#~ msgstr "תמיכה ב DVB"
+
+#, fuzzy
+#~ msgid "DVD"
+#~ msgstr "&DVD"
+
+#~ msgid " min"
+#~ msgstr " דקות"
+
+#~ msgid ""
+#~ "Interval to fake keypresses\n"
+#~ "(prevent screensaver from activating)"
+#~ msgstr ""
+#~ "פרק זמן לפברוק לחיצת מקש\n"
+#~ "(מונע משומר המסך לפעול)"
+
+#~ msgid "Open Files"
+#~ msgstr "פתח קבצים"
+
+#~ msgid "Open Directory"
+#~ msgstr "פתח תיקייה"
+
+#~ msgid "Open DVD"
+#~ msgstr "פתח תקליטור וידאו DVD"
+
+#~ msgid "Open VCD"
+#~ msgstr "פתח תקליטור וידאו VCD"
+
+#, fuzzy
+#~ msgid "This player doesn't support DVD playback."
+#~ msgstr "הנגן לא תומך בניגון %1."
+
+#, fuzzy
+#~ msgid "This player doesn't support VCD playback."
+#~ msgstr "הנגן לא תומך בניגון %1."
+
+#, fuzzy
+#~ msgid "This player doesn't support Audio CD playback."
+#~ msgstr "הנגן לא תומך בניגון %1."
+
+#~ msgid "Create Go!-Tab"
+#~ msgstr "צור כרטיסיית התחל"
+
+#, fuzzy
+#~ msgid "Audio Browser"
+#~ msgstr "מפענח שמע"
+
+#~ msgid "Name must not start with ( > )!"
+#~ msgstr "אסור לשם להתחיל בסימן ( < )."
+
+#~ msgid "Audio:"
+#~ msgstr "שמע:"
+
+#~ msgid "Playlist Toolbar"
+#~ msgstr "סרגל כלים רשימת ניגון"
+
+#~ msgid "Select Playlist"
+#~ msgstr "בחר רשימת ניגון"
+
+#~ msgid "&Next in Playlist/Queue"
+#~ msgstr "ה&בא ברשימת ניגון/תור"
+
+#~ msgid "Pre&vious in Playlist"
+#~ msgstr "ה&קודם ברשימת ניגון"
+
+#~ msgid "Next Channel"
+#~ msgstr "הערוץ הבא"
+
+#~ msgid "Previous Channel"
+#~ msgstr "הערוץ הקודם"
+
+#~ msgid "Go!"
+#~ msgstr "התחל"
+
+#, fuzzy
+#~ msgid "Kaffeine Playlist"
+#~ msgstr "רשימות ניגון של Kaffeine"
+
+#~ msgid "Undock"
+#~ msgstr "בטל עגינה"
+
+#~ msgid "Undock Playlist Window"
+#~ msgstr "בטל עגינה של חלון רשימת ניגון"
+
+#~ msgid "Dock"
+#~ msgstr "עגינה"
+
+#~ msgid "Browse Next"
+#~ msgstr "דפדף לבא"
+
+#~ msgid "Browse Previous"
+#~ msgstr "דפדף לקודם"
+
+#~ msgid "Browse Zap"
+#~ msgstr "דפדף ל-Zap"
+
+#~ msgid "Browse Forward"
+#~ msgstr "דפדף קדימה"
+
+#~ msgid "Browse Backward"
+#~ msgstr "דפדף אחורה"
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..d3a8a7f
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,3185 @@
+# Károly Barcza <kbarcza@blackpanther.hu>, 2004.
+# Marcel Hilzinger <marcel@hilzinger.hu>, 2004, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: hu\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-11-27 11:46+0100\n"
+"Last-Translator: Tamas Szanto <tszanto@interware.hu>\n"
+"Language-Team: Hungarian <hu@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Frissítés"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Ütemezett"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Jelenlegi/Következő"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Csatorna"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Kezdet"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Időtartam"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Cím"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Az összes program megtekintése"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Hozzáadás az időzítőhöz"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Név:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Csatorna:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Kezdet:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Időtartam:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Befejezés:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Felvétel:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Nincs"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Naponta"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Hetente"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Havonta"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Egyéni"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Ismétlés..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Időzített felvételek"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Meg kell adni egy nevet"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Az időtartam nem lehet rövidebb 1 percnél."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "A név nem tartalmazhatja a következő karaktereket: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Kezdeti transzponder-beállítások"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "A név nem egyedi."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Nincs hangbemenet (pid)."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "A pid értéke nem lehet nulla."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Legalább egy napot ki kell választani."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Csatornák"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Időzített felvételek"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronikus műsorújság"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB-beállítások"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Szám"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Név"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Hangcsatornák"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Azonnali felvétel"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Sugárzás"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Csúsztatott felvétel"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Felvétel"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Sugárzás"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Válasszon egy ikont..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Csatornaikon választása"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digitális TV"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Élő digitális TV-adást csak a xine modullal lehet megnézni."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Következő csatorna (OSD)"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Előző csatorna (OSD)"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Zap (OSD)"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Következő esemény (OSD)"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Előző esemény (OSD)"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "OSD üzenetek megjelenítése"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "Műsorújság..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Időzítők..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Sugárzás..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Csatornák..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "A DVB beállításai..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Minden"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Rádió"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Új kategória..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Más ikon..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Kategória törlése..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Új kategória"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Adjon egy nevet a kategóriának:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Biztosan törölni szeretné ezt a kategóriát?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Nem érhetők el DVB-adatok itt: http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tEllenőrizze az internetkapcsolatot, majd nyomja meg újból az Igen "
+"gombot."
+"<br>\t\t\tVagy nyomja meg a Nem gombot a művelet megszakításához."
+"<br>\t\t\tHa már rendelkezik ezzel az archívummal, másolja át "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz néven és kattintson az Igen gombra."
+"<br>"
+"<br>Meg szeretné próbálni még egyszer?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "A sugárzás nem sikerült."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Nem sikerült elkezdeni a sugárzást."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Az időzítő beállítása és elindítása sikeresen megtörtént."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Legalább egy csatornát célszerű beállítani."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Az időzítőt sikerült létrehozni."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Még tart a felvétel."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Még tart a sugárzás."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "A DVB hangolása nem sikerült."
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "A pid beállítása nem sikerült."
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Nincs szabad CAM"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Még tart egy felvétel, biztosan ki szeretne lépni?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Be van állítva legalább egy időzített felvétel. Biztosan ki szeretne lépni?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Jel:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Zárolás:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Szerkesztés..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Valóban törölni szeretné az összes csatornát?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Csatornakeresés indítása"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "A csatornakeresés leállítása"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Leállítás..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "A keresés eredménye: %1 TV- és %2 rádióállomás"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Nem sikerült megnyitni egy DVB-információs aljazatot."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Időzített felvételek:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Új"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Állj/Törlés"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Ez az időzítő ismétlődő. Ki szeretné hagyni az aktuális feladatot vagy inkább "
+"törli az időzítőt?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Az aktuális átugrása"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Törölni szeretné a kijelölt időzített felvételt?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Letöltés... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Adatfájlok másolása..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB-beállítások"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB-eszköz"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Eszközbeállítások"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Név:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Típus:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kábeles"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Földi sugárzású"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Műholdas"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Ismeretlen"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Az LNB-k száma:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1. műhold:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB-beállítások..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2. műhold:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3. műhold:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4. műhold:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB-beállítások..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Forrás:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Az eszköz támogatja az <b><i>automatikus csatornakeresést</i></b>"
+". Válassza az <b>AUTO</b> lehetőséget a forráslistából, hogy a Kaffeine "
+"automatikusan végigkeresse a frekvenciatartományokat."
+"<br>Ha az <b><i>automatikus keresés</i></b> mégsem találná meg a csatornákat, "
+"válassza ki a konkrét forrást a listában.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Ha nem talál egy kívánt hálózatot vagy forrást a listában, akkor fel "
+"kell vennie. Nézze meg a $HOME/.kde/share/apps/kaffeine/dvb-x/ könyvtár "
+"tartalmát és induljon ki egy már létrehozott fájlból. Adja meg a hálózat vagy "
+"hely adatait és válasszon egy megfelelő nevet (célszerű betartani a "
+"névkonvenciót). Ha úgy gondolja, hogy a fájl más számára is használható lehet, "
+"kérjük küldje el a kaffeine-user(AT)lists.sf.net címre.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Felvételi beállítások (DVB)"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "A felvételek könyvtára:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "A csúsztatott felvételek könyvtára:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Kezdési ráhagyás:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(perc)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Befejezési ráhagyás:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Az azonnali felvétel hossza:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Alapértelmezett formátum:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB-s sugárzás"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Sugárzási cím:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Sugárzási port:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Információs port:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Vegyes"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Alapértelmezett karakterkészlet (csak újraindításkor aktiválódik):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "A keresési adatok frissítése:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Letöltés"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"A műsorújság-események mentése ide:\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Lementés"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB-modulok"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Nem érhetők el DVB-adatok itt: http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t\t\tEllenőrizze az internetkapcsolatot, majd nyomja meg az Igen gombot."
+"<br>\t\t\tVagy nyomja meg a Nem gombot a művelet megszakításához."
+"<br> Meg szeretné próbálni még egyszer?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Érvénytelen felvételi könyvtár."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Érvénytelen könyvtár a csúsztatott felvételekhez."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "A sugárzási és az információs port nem egyezhet meg."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Érvénytelen sugárzási cím."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB-beállítások"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Univerzális LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band többpontos LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Kettős LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Egyszeres LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Kettős LO-frekvencia:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Lo-band frekvencia:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Hi-band frekvencia:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Egyszeres LO-frekvencia:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Függőleges LO-frekvencia:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Vízszintes LO frekvencia:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Alapállapot"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Nem sikerült megnyitni a DVB-sugárzási aljazatot."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Nem sikerült inicializálni a DVB-sugárzási aljazatot."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Nem található hangkódoló."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "A(z) '%1' kódoló betöltése nem sikerült."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Nem sikerült létrehozni ezt a könyvtárat: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "bájt"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Hang-CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "CD lejátszása"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "CD rippelése"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Előadó:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Szám"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Válassza ki a kimásolandó számokat, majd kattintson a <b>Kódolás</b> gombra."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Kódolás..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Hang-CD-kódolás"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Hang-CD lejátszása"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "DVD lejátszása"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "VCD lejátszása"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "&DVD megnyitása"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "&VCD megnyitása"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "&Hang-CD megnyitása"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Ki kell választani, mely számokat szeretné kimásolni."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Több hang-CD is elérhető, válasszon ki egyet:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Nem található hang-CD."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "Videó-DVD"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Több videó-DVD is elérhető, válasszon ki egyet:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Több (S)VCD is elérhető, válasszon ki egyet:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Nincs cím"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "%1. szám"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Helyi CDDB-bejegyzések keresése..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Távoli CDDB-bejegyzések keresése..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Pontosan illeszkedő CDDB-találatok..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Majdnem illeszkedő CDDB-bejegyzés..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB-találatok"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Több majdnem illeszkedő CDDB-bejegyzés található, válasszon ki egyet:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Lame MP3-kódoló modul a Kaffeine-hez."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Ogg Vorbis-kódoló a Kaffeine-hez."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB-kliens"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Nem sikerült megnyitni egy információs aljazatot."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Nem sikerült csatlakozni egy információs aljazathoz."
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Nem sikerült megnyitni egy aljazatot."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Nem sikerült beállítani egy aljazatopciót."
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Nem sikerült csatlakozni egy aljazathoz."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Minden méret"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Nagyon kicsi"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Kicsi"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Közepes"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Nagy"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Nagyon nagy"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Új keresés"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "A kiválasztott borító nem érhető el, válasszon egy másikat."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Nem érhető el a borító"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Borító letöltése"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Nem található megfelelő kép, adjon meg más kifejezést:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Új keresési kifejezés:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Lejátszás"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Következő lejátszása/hozzáadás a listához"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Öss&zes kiválasztása"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Lejátszólista létrehozása a kiválasztott objektumokból"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Felira&t hozzáadása..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "A cím s&zerkesztése"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Információ"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Hossz"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Előadó"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Év"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Műfaj"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Feliratok"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr " használatban"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.ssa *.asc|Feliratfájlok\n"
+"*.*|Minden fájl"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Feliratfájl kiválasztása"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Borító kiválasztása..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Képgyűjtemény..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Szűrő"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Lejátszólista:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Válassza ki az aktuális lejátszólistát. A lejátszólista átnevezéséhez, "
+"szerkessze azt, majd nyomja meg az Enter-t."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Lejátszólista lejátszása"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "Meg&ismétlés"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Végtelenített lejátszás"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Véletlen&szerűen"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Elemek lejátszása véletlen sorrendben"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Automatikusan letöltött borítók"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "A borítók automatikus letöltése"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "Az aktuális lejátszólista &törlése"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Ú&j lejátszólista"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "Lejátszólista &importálása..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "Lejátszólista mentése má&s néven..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Aktuális lejátszólista &törlése"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine-lejátszólisták"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Minden fájl"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Lejátszólista megnyitása"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U-lejátszólisták"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS-lejátszólisták"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Lejátszólista mentése"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Lejátszólista"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "ÚJ"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Médiaerőforrások betöltése..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(nincs felirat)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Más felirat..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Képgyűjtemény"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "A sorban: %1 bejegyzés, lejátszási idő: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "%1 bejegyzés, lejátszási idő: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "%1 törlése a listáról és a merevlemezről?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Ilyen nevű lejátszólista már létezik"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Adjon más nevet a lejátszólistának:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Válasszon ki egy feliratot"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Médiafájl:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Válasszon ki egy filmet"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Feliratfájl :"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Lejátszás / Szünet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Következő"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Elnémítás"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine médialejátszó"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine médialejátszó]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Marcel Hilzinger,Szántó Tamás"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "marcel@hilzinger.hu,tszanto@interware.hu"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Médialejátszó a KDE 3-hoz. Alapvetően a xine lejátszóra épül, de tud más "
+"médilejátszókat is használni."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) A Kaffeine szerzői, 2003-2005."
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Jelenlegi karbantartó"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Eredeti szerző"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM-támogatás"
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Fontos foltok."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "DVB OSD-böngésző folt"
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "DVB-kategóriák folt."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "A Kaffeine 0.8 logója és más grafikák."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animált logó a Kaffeine 0.5-höz"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Egyéni kódolás a címkékhez. Számos folt."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Xine-modulok utókezelése. Számos folt."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Feliratfájl betöltése."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U betöltése. Tesztelés."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Szerkesztő - Felirat-PID"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Felirat-PID"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Új elem"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Felfelé"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Lefelé"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< A kijelöltek frissítése"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Új"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Oldal:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Aloldal:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Nyelv:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Ismételt időzítő"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Szerkesztő - Hang-PID"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Hang-PID"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Szerkesztő - Sugárzás"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Elérhető csatornák:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Sugárzott műsorok:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(jobb gombos kattintás a szerkesztéshez)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Új..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Keresés"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Eltérés (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "A keresés megkezdése"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Szűrők"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Szabad sugárzás"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Szolgáltató:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< A kiválasztottak hozzáadása"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< A kiszűrtek hozzáadása"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Talált"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Kész"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Csatornaszerkesztő"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Szám:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaritás"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frekvencia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Szimbólumráta:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Kódolt"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Teletext-PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Szolgáltatásazonosító:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Videó-PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Átvitelazonosító:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Felirat-PID-ek..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Hang-PID-ek..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Sávszélesség:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC (magas):"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Átvitel:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC (alacsony):"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Tartott intervallum:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarchia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Moduláció:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inverzió:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Kódolási beállítások"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Kódoló:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Alapkönyvtár:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Minden ellenőrzés kikapcsolása"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Normál mód"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoia-mód"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalizálás"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD eszköztár"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame MP3-beállítások"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bitráta:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis-beállítások"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Minőség:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Lejátszó&lista"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Kilépési beállítások"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Lejátszó"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "&Automatikus méretválasztás"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Sugárzás"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "Na&vigáció"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD-menü"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Hang"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Videó"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "Ké&parány"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Képlopó eszköztár"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Vezérlőelemek eszköztár"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Hangerő eszköztár"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Folyamatjelző eszköztár"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "A Kaffeine beállításai"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Működési mód"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "A videólejátszás szünetelése az ablak minimalizálásakor"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Beágyazás a panelba"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " s"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "kikapcsolva"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Ennyi ideig jelenjen meg a cím a panelen"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "A DVB-kliens engedélyezése"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Egyéb beállítások"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Adott (nem Unicode) kódolás használata a címkéknél"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Válasszon kódolást\n"
+"(a Unicode-ra történő átalakításhoz)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Az utoljára lejátszott fájlok listájának törlése"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Automatikus lejátszás az indítást követően"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Indítás teljes képernyős módban"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Hangmeghajtó beállítása"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Videomeghajtó beállítása"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Hang-CD/VCD/DVD eszköz elérési útjának beállítása."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "A Xine hibakimenetének megjelenítése"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Telepítési varázsló futtatása"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Lejátszandó fájl(ok). Lehetnek fájlok a merevlemezen, egy URL, egy teljes "
+"könyvtár, DVD, VCD vagy Hang-CD."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Indítás"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Lejátszóablak"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Támogatott médiaformátumok"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG-hangfájlok"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG-videófájlok"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis-fájlok"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI-fájlok"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime-fájlok"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media-fájlok"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska-fájlok"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC-fájlok"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media-fájlok"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV-fájlok"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "A(z) '%1' programrész betöltése nem sikerült."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "A(z) %1 program nincs benne az elérési útvonalban."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "&URL megnyitása..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "&Könyvtár megnyitása..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Kilépés és a monitor kikapcsolása a szám lejátszása után"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Kilépés a szám lejátszása után"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Kilépés a lejátszólista végén"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimális mód"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "&Váltás: lejátszólista - lejátszóablak"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Az &eredeti oldalarány megtartása"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Eredeti méret"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Kétszeres méret"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Háromszoros méret"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Lejátszómodul"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB-kliens"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Lejátszó"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Főablak"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "A Kaffeine nem találta az X DPMS kiegészítését."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Ezzel az opcióval a Kaffeine kilép a lejátszást követően és kikapcsolja a "
+"monitort. Az utóbbihoz szükséges, hogy az X konfigurációs fájlja tartalmazza a "
+"\"dpms\" bejegyzést."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Fájl megnyitása"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "URL megadása:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Könyvtár megnyitása"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr ""
+"Nincs %1 a meghajtóban, vagy rosszul van megadva az eszköz elérési útvonala."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Válassza ki a meghajtót:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 telepítési varázsló"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "A rendszer ellenőrzése"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Rendben."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Nincs ilyen programrész. Kérem, ellenőrizze a telepítést!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Talált verzió"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "A Kaffeine-nek szüksége van erre, vagy annál újabb KDE verzióra: %1"
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Win32 kodekek"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"A Kaffeine nem talált kódolókat a /usr/lib/win32 könyvtárban. Nem fog tudni "
+"Windows Media 9 fájlokat, újabb Real Media fájlokat és számos egyéb elterjedt "
+"fájlokat lejátszani. A szükséges kódolókat innen töltheti le:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"A Kaffeine nem találta meg a libdvdcss-t. Nem fog tudni titkosított DVD-ket "
+"lejátszani (a legtöbb kereskedelmi DVD ilyen). A szükséges függvénytár innen "
+"tölthető le:"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD-meghajtó"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"DMA mód kikapcsolva! A zökkenőmentes DVD lejátszáshoz adja ki az alábbi "
+"parancsot root felhasználóként:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"A DMA-mód ellenőrzése nem sikerült. Nincs jogosultság, vagy nincs ilyen eszköz:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB eszköz"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Nem található DVB eszköz. A DVB-vel kapcsolatos funkciók el lesznek rejtve."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Disztribúció"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"A SuSE által közreadott xine-lib jogi okok miatt (esetleges szabadalmok "
+"megsértése) csak néhány fájlt képes lejátszani. Javasoljuk, hogy töltse le a "
+"szükséges RPM-csomagot a www.mylinux.hu oldalról vagy innen:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "EREDMÉNY"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Nem tökéletes, de a Kaffeine valószínűleg futni fog."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Minden rendben!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"A Kaffeine használata mms:// (Microsoft Media) sugárzások lejátszásához"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"A Kaffeine használata rtsp:// (Real Media és egyéb) sugárzások lejátszásához"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Kaffeine ikon létrehozása a munkaasztalon"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Telepítési beállítások"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Váltottsor-megszüntetési mód"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Nagyon alacsony processzorhasználat, legrosszabb minőség.</b>"
+"<br>A vízszintes felbontás fele elvész. Néhány rendszernél (leginkább PCI "
+"videokártyákkal), így lehet csökkenteni a processzor terhelését (a sima, "
+"interlace nélküli módhoz képest)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Alacsony processzorhasználat, gyenge minőség.</b>"
+"<br>A kép vízszintesen lesz összemosódva (blur), hogy eltűnjenek az interlace "
+"vonalak."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Közepes processzorhasználat, közepes minőség.</b>"
+"<br>A kép ki lesz értékelve, és a vonalas részek ki lesznek javítva "
+"(interpolate)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Magas processzorhasználat, jó minőség</b>"
+"<br>A DVD képformátum átalakítása. Növeli a minőséget és kijavítja a chroma "
+"upsampling hibát."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Nagyon magas processzorhasználat, kiváló minőség.</b>"
+"<br>Amellett, hogy vonaleltávolító (deinterlacing) algoritmusokat használ, "
+"megduplázza a képismétlési rátát (30->60fps), hogy a TV-nek megfeleljen. "
+"Felismeri és átalakítja a 3-2 pulldown-okat. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Nagyon nagyon magas processzorhasználat, kiváló minőség, új (kísérleti) "
+"képességekkel. </b> "
+"<br>Bekapcsolja a judder korrekciót (filmek lejátszása az eredeti 24 fps-es "
+"sebességen) és vízszintesen elsimítja a színeket (néhány DVD filmen kis színes "
+"vonalak szoktak megjelenni). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Egyéni"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "A tvtime váltottsor-megszüntető moduljának beállítása..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Ehhez szükség lehet egy javított 2.4-es (pl. Red Hat) vagy 2.6-os "
+"rendszermagra.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "A tvtime váltottsor-megszüntető bővítmény beállítása"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Effektmodulok"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Hang"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Hangszűrők"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Hangszűrők engedélyezése"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Szűrő hozzáadása"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Minden szűrő eltávolítása"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Videó"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Videószűrők"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Videószűrők engedélyezése"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Xine-paraméterek"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 beállítások"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Általános beállítások"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Szakértői beállítások"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "Xine objektum"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Xine-alapú objektum a Kaffeine-hez."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Az SMIL-támogatás (Synchronized Multimedia Integration Language) még nem "
+"teljes.\n"
+"A Xine objektum megpróbálja lejátszani a videóforrást elrendezési információ "
+"nélkül. Folytatja?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "A sugárzás mentése mint"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Felirat"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Hangcsatorna"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1. Összesen: %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-fájlok\n"
+"*.bmp|BMP-fájlok\n"
+"*.xbm|XBM-fájlok"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "A kép mentése mint"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Sugárzási port:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "A sugárzás fogadási jellemzői"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "A sugárzás címe:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Ugrás erre a pozícióra:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Xine hiba"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Xine üzenet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Kész"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Lejátszás"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Fájltípus"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Feliratfájl"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "A sugárzás mentése mint"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "A szám jellemzői"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "URL másolása a vágólapra"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Lejátszás külön Kaffeine-ablakban"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "Sugárzás &küldése..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "Sugárzás &fogadása..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Képernyőfelvétel mentése..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Adatfolyam mentése..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Merevlemezre menti a jelenlegi adatfolyamatot. Ez a képesség néhány "
+"fájlformátumnál le van tiltva (pl. Real Media), jogi okokból."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Váltás minimális módba"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Szünet"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Gyors lejátszás"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "&Lassítás"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Ugrás előre (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Ugrás vissza (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Ugrás előre (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Ugrás vissza (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Ugrás előre (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Ugrás vissza (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Ugrás egy adott pozícióra..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD-menüben balra"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD-menüben jobbra"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD-menüben fel"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD-menüben le"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD-menüpont kiválasztása"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Hangcsatorna"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Válasszon hangcsatornát"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "H&angábrázoló"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Hangerő fel"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Hangerő le"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Váltottsor-megszüntető"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+"Ezt a pontot váltottsoros videóknál célszerű bekapcsolni, például egyes "
+"DVD-knél."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Automatikus"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorf"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Négyzet"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Nagyítás vízszintesen"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Nagyítás vízszintesen"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Nagyítás függőlegesen"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Nagyítás függőlegesen"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Deinterlace m&inőség"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Videóbeállítások"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Equalizer"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Menü ki-/be"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Szakasz"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Főmenü"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Kép a képben"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "Nézeti &szög"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Rész"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Szakasz"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Fejezet"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Nézeti szög"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "A szám jellemző&i"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Effekt&bővítmények..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "A &Xine lejátszó beállítása"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Hangerő"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Pozíció"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Gyors kattintás: számláló átkapcsolása előre/visszaHosszú kattintás: OSD óra "
+"be-/kikapcsolása"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Lejátszási idő"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "CDDB-bejegyzések keresése..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "%1. hang-CD-szám"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "%1. VCD-szám"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Videóbeállítások"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Árnyalat"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Telítettség"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontraszt"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Fényerő"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Hang-kép eltolás"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Felirat eltolása"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "automatikus"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Általános figyelmeztető üzenet: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Nincs elérhető információ"
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Biztonsági figyelmeztetés: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Ismeretlen az a gép, mellyel fel akarja venni a kapcsolatot.\n"
+"Kérem, ellenőrizze a cím érvényességét."
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Úgy tűnik, hogy a megadott eszköznév helytelen. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Úgy tűnik, hogy nincs hálózat.\n"
+"Ellenőrizze a hálózat és a névkiszolgáló beállításait. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Nincs hangkimenet. Az eszköz foglalt. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"A kapcsolat vissza lett utasítva.\n"
+"Ellenőrizze a gépnevet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "A megadott fájl vagy URL nem található. Kérem ellenőrizze. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Nincs hozzáférési engedélye ehhez a forráshoz. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"A forrás nem olvasható.\n"
+"Talán nem rendelkezik a megfelelő jogosultságokkal, vagy a forrás nem tartalmaz "
+"adatokat (pl. nincs lemez a meghajtóban). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Hiba lépett fel egy függvénytár vagy dekódoló betöltése közben: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "A forrás titkosított és a Kaffeine nem tudja elolvasni. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Ez valószínűleg egy titkosított DVD. A helyi törvényektől függ, hogy Ön "
+"használhatja-e a libdvdcss függvénytárat e lemez olvasásához."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Ismeretlen hiba: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Hiba: Az új %1 videomeghajtó indítása nem sikerült - helyette a(z) %2 kerül "
+"alkalmazásra!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Használt videomeghajtó: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Hiba: az új %1 hangmeghajtó indítása nem sikerült, helyette a(z) %2 lesz aktív."
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Használt hangmeghajtó: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "A Xine indítása..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "A Xine modul indítása nem sikerült!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Használandó hangmeghajtó (alapértelmezett: automatikus)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Használandó videomeghajtó (alapértelmezett: automatikus)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Szoftveres keverőeszköz használata"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "OSD üzenetek megjelenítése"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Az OSD szövegek mérete"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "OSD üzenetek betűtípusa"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"A(z) %1 videomeghajtó indítása nem sikerült - helyette az 'automatikus' lesz "
+"érvényes..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Egyik videomeghajtót sem sikerült betölteni!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"A(z) %1 hangmeghajtó indítása nem sikerült - helyette az 'automatikus' lesz "
+"érvényes!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Egyik audiomeghajtót sem lehetett betölteni!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Nem sikerült új xine adatfolyamatot létrehozni!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: Megnyitás..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Megnyitás..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Hangkódoló"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Videokódoló"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Ehhez az erőforráshoz nem áll rendelkezésre modul"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Úgy tűnik, hogy az erőforrás hibás"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "A kért erőforrás nem áll rendelkezésre"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Az erőforrás megnyitása nem sikerült"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Általános hiba"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Némítás ki"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Némítás be"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Gyors előre: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "%1 lassítás"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Váltottsor-megszüntetés: be"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Váltottsor-megszüntetés: ki"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Képarány"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "automatikus"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Nagyítás (X)"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Nagyítás (Y)"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Ekvalizer-beállítások"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Hangerőtorzítás"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "Hangerőtorzítás az equalizeren - Ha a hang zajossá válik, kapcsolja ki"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Szűrő törlése"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Keresés: %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "A GStreamer inicializálása nem sikerült"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Némítás"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Megjegyzés"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "A &GStreamer lejátszó beállítása"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "A GStreamer inicializálása nem sikerült"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Hiányzik a GStreamer regisztrációs adatbázisa. Telepítés után futtani kell a <b>"
+"gst-register</b> programot (rendszergazdaként)."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"A hangkártyameghajtó ('%1') inicializálása nem sikerült - új próba másik "
+"meghajtóval..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Nem található megfelelő hangkártyameghajtó."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"A videokártya-meghajtó ('%1') inicializálása nem sikerült - új próba másik "
+"meghajtóval..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Nem található megfelelő videokártya-meghajtó."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "A GStreamer lejátszó paraméterei"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Hangbeállítások"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Hangkártyameghajtó beállítása"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Videobeállítások"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Videokártya-meghajtó beállítása"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Újraindítás szükséges"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Adathordozó"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Az adathordozók beállításai"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD-/VCD-/DVD-meghajtó"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
diff --git a/po/it.po b/po/it.po
new file mode 100644
index 0000000..deef481
--- /dev/null
+++ b/po/it.po
@@ -0,0 +1,3185 @@
+# translation of kaffeine.po to Italian
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER, 2003,2004.
+#
+# Marco Russo, 2004.
+# Marco -=[LaTiNo]=- Russo <marcorusso79@email.it>, 2005.
+# Marco Russo <marcorusso79@email.it>, 2005.
+# Vincenzo Reale <smart2128@baslug.org>, 2005, 2006.
+# Jürgen Kofler <kaffeine@gmx.at>, 2005.
+# Carlo Maria Laorenza <carlo@relazioninet.it>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-11-10 00:58+0100\n"
+"Last-Translator: Vincenzo Reale <smart2128@baslug.org>\n"
+"Language-Team: Italian <kde-i18n-it@mail.kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Aggiorna"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Pianificato"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Attuale/Successivo"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Canale"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Inizio"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Durata"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Titolo"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Visualizza tutti i programmi"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Aggiungi ai timer"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Nome:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Canale:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Inizio:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Durata:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Fine:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Registra come:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Nessuno"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Giornaliero"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Settimanale"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Mensile"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Personalizzato"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Ripeti..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Editor dei timer"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Devi dargli un nome!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "La durata deve essere di almeno 1 minuto!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Il nome non deve contenere i seguenti caratteri: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Impostazioni iniziali del transponder"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Questo nome non è univoco."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Pid audio mancante(i)!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Il pid deve essere diverso da zero!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Devi scegliere alcuni giorni."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Canali"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Timer"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Guida elettronica dei programmi"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Impostazioni DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Numero"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Nome"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Canali audio"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Registrazione immediata"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Trasmissione"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Time shifting"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "In registrazione"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Trasmissione"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Seleziona icona..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Scegli l'icona del canale"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "TV digitale"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "La TV digitale in diretta funziona solo con il motore xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD Canale successivo"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD Canale precedente"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Zap"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD Evento successivo"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD Evento precedente"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Visualizza OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Timer..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Trasmissione..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Canali..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Configura DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Tutto"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Nuova categoria..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Cambia icona..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Elimina categoria..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nuova categoria"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Inserisci un nome per questa categoria:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Vuoi davvero eliminare questa categoria?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Non posso ottenere i dati DVB da http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tVerifica la tua connessione a internet, e rispondi \"Sì\" per provare "
+"ancora."
+"<br>\t\t\tOppure \"No\" per annullare."
+"<br>\t\t\tSe hai già questo file, copialo in "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz e rispondi \"Sì\"."
+"<br>"
+"<br>Vuoi riprovare?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Trasmissione fallita."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Impossibile avviare la trasmissione."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Il timer è stato creato ed avviato con successo."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Dovresti definire qualche canale prima!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Timer creato con successo."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Registrazione in corso."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Trasmissione in corso."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Impossibile sintonizzare il dvb!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Impossibile impostare pid"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Nessun CAM libero"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine sta ancora registrando. Sei sicuro di voler uscire?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine ha accodato i timer. Sei sicuro di voler uscire?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Segnale:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Blocca:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Modifica..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Sei sicuro di voler eliminare tutti i canali?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "INIZIA scansione"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "TERMINA scansione"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Arresto..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Trovato: %1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Impossibile aprire socket di info DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Lista dei timer:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Nuovo"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Ferma/Elimina"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Il timer è ripetuto. Vuoi saltare l'attività corrente o eliminare il timer?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Salta attuale"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Cancellare il timer selezionato?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Scaricamento... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Copia dei file in corso..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Impostazioni DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Dispositivo DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Impostazioni dispositivo"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Nome:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tipo:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Cavo"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Terrestre"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satellite"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Numero di LNB:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1° sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Impostazioni LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2° sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3° sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4° sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Impostazioni LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Fonte:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Questo dispositivo sembra supportare la funzione <b><i>"
+"scansione automatica</i></b>. Puoi scegliere <b>AUTO</b> "
+"nell'elenco Fonte per lasciare che Kaffeine cerchi un intervallo di frequenze."
+"<br>Se la <b><i>scansione automatica</i></b> fallisce nel trovare i canali, "
+"scegli una vera fonte dall'elenco.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Se non puoi trovare la rete/posizione nell'elenco, dovrai crearne una. "
+"Guarda in $HOME/.kde/share/apps/kaffeine/dvb-x/ ed usa un file esistente come "
+"punto di partenza. Modificalo con i valori per la tua rete/posizione e dagli un "
+"nome sensibile (seguendo la convenzione dei nomi). Se pensi che il tuo file "
+"possa essere utile per gli altri, invialo a kaffeine-user(AT)lists.sf.net.</i>"
+"</qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Opzioni di registrazione DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Cartella registrazioni:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Cartella time shifting:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Margine iniziale:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minuti)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Margine finale:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Durata registrazione immediata:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Formato preferito:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Trasmissione DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Indirizzo di trasmissione:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Porta di trasmissione:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Porta info:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Varie"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Set di caratteri predefinito (riavvio necessario):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Aggiorna i dati di scansione:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Scarica"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Dump degli eventi epg in \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Dump"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Plugin DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Non posso ottenere i dati DVB da http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tVerifica la tua connessione internet, e rispondi Si per riprovare."
+"<br>\t\t\tOppure No per annullare."
+"<br> Vuoi riprovare?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Cartella registrazioni non valida."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Cartella time shifting non valida."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Le porte Trasmissione e Info devono essere diverse."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Indirizzo di trasmissione non valido."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Impostazioni LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "LNB universale"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "LNB banda C"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "LNB mutipunto banda C"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "LO doppio"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "LO singolo"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Frequenza switch LO doppia:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Frequenza di banda bassa:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Frequenza di banda alta:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Singola frequenza LO:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Pol. verticale frequenza LO:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Pol. orizzontale frequenza LO:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Reimposta"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Impossibile aprire il socket di trasmissione DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Impossibile inizializzare il socket di trasmissione."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Nessun codificatore audio trovato."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Caricamento del codificatore '%1' fallito."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Impossibile creare la cartella: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Byte"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD audio"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Riproduci CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Estrai CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artista:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Traccia"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Seleziona le tracce da estrarre e fai clic sul pulsante <b>Codifica</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Codifica..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Codifica CD audio"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Riproduci CD audio"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Riproduci DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Riproduci VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Apri &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Apri &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "&Apri CD audio"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Devi selezionare le tracce da estrarre."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Vari CD audio trovati. Scegline uno:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Nessun CD audio trovato."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Vari DVD video trovati. Scegline uno:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Vari (S)VCD trovati. Scegline uno:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Nessun titolo"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Traccia %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Cerca voce nel database cddb locale..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Ricerca voce cddb remoto..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Esatta corrispondenza cddb trovata..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Voce simile cddb trovata..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "Corrispondenze CDDB"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Molte voci CDDB simili trovate. Scegline una:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Un plugin di codifica Lame mp3 per Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Un plugin di codifica Ogg Vorbis per Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Client DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Impossibile aprire il socket info."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Impossibile connettere il socket info!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Impossibile aprire il socket."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Impossibile impostare le opzioni di socket!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Impossibile connettere il socket!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Tutte le dimensioni"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Molto piccola"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Piccola"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Media"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Grande"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Molto grande"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nuova ricerca"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "La copertina selezionata non è disponibile. Scegline un'altra."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Copertina non disponibile"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Scarica copertine"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Nessuna immagine corrispondente, inserisci nuovi termini di ricerca:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Inserisci nuovi termini di ricerca:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Riproduci"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Riproduci successivo/Aggiungi alla coda"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Selezion&a tutto"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Crea playlist dalla selezione"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Aggiungi sotto&titoli..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Modifica titolo"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Informazioni"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Lunghezza"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artista"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Anno"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Genere"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Sottotitoli"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "in uso"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|File sottotitoli\n"
+"*.*|Tutti i file"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Seleziona file dei sottotitoli"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Scegli una copertina..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galleria..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtro"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Playlist:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Seleziona la playlist attiva. Per cambiare il nome della playlist, modificalo e "
+"conferma con 'Invio'."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Riproduci playlist"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Ripeti"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Playlist ciclica"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Cas&uale"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Riproduci le tracce in ordine casuale"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Scarica automaticamente le copertine"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Scaricamento automatico delle copertine"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "S&vuota la playlist attuale"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Nuo&va playlist"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importa playlist..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Salva la playlist attuale con nome..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Ri&muovi la playlist attuale"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Playlist di Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Tutti i file"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Apri playlist"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Playlist M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Playlist PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Salva playlist"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Playlist"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NUOVA"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importazione risorse multimediali..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(nessun sottotitolo)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Altri sottotitoli..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galleria"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "In Coda: %1 elementi, Tempo di esecuzione: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Elementi: %1, Tempo di esecuzione: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Rimuovere '%1' dalla lista e dal disco?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Il nome della playlist già esiste"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Inserisci un nome diverso per la playlist:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Seleziona sottotitolo"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Media file:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Seleziona il film"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "File sottotitoli:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Riproduzione / Pausa"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Successivo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Muto"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Lettore Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Lettore Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Vincenzo Reale, Marco Russo"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "smart2128@baslug.org"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Un lettore multimediale per KDE 3. Può usare più motori di riproduzione, il "
+"predefinito (e raccomandato) è xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Gli autori di Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Responsabile attuale"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Autore originale"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Supporto CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Diverse patch importanti."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Patch di navigazione OSD per DVB."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Patch categorie DVB."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logo per Kaffeine 0.8 e altri lavori artistici."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Logo animato per Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Codifica alternativa per i meta tag. Molte patch."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Gestione xine post plugin. Molte patch."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Importazione file sottotitoli."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Importazione M3U. Test."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Editor PID sottotitoli"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID sottotitoli"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Nuova voce"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Sposta in alto"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Sposta in basso"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Aggiorna i selezionati"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Nuovo"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Pagina:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Sottopagina:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Lingua:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Timer ripetuto"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Editor PID audio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "PID audio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Editor di trasmissione"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Canali disponibili:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Elenco di trasmissione:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Tasto destro per modificare/cancellare)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Nuovo..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Cerca su"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Scostamento (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Avvia scansione"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtri"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Non criptati"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Provider:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Aggiungi selezionati"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Aggiungi filtrati"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Trovato"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Fatto"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Editor dei canali"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "N°:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polarità"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frequenza:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Symbol rate:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Criptato"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID televideo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "ID servizio:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID video:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "ID flusso di trasporto:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Pid sottotitoli..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "PID audio..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Ampiezza di banda:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC alto:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Trasmissione:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC basso:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Intervallo di protezione:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Gerarchia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulazione:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversione:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Preferenze codifica"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Codificatore:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Cartella di base:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Disabilita tutti i controlli"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Modalità normale"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Modalità paranoia"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalizza"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Barra degli strumenti CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Opzioni Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bitrate:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Opzioni Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Qualità:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Play&list"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Opzioni di uscita"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "Le&ttore"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Abilita &ridimensionamento automatico"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Trasmissio&ne di rete"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigazione"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Menu &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Audio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Proporzioni"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Barra degli strumenti Screenshot"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Barra degli strumenti Controlli"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Barra degli strumenti Volume"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Barra degli strumenti Posizione"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Impostazioni di Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Comportamento"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Video in pausa quando la finestra è minimizzata"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Integra nel vassoio di sistema"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sec"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "disattivato"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Durata del titolo di annuncio nel vassoio di sistema"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Abilita client DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Opzioni varie"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Usa una codifica alternativa (non-Unicode) per i Meta Tag"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Scegli una codifica alternativa per i Meta Tag\n"
+"(per convertire in Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Pulisci la lista dei file recenti"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Riproduci immediatamente"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Avvia in modalità schermo intero"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Imposta il driver audio"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Imposta il driver video"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Imposta il percorso del dispositivo CD audio/VCD/DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Messaggio di debug di xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Avvia l'assistente di installazione"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"File da riprodurre. Possono essere file locali, URL, Cartelle, 'DVD', 'VCD', o "
+"'CD audio'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Inizia"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Finestra del lettore"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Formati multimediali supportati"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "File audio MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "File video MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "File Vorbis Ogg"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "File AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "File Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "File Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "File Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "File FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "File Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "File WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Caricamento del riproduttore (part) '%1' fallito."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 non trovato nel percorso di ricerca."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Apri &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Apri &cartella..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Esci e Spegni il monitor dopo questa traccia"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Esci dopo questa traccia"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Esci dopo la playlist"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "Modalità &minimale"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "&Passa a Playlist/Riproduttore"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Mantieni aspetto &originale"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Dimensione originale"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Dimensione doppia"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Dimensione tripla"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Motore del ri&produttore"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Client DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Riproduttore"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Finestra principale"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "Estensione DPMS del server X non è stata trovata."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Chiuderà Kaffeine e spegnerà il monitor al termine del file o della playlist. "
+"L'opzione \"dpms\" deve essere nel tuo file di configurazione di X per lo "
+"spegnimento del monitor."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Apri file"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Apri URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Inserisci URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Apri cartella"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Nessun %1 nel lettore, o errato percorso del dispositivo."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Selezionare il lettore corretto:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 Assistente di installazione"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Verifica installazione"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ok."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Part non trovato. Verifica la tua installazione!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Versione trovata"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine richiede KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Codificatori WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Nessun codificatore WIN32 trovato in /usr/lib/win32. Non sarà possibile "
+"riprodurre i file Windows Media 9, i nuovi file Real Media e alcuni formati di "
+"file meno comuni. Scarica i codificatori da qui:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss non trovata. Non sarà possibile riprodurre DVD criptati (la maggior "
+"parte di quelli commerciali). Scarica la libreria qui (ma usandola potresti "
+"violare le leggi sul diritto d'autore del tuo paese!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Lettore DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Modalità DMA disattivata! Per una riproduzione fluida dei DVD esegui come root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Non posso verificare la modalità del DMA. Permesso negato o nessun dispositivo "
+"trovato:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Dispositivo DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Nessun dispositivo DVB trovato. Le funzioni relative al DVB saranno nascoste."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribuzione"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"La libreria xine-lib distribuita da SuSE \"potrebbe essere carente di alcune "
+"funzionalità per ragioni legali (potenziali violazioni di brevetto)\". Dovresti "
+"usare questi pacchetti:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "RISULTATO"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+"Sono stati rilevati degli errori, ma Kaffeine dovrebbe funzionare comunque."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Tutto ok!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Usa Kaffeine come applicazione ausiliaria per i flussi mms:// (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Usa Kaffeine come applicazione ausiliaria per i flussi rtsp:// (Real Media) "
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Crea un'icona di Kaffeine sul desktop"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Opzioni di Installazione"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Qualità Deinterlacciamento"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Utilizzo della CPU molto basso, qualità pessima.</b>"
+"<br>La metà della risoluzione verticale è persa. Per alcuni sistemi (con schede "
+"video PCI) questo potrebbe far diminuire l'uso della CPU, se comparato "
+"all'esecuzione normale del video (non deinterlacciato)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Utilizzo della CPU basso, qualità bassa.</b>"
+"<br>L'immagine è sfocata verticalmente, eliminando l'effetto interlacciato."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Utilizzo della CPU Medio, qualità media.</b>"
+"<br>L'immagine è analizzata e le aree che mostrano l'effetto di "
+"interlacciamento sono fissate (interpolato)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Utilizzo della CPU alto, qualità Buona.</b>"
+"<br>La conversione del formato immagine del DVD migliora la qualità e aggiusta "
+"l'errore del <i>chroma upsampling</i>."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Utilizzo della CPU MOLTO alto, qualità ottima.</b>"
+"<br>Oltre ad usare la tecnica del deinterlacciamento si userà anche un doppio "
+"<i>frame rate</i> (30->60fps) per far coincidere la frequenza del campo TV. "
+"Rileva e inverte il <i>3-2 pulldown</i>. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Utilizzo della cpu MOLTO ALTO, qualità eccellente con (sperimentali) "
+"migliorie.</b>"
+"<br>Abilita la <i>correzione judder</i> (esegue i filmati con la loro velocità "
+"originale - 24 fps) e il <i>color smoothing</i> verticale (elimina le piccole "
+"bande di colore presenti in alcuni DVD). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Definito dall'utente"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Configura il plugin Deinterlacciamento di tvtime..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Potrebbe richiedere un kernel 2.4 modificato (come uno di RedHat) o un "
+"kernel 2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Configura il plugin di deinterlacciamento di tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Plugin effetti"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Audio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Filtri audio"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Abilita filtri audio"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Aggiungi filtro"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Rimuovi tutti i filtri"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Filtri video"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Abilita filtri video"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Parametri del motore xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 Opzioni"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Opzioni di base"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Opzioni avanzate"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Un riproduttore (part) basato su xine per Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Il supporto a SMIL (Synchronized Multimedia Integration Language) è "
+"rudimentale!\n"
+"XinePart può provare a riprodurre i sorgenti video contenuti senza nessuna "
+"struttura. Vuoi procedere?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Salva flusso con nome"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Sottotitoli"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Canale audio"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 di %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|File-PNG\n"
+"*.bmp|File-BMP\n"
+"*.xbm|File-XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Salva screenshot"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Porta di trasmissione:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Configura ricezione del flusso di trasmissione"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Indirizzo mittente:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Porta:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Salta alla posizione:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Errore di xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Messaggio di xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Pronto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "In riproduzione"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "File dei sottotitoli"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Salva flusso con nome"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Informazioni traccia"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Copia URL negli appunti"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Riproduci in Kaffeine esternamente"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Invia flusso di trasmissione..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Ricevi flusso di trasmissione..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Salva schermata..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Salva flusso..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Salva il flusso corrente sul disco fisso. Questa funzione è stata disabilitata "
+"per alcuni formati (es.:Real Media) per prevenire potenziali problemi legali."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Commuta alla modalità minimale"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pausa"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Avanzamento veloce"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Avanza&mento lento"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Salta avanti (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Salta indietro (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Salta avanti (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Salta indietro (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Salta avanti (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Salta indietro (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Salta alla posizione..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Menu DVD sinistra"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Menu DVD destra"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Menu DVD sopra"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Menu DVD sotto"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Menu DVD seleziona"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Canale audio"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Seleziona canale audio"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Visualizzazione audio"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Aumenta volume"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Riduci volume"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Deinterlaccia"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Attiva questo per un flusso interlacciato, per esempio su alcuni DVD."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorfico"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Quadrato"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Aumenta zoom orizzontale"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Riduci zoom orizzontale"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Aumenta zoom verticale"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Riduci zoom verticale"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Qualità Deinterlacciamento"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Impostazioni &video"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Equalizzatore"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Vai al &menu"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Titolo"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "P&rincipale"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Sotto-immagine"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "An&golo"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Parte"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Titolo"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Capitoli"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Angoli"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Informazioni traccia"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Plugin effetti..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Parametri del motore &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volume"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Posizione"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Clic breve: Commuta avanti/indietro del timer\n"
+"Clic lungo: Commuta OSD del timer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Tempo di riproduzione"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Ricerca informazioni CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Traccia CD audio %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Traccia VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Impostazioni video"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Tonalità"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Saturazione"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Contrasto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Luminosità"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Scostamento audio/video"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Scostamento sottotitoli"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Avviso generale: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Nessuna informazione disponibile."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Avviso di sicurezza: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"L'host al quale si sta tentando di connettersi è sconosciuto.\n"
+"Verificare la validità del nome host specificato."
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Il nome del dispositivo specificato sembra non essere valido."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Non si può accedere alla rete.\n"
+"Verificare le impostazioni di rete e il nome del server."
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "L'uscita audio non è disponibile. Il dispositivo è occupato."
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"La connessione è stata rifiutata.\n"
+"Verifica il nome dell'host."
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"Il file o URL specificato non è stato trovato. Verificane la correttezza."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "L'accesso a questa fonte è stato negato."
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"La fonte non può essere letta.\n"
+"Potresti non avere i permessi di lettura, o la fonte non contiene dati (es.: "
+"nessun disco nel lettore)."
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+"Si è verificato un problema durante il caricamento di una libreria o di un "
+"decodificatore: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "La fonte sembra criptata, e non può essere letta."
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Il tuo DVD è probabilmente criptato. Secondo le leggi del tuo paese, potresti "
+"non poter usare libdvdcss per leggere questo DVD."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Errore sconosciuto: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Non posso inizializzare il driver video %1 - uso %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Driver video in uso: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Non posso inizializzare il nuovo driver audio %1 - uso %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Driver audio in uso: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Inizializza xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Non posso inizializzare il motore xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Driver audio da usare (predefinito: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Driver video da usare (predefinito: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Usa il mixer audio software"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Visualizza messaggi OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Dimensione del testo OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Carattere per messaggi OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Non posso inizializzare il driver video %1 - sto provando 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Tutti i driver video hanno fallito l'inizializzazione!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"Non posso inizializzare il nuovo driver audio %1 - sto provando 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Tutti i driver audio hanno fallito l'inizializzazione!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Non posso creare un nuovo flusso di xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: apertura..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Apertura..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Codificatore audio"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Codificatore video"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Nessun plugin trovato per questa risorsa"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "La risorsa sembra essere danneggiata"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "La risorsa richiesta non esiste"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "La risorsa non può essere aperta"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Errore generico"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Silenzio disabilitato"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Silenzio abilitato"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Avanti veloce %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Avanzamento lento %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Deinterlacciamento: attivato"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Deinterlacciamento: disattivato"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Proporzioni"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Zoom X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Zoom Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msec"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Impostazioni equalizzatore"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Guadagno volume"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Guadagno Volume per l'Equalizzatore - Se il suono diventa disturbato "
+"disabilitalo"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Elimina il filtro"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Posizionamento a %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Inizializzazione GStreamer fallita!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Muto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Commento"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parametri Motore &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer non può essere inizializzato!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Registro GStreamer mancante! Hai dimenticato di lanciare <b>gst-register</b> "
+"(come root) dopo l'installazione?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"Impossibile inizializzare il driver audio '%1' - ne sto provando un altro..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Nessun driver audio utilizzabile trovato!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"Impossibile inizializzare il driver video '%1' - ne sto provando un altro..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Nessun driver video utilizzabile trovato!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parametri del motore GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Opzioni audio"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Driver audio preferito"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Opzioni video"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Driver video preferito"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Riavvio richiesto!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Opzioni media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Lettore CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
diff --git a/po/ja.po b/po/ja.po
new file mode 100644
index 0000000..3c6495f
--- /dev/null
+++ b/po/ja.po
@@ -0,0 +1,3125 @@
+# translation of kaffeine.pot to Japanese
+# Copyright (C) 2003-2004 Turbolinux, Inc.
+# This file is distributed under the same license as the kaffeine package.
+# Noriyuki Suzuki <noriyuki@turbolinux.co.jp>, 2003, 2004.
+# Yukiko BANDO <ybando@k6.dion.ne.jp>, 2005, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-04-12 20:00+0900\n"
+"Last-Translator: Yukiko BANDO <ybando@k6.dion.ne.jp>\n"
+"Language-Team: Japanese <Kdeveloper@kde.gr.jp>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 3.1.5\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG (電子番組ガイド)"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "更新"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "現在/次"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "チャンネル"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "開始"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "時間"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "タイトル"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "全プログラムを見る"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "タイマーに追加"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "名前:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "チャンネル:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "開始:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "時間:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "終了:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "レコーディング方法:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "なし"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "毎日"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "毎週"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "毎月"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "カスタム"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "リピート..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "タイマーの編集"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "名前を付けてください。"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "時間は最低 1 分でなければなりません。"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "名前には次の文字は使えません: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "トランスポンダの初期設定"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "同じ名前が他にもあります。"
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "オーディオ PID がありません。"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "PID はゼロではいけません。"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "日を選んでください。"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "チャンネル"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "タイマー"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "EPG (電子番組ガイド)"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB の設定"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "番号"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "名前"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "オーディオチャンネル"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "即時レコーディング"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "ブロードキャスト"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "タイムシフト"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "レコーディング"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "ブロードキャスト"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "アイコンを選択..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "チャンネルアイコンを選択"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "デジタル TV"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "ライブデジタル TV は xine エンジンでのみ動作します。"
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD 次のチャンネル"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD 前のチャンネル"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD 次のイベント"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD 前のイベント"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "OSD メッセージを表示"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG (電子番組ガイド)..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "タイマー..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "ブロードキャスト..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "チャンネル..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "DVB を設定..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "すべて"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "テレビ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "ラジオ"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "新規カテゴリ..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "アイコンを変更..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "カテゴリを削除..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "新規カテゴリ"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "このカテゴリの名前:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "本当にこのカテゴリを削除しますか?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>http://hftom.free.fr/kaxtv/dvbdata.tar.gz! から DVB データを取得できません。"
+"<br>\t\t\tインターネット接続を確認して、やり直す場合は「はい」"
+"<br>\t\t\tキャンセルする場合は「いいえ」を選んでください。"
+"<br>\t\t\t既にこのアーカイブがあるのであれば ~/.kde/share/apps/kaffeine/dvbdata.tar.gz "
+"にコピーして「はい」を選んでください。"
+"<br>"
+"<br> もう一度試しますか?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "ブロードキャスト失敗。"
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "ブロードキャストを開始できません。"
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "タイマーを作成し、開始しました。"
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "まずチャンネルをいくつか定義してください。"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "タイマーを作成しました。"
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "まだレコーディング中です。"
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "まだブロードキャスト中です。"
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "DVB をチューニングできません。"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "PID を設定できません。"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine はまだレコーディング中です。本当に終了しますか?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "待機中のタイマーがあります。本当に終了しますか?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "シグナル:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "ロック:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "編集..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "本当にすべてのチャンネルを削除しますか?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "スキャン開始"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "スキャン中止"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "中止します..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "検出: %1 テレビ - %2 ラジオ"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "DVB 情報ソケットを開けません。"
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "タイマーリスト:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "新規"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "中止/削除"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr "これは繰り返しタイマーです。現在のジョブをスキップしますか?それともタイマーを削除しますか?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "現在のジョブをスキップ"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "選択したタイマーを削除しますか?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "ダウンロード中..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "データファイルをコピー中..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB の設定"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVD デバイス"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "デバイスの設定"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt>名前:</qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt>タイプ:</qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "ケーブル"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "地上波"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "衛星"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "不明"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "LNB の数:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB の設定..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB の設定..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "ソース:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>このデバイスは「自動スキャン」をサポートしているようです。ソースリストの「自動」を選択して Kaffeine "
+"に周波数の範囲を検索させることができます。"
+"<br>「自動スキャン」であなたのチャンネルが見つからなかった場合は、リストから正しいソースを選択してください。</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt>リストにあなたのネットワーク/場所がない場合は、新しく作成する必要があります。$HOME/.kde/share/apps/kaffeine/dvb-x/"
+" にある既存のファイルを元に作成します。あなたのネットワーク/場所の値を入れて、命名規則に従って名前を付けてください。作成したファイルが他の人にも役立つと考えら"
+"れる場合は、kaffeine-user(AT)lists.sf.net へ送ってください。</qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB レコーディングのオプション"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "レコーディングディレクトリ:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "タイムシフトディレクトリ:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "開始マージン:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(分)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "終了マージン:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "即時レコーディングの長さ:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "優先する形式:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB ブロードキャスト"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "ブロードキャストアドレス:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "ブロードキャストポート:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "情報ポート:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "その他"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "標準の文字セット (再スタートが必要):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "スキャンデータを更新:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "ダウンロード"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"EPG のイベントを次にダンプ \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "ダンプ"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB プラグイン"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>http://hftom.free.fr/kaxtv/dvbdata.tar.gz! から DVB データを取得できません。"
+"<br>\t\t\tインターネット接続を確認して、やり直す場合は「はい」"
+"<br>\t\t\tキャンセルする場合は「いいえ」を選んでください。"
+"<br> もう一度試しますか?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "レコーディングディレクトリが不正です。"
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "タイムシフトディレクトリが不正です。"
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "ブロードキャストと情報ポートは同じではいけません。"
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "ブロードキャストアドレスが不正です。"
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB の設定"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Lo-band 周波数:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Hi-band 周波数:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "リセット"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "DVB ブロードキャストソケットを開けません。"
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "DVB ブロードキャストソケットを開始できません。"
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "オーディオエンコーダが見つかりません。"
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "エンコーダ '%1' の読み込みに失敗しました。"
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "フォルダを作成できません: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "バイト"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "オーディオ CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "CD を再生"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "CD をリッピング"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "アーティスト:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "アルバム:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "トラック"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "リッピングするトラックを選んで「エンコード」ボタンをクリックしてください。"
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "エンコード..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "オーディオ CD のエンコード"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "オーディオ CD を再生"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "DVD を再生"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "VCD を再生"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "DVD を開く(&D)"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "VCD を開く(&V)"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "オーディオ CD を開く(&A)"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "リッピングするトラックを選んでください。"
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "複数のオーディオ CD を検出しました。一つ選んでください:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "オーディオ CD が見つかりません。"
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD ビデオ"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "複数の DVD ビデオを検出しました。一つ選んでください:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "複数の (S)VCD を検出しました。一つ選んでください:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "タイトルなし"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "トラック %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "ローカル CDDB エントリを検索..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "リモート CDDB エントリを検索..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "完全に一致する CDDB エントリを発見 ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "近い CDDB エントリを発見 ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB 検索結果"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "近い CDDB エントリが複数見つかりました。一つ選んでください:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Kaffeine 用 Lame mp3 エンコーダプラグイン"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Kaffeine 用 Ogg Vorbis エンコーダプラグイン"
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB クライアント"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "情報ソケットを開けません。"
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "情報ソケットをバインドできません。"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "ソケットを開けません。"
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "ソケットのオプションを設定できません。"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "ソケットをバインドできません。"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "すべてのサイズ"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "極小"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "小"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "中"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "大"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "極大"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "新規検索"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "選択されたカバーは利用できません。他のものを選んでください。"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "カバー利用不可"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "カバーのダウンロード"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "マッチする画像が見つかりません。新しい検索語を入力してください:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "新しい検索語を入力:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "再生"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "次に再生/キューに追加"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "すべて選択(&A)"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "選択項目からプレイリストを作成"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "字幕を追加(&T)..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "タイトルを編集(&E)"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "情報(&I)"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "長さ"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "アーティスト"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "アルバム"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "年"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "ジャンル"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "字幕"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "使用中"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|字幕ファイル\n"
+"*.*|すべてのファイル"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "字幕ファイルを選択"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "カバーを選択..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "ギャラリー..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "フィルタ"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "プレイリスト:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr "アクティブなプレイリストを選択します。プレイリストの名前を変更するには、名前を編集してから 'Return' で確定します。"
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "プレイリストを再生"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "リピート(&R)"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "ループ再生"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "シャッフル(&U)"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "ランダム再生"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "カバーを自動ダウンロード"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "カバーの自動ダウンロード"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "現在のプレイリストをクリア(&C)"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "新規プレイリスト(&W)"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "プレイリストをインポート(&I)..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "現在のプレイリストに名前を付けて保存(&S)..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "現在のプレイリストを削除(&M)"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine プレイリスト"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "すべてのファイル"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "プレイリストを開く"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U プレイリスト"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS プレイリスト"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "プレイリストを保存"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "プレイリスト"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "新規"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "メディアリソースをインポート..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(字幕なし)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "他の字幕..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "ギャラリー"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "キュー: %1 エントリ, 再生時間: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "エントリ: %1, 再生時間: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "'%1' をリストとディスクから削除しますか?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "同じ名前のプレイリストが既にあります。"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "他の名前を入力してください:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "字幕を選択"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "メディアファイル:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "動画を選択"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "字幕ファイル:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "再生/一時停止"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "次(&N)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "ミュート(&M)"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine Player"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine Player]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Noriyuki Suzuki"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "noriyuki@turbolinux.co.jp"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr "KDE 3 用のメディアプレーヤです。再生には複数のバックエンドを使用できます。標準 (かつ推奨) は xine です。"
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, The Kaffeine Authors"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "現在のメンテナ"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "オリジナルの作者"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM サポート"
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "さまざまな貴重なパッチ"
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "DVB OSD ブラウジング パッチ"
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "DVB カテゴリ パッチ"
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Kaffeine 0.8 のロゴとその他のアートワーク"
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Kaffeine 0.5 のアニメーションロゴ"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "メタタグの代理エンコーディングとたくさんのパッチ"
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "xine ポストプラグインのハンドリングとたくさんのパッチ"
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "字幕ファイルのインポート"
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U のインポートとテスト"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "字幕 PID の編集"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "字幕 PID"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "新規アイテム"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "上に移動"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "下に移動"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< 選択したものを更新"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< 新規"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "ページ:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "サブページ:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "言語:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "繰り返しタイマー"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "オーディオ PID の編集"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "オーディオ PID"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "ブロードキャストの編集"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "利用可能なチャンネル:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "ブロードキャストリスト:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(右クリックで編集/削除)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "新規..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "次を検索"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "スキャン開始"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "フィルタ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "FTA (Free To Air)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "プロバイダ:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< 選択したものを追加"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< フィルタされたものを追加"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "発見"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "完了"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "チャンネルの編集"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "周波数:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "シンボルレート:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "スクランブルあり"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "テレテキスト PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "サービス ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "ビデオ PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "トランスポートストリーム ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "字幕 PID..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "オーディオ PID..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "帯域幅:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC 高:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC 低:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "エンコードの設定"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "エンコーダ:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "ベースディレクトリ:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "パラノイア:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "すべてのチェックを無効にする"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "標準モード"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "パラノイアモード"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr ""
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD ツールバー"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame mp3 のオプション"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "ビットレート:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/秒"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis のオプション"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "品質 :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "プレイリスト(&L)"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "終了オプション"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "プレーヤ(&P)"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "自動リサイズ(&R)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "ネットワークブロードキャスト(&N)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "ナビゲーション(&N)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "DVD メニュー(&D)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "オーディオ(&A)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "ビデオ(&V)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "アスペクト比(&A)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "スクリーンショットツールバー"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "コントロールツールバー"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "音量ツールバー"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "ポジションツールバー"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine 設定"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "動作"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "ウィンドウを最小化したときにビデオを一時停止する"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "システムトレイに組み込む"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " 秒"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "オフ"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "システムトレイにタイトルを表示する時間"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "DVB クライアントを有効にする"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "その他のオプション"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "メタタグに代用エンコーディング (Unicode 以外) を使う"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"メタタグのエンコーディングを選択\n"
+"(Unicode に変換するため)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "最近のファイルの履歴を削除"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "直ちに再生開始"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "フルスクリーンモードで開始"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "オーディオドライバの設定"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "ビデオドライバの設定"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "オーディオ CD/VCD/DVD デバイスのパスを設定"
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "xine のデバックメッセージを出力"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "インストールウィザードを実行"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr "ローカルファイルや URL、ディレクトリ、DVD、VCD、音楽 CD が再生できます。"
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "開始"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "プレーヤウィンドウ"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "サポートされるメディア形式"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG オーディオファイル"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG ビデオファイル"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis ファイル"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI ファイル"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime ファイル"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media ファイル"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska ファイル"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC ファイル"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media ファイル"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV ファイル"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "プレーヤパーツ '%1' の読み込みに失敗しました。"
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 は検索パスに見つかりません。"
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "URL を開く(&U)..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "ディレクトリを開く(&I)..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "このトラックで終了しモニタを切る"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "このトラックで終了"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "このプレイリストで終了"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "最小モード(&M)"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "プレイリストとプレーヤの切り替え(&P)"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "元のアスペクト比を保つ(&O)"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "等倍"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "2 倍"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "3 倍"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "プレーヤエンジン(&P)"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB クライアント"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "プレーヤ"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "メインウィンドウ"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS X サーバエクステンションが見つかりませんでした。"
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"ファイルやプレイリストの再生が終了した後に、Kaffeine を終了しモニタの電源を切ります。モニタの電源を切るためには、X の設定ファイルに Option "
+"\"dpms\" の記述が必要です。"
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "ファイルを開く"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "URL を開く"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "URL を入力:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "フォルダを開く"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "%1 がドライブにセットされていないか、デバイスのパスが不正です。"
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "正しいドライブを選択:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 インストールウィザード"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "インストールチェック"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "OK"
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "パーツが見つかりません。インストール状況を確認してください。"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "検出されたバージョン"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine には KDE >= %1 が必要です。"
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 コーデック"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"/usr/lib/win32 に WIN32 コーデックが見つかりません。Windows Media 9 ファイルや新しい Real Media "
+"ファイルの他、一部の独自なフォーマットが再生できません。コーデックをダウンロードしてください。"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss が見つかりません。ほとんどの商用コンテンツは暗号化されており、そのような DVD "
+"を再生することができません。ライブラリをダウンロードしてください。(ただし、このライブラリの使用はあなたの国の法律を犯す恐れがあります。)"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD ドライブ"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "DMA モードが無効です! スムーズな DVD 再生のために root 権限で実行してください:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "DMA モードを確認できません。権限がないかデバイスが見つかりません:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB デバイス"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "DVB デバイスが見つかりません。DVB 関連の機能を隠します。"
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "ディストリビューション"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr "SuSE から配布された xine-lib はパテント上の問題が含まれていますので、ここの パッケージを使用してください。:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "結果"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "一部の機能に制限がありますが、動作に支障はありません。"
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "すべて OK!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "mms:// (Microsoft Media) ストリームのヘルパーアプリケーションとして Kaffeine を使用する"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr "rtsp:// (Real Media など) のヘルパーアプリケーションとして Kaffeine を使用する"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "デスクトップに Kaffeine アイコンを作成する"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "インストールオプション"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "ノンインターレース化の画質"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"CPU 使用率=最低、画質=最低:"
+"<br>インターレースの状態で再生されるため、垂直方向の解像度が半分になります。しかし、PCI "
+"ビデオカードを使用しているような一部の遅いシステムでは、通常の再生と比較して CPU の使用率が改善される可能性があります。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr "CPU 使用率=低、画質=低:<br>画像を垂直方向にぼやけさせて、インターレースの効果を削除します。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr "CPU 使用率=中、画質=中:<br>画像は分割して分析され、表示領域の一部のインターレース画像が修正されます。(インターポレート)"
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr "CPU 使用率=高、画質=高:<br>DVD がより高画質に再生できます。また、クロマ・アップサンプリング・エラーが修正されます。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"CPU 使用率=最高、画質=最高:"
+"<br>最も効果的なノンインターレース化アルゴリズムを使用します。これにより、フレームレートは通常のテレビの倍となります。(30->"
+"60fps) また、3-2 プルダウンの検出と逆 3-2 プルダウンを実行します。*"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"CPU 使用率=極めて高、画質=極めて高 (実験的):"
+"<br>ジャダー補正を有効にし、フィルムのオリジナルである 24fps の速度で再生します。また、垂直方向のカラーを滑らかにし、一部の DVD "
+"でみられるカラーの縞を修正します。*"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "ユーザ定義"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "ノンインターレース化プラグイン (tvtime) の設定..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr "* <i>2.6 カーネル (またはパッチ適用済みの 2.4 カーネル) が必要です。</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "ノンインターレース化プラグイン (tvtime) の設定"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "エフェクトプラグイン"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "オーディオ"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "オーディオフィルタ"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "オーディオフィルタを有効にする"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "フィルタを追加"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "すべてのフィルタを削除"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "ビデオ"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "ビデオフィルタ"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "ビデオフィルタを有効にする"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "xine エンジンのパラメータ"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 オプション"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "一般オプション"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "上級オプション"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "xine ベースの Kaffeine 用プレーヤパーツ"
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL (Synchronized Multimedia Integration Language) のサポートはまだ不完全です。\n"
+"XinePart はレイアウトのないビデオソースの再生を試みることができます。続けますか?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "ストリームに名前を付けて保存"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "字幕"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "オーディオチャンネル"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 / %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG ファイル\n"
+"*.bmp|BMP ファイル\n"
+"*.xbm|XBM ファイル"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "スクリーンショットを保存"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "ブロードキャストポート:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "ブロードキャストストリームの受信を設定"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "送信者アドレス:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "ポート:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "ジャンプ位置:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine エラー"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine メッセージ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "準備完了"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "再生中"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "字幕ファイル"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "ストリームに名前を付けて保存"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "トラック情報"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "URL をクリップボードにコピー"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Kaffeine のウィンドウで再生"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "ブロードキャストストリームを送信(&S)..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "ブロードキャストストリームを受信(&R)..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "スクリーンショットを保存(&S)..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "ストリームを保存..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr "現在のストリームをハードディスクに保存します。この機能は、法律上の問題により一部のフォーマットでは無効となります。"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "最小モードを切り替え"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "一時停止"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "早送り(&F)"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "スロー(&M)"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "スキップ 進む (20 秒)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "スキップ 戻る (20 秒)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "スキップ 進む (1 分)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "スキップ 戻る (1 分)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "スキップ 進む (10 分)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "スキップ 戻る (10 分)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "指定位置へジャンプ..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD メニュー (左)"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD メニュー (右)"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD メニュー (上)"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD メニュー (下)"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD メニュー (選択)"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "オーディオチャンネル"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "オーディオチャンネルの選択"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "オーディオ視覚効果(&V)"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "音量を上げる"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "音量を下げる"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "ノンインターレース化(&D)"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "DVD などのインターレース・ストリーミングを使用するときに有効にします。"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "自動(&A)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "4:3(&4)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "アナモルフィック(&N)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "正方形(&S)"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "水平方向に拡大"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "水平方向に縮小"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "垂直方向に拡大"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "垂直方向に縮小"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "ノンインターレース化の画質(&Q)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "ビデオの設定(&V)"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "イコライザ(&E)"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "メニュー切り替え(&M)"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "タイトル(&T)"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "ルート(&R)"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "サブピクチャ(&S)"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "アングル(&G)"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "パーツ(&P)"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "タイトル"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "チャプタ"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "アングル"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "トラック情報(&I)"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "エフェクトプラグイン(&P)..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&xine エンジンのパラメータ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "音量"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "位置"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"短くクリック: タイマーの経過/残り表示の切り替え\n"
+"長くクリック: タイマー OSD の切り替え"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "再生時間"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "CDDB のエントリを探索..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "オーディオ CD トラック %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD トラック %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "ビデオの設定"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "色相"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "彩度"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "コントラスト"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "明るさ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "A/V オフセット"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "字幕オフセット"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "自動"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"警告: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "情報がありません。"
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"セキュリティ警告: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"接続先ホストが見あたりません。\n"
+"指定したホスト名が正しいか確認してください。"
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "指定されたデバイス名は無効です。"
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"ネットワークに到達できません。\n"
+"ネットワーク設定やサーバ名を確認してください。"
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "デバイスが使用中のため、オーディオ出力ができません。"
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"接続が拒否されました。\n"
+"ホスト名を確認してください。"
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "指定されたファイルまたは URL が見つかりませんでした。確認してください。"
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "コンテンツを使用する権限がありません"
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"コンテンツを読み込むことができません。\n"
+"アクセス権がないか、コンテンツがデータを含んでいないと思われます。(例: ドライブにディスクが挿入されていない)"
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "ライブラリまたはデコーダの読み込み中に問題が発生しました: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "著作権保護機能により暗号化されており、読み取ることができません。"
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"この DVD は暗号化されているため、再生には libdvdcss が必要になります。これを利用できるかどうかは、各国の法律によって異なります。"
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"未知のエラー: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "エラー: 新しいビデオドライバ (%1) を初期化できないので %2 を使用します"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "使用するビデオドライバ: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "エラー: 新しいオーディオドライバ (%1) を初期化できないので %2 を使用します"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "使用するオーディオドライバ: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "xine 初期化..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "xine エンジンを初期化できません"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "使用するオーディオドライバ (初期値: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "使用するビデオドライバ (初期値: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "ソフトウェアオーディオミキサを使う"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "OSD メッセージを表示する"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "OSD の文字サイズ"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "OSD メッセージのフォント"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "ビデオドライバ (%1) を初期化できません。- 'auto' を試します..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "すべてのビデオドライバが初期化に失敗しました!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "オーディオドライバ (%1) を初期化できません。- 'auto' を試します..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "すべてのオーディオドライバが初期化に失敗しました!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "新しい xine ストリームを作成できません"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: 開始します..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "開始します..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "オーディオコーデック"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "ビデオコーデック"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "リソースを処理するプラグインが見つかりません"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "リソースが壊れています"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "要求されたリソースが存在しません"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "リソースを開けません"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "一般エラー"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "ミュート オフ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "ミュート オン"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "早送り %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "スロー %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "ノンインターレース化: オン"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "ノンインターレース化: オフ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "アスペクト比"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "自動"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "ズーム X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "ズーム Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ミリ秒"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "イコライザの設定"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "音量増幅率"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "イコライザの音量増幅率 - ノイズが発生する場合は無効にしてください"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "フィルタを削除"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "%s へシーク"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "GStreamer の初期化に失敗しました。"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "ミュート"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "コメント"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "&GStreamer エンジンのパラメータ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer を初期化できませんでした。"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"GStreamer-registry がありません。インストール後に root 権限で <b>gst-register</b> を実行しましたか?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "オーディオドライバ (%1) を初期化できません - 別のものを試します..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "使用できるオーディオドライバが見つかりません。"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "ビデオドライバ (%1) を初期化できません - 別のものを試します..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "使用できるビデオドライバが見つかりません。"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "GStreamer エンジンのパラメータ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "オーディオの設定"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "優先するオーディオドライバ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "ビデオの設定"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "優先するビデオドライバ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* 再起動が必要です。"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "メディア"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "メディアのオプション"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD ドライブ"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "ダミーパート"
diff --git a/po/ka.po b/po/ka.po
new file mode 100644
index 0000000..a9f6bc8
--- /dev/null
+++ b/po/ka.po
@@ -0,0 +1,3683 @@
+# translation of kaffeine.po to Georgian
+#
+# Rusudan Tsiskreli <tsiskreli@gmail.com>, 2006.
+# George Machitidze <giomac@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-08-13 14:51+0400\n"
+"Last-Translator: George Machitidze <giomac@gmail.com>\n"
+"Language-Team: Georgian <guiasher@mes.gov.ge>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=1; plural=0\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "განახლება"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "დაგეგმილი"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "მიმდინარე/შემდეგი"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "არხი"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "დაწყება"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "ხანგრძლიობა"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "სათაური"
+
+#: input/dvb/kevents.cpp:140
+#, fuzzy
+msgid "View All Programs"
+msgstr "ყველა პროგრამების ხილვა"
+
+#: input/dvb/kevents.cpp:142
+#, fuzzy
+msgid "Add to Timers"
+msgstr "წამზომისთვის დამატება"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "სახელი:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "არხი:"
+
+#: input/dvb/ktimereditor.cpp:43
+#, fuzzy
+msgid "Begin:"
+msgstr "დაწყება:"
+
+#: input/dvb/ktimereditor.cpp:47
+#, fuzzy
+msgid "Duration:"
+msgstr "ციკლის ხანგრძლივობა:"
+
+#: input/dvb/ktimereditor.cpp:51
+#, fuzzy
+msgid "End:"
+msgstr "დასასრული:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "ჩაწერა როგორც:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, fuzzy, no-c-format
+msgid "None"
+msgstr "არა"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, fuzzy, no-c-format
+msgid "Daily"
+msgstr "ყოველდღიურად"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, fuzzy, no-c-format
+msgid "Weekly"
+msgstr "ყოველკვირეულად"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, fuzzy, no-c-format
+msgid "Monthly"
+msgstr "ყოველთვიურად"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, fuzzy, no-c-format
+msgid "Custom"
+msgstr "სხვა"
+
+#: input/dvb/ktimereditor.cpp:130
+#, fuzzy
+msgid "Repeat..."
+msgstr "გამეორება..."
+
+#: input/dvb/ktimereditor.cpp:132
+#, fuzzy
+msgid "Timer Editor"
+msgstr "მრიცხველის რედაქტორი"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+#, fuzzy
+msgid "You must give it a name!"
+msgstr "თქვენ სახელი უნდა მიანიჭოთ!"
+
+#: input/dvb/ktimereditor.cpp:215
+#, fuzzy
+msgid "Duration must be at least 1 minute!"
+msgstr "ხანგრძლიობა 1 წუთი მაინც უნდა იყოს!"
+
+#: input/dvb/ktimereditor.cpp:236
+#, fuzzy
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"სახელი არ უნდა შეიცავდეს ნებისმიერს შემდეგი სიმბოლოებიდან: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+#, fuzzy
+msgid "Initial Transponder Settings"
+msgstr "ინიციალიზაციის ტრანსპორტის პარამეტრები"
+
+#: input/dvb/channeleditor.cpp:115
+#, fuzzy
+msgid "This name is not unique."
+msgstr "სახელი არაა უნიკალური."
+
+#: input/dvb/channeleditor.cpp:126
+#, fuzzy
+msgid "Missing audio pid(s)!"
+msgstr "აუდიო pid არ არის!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+#, fuzzy
+msgid "Pid must be non zero!"
+msgstr "Pid არ უნდა იყოს zero!"
+
+#: input/dvb/crontimer.cpp:100
+#, fuzzy
+msgid "You have to choose some days."
+msgstr "თქვენ უნდა აირჩიოთ ზოგი დღე."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, fuzzy, no-c-format
+msgid "Channels"
+msgstr "არხები"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+#, fuzzy
+msgid "Timers"
+msgstr "წამზომები"
+
+#: input/dvb/dvbpanel.cpp:139
+#, fuzzy
+msgid "Electronic Program Guide"
+msgstr "პროგრამის ელექტრონული გიდი"
+
+#: input/dvb/dvbpanel.cpp:142
+#, fuzzy
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+#, fuzzy
+msgid "DVB settings"
+msgstr "DVB პარამეტრები"
+
+#: input/dvb/dvbpanel.cpp:163
+#, fuzzy
+msgid "Number"
+msgstr "ნომერი"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, fuzzy, no-c-format
+msgid "Name"
+msgstr "სახელი"
+
+#: input/dvb/dvbpanel.cpp:176
+#, fuzzy
+msgid "Audio Channels"
+msgstr "აუდიო არხები"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+#, fuzzy
+msgid "Instant Record"
+msgstr "უმალვე ჩაწერა"
+
+#: input/dvb/dvbpanel.cpp:184
+#, fuzzy
+msgid "Broadcast"
+msgstr "მაუწყებლობა"
+
+#: input/dvb/dvbpanel.cpp:194
+#, fuzzy
+msgid "Time shifting"
+msgstr "დროის გადაწევა"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+#, fuzzy
+msgid "Recording"
+msgstr "ჩაწერა"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+#, fuzzy
+msgid "Broadcasting"
+msgstr "მაუწყებლობა"
+
+#: input/dvb/dvbpanel.cpp:271
+#, fuzzy
+msgid "Select icon..."
+msgstr "ფილმის ამორჩევა"
+
+#: input/dvb/dvbpanel.cpp:278
+#, fuzzy
+msgid "Choose channel icon"
+msgstr "არხის რედაქტორი"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+#, fuzzy
+msgid "Digital TV"
+msgstr "ციფრული ტელევიზორი"
+
+#: input/dvb/dvbpanel.cpp:317
+#, fuzzy
+msgid "Live digital TV only works with the xine engine."
+msgstr "ციცხალი ციფრული ტელევიზორი მხოლოდ xine ძრავათი მუშაობს."
+
+#: input/dvb/dvbpanel.cpp:331
+#, fuzzy
+msgid "OSD Next Channel"
+msgstr "OSD შემდეგი არხი"
+
+#: input/dvb/dvbpanel.cpp:332
+#, fuzzy
+msgid "OSD Previous Channel"
+msgstr "OSD წინა არხი"
+
+#: input/dvb/dvbpanel.cpp:333
+#, fuzzy
+msgid "OSD Zap"
+msgstr "OSD Zap"
+
+#: input/dvb/dvbpanel.cpp:334
+#, fuzzy
+msgid "OSD Next Event"
+msgstr "OSD შემდეგი მოვლენა"
+
+#: input/dvb/dvbpanel.cpp:335
+#, fuzzy
+msgid "OSD Previous Event"
+msgstr "OSD წინა მოვლენა"
+
+#: input/dvb/dvbpanel.cpp:337
+#, fuzzy
+msgid "Show OSD"
+msgstr "OSD ჩვენება"
+
+#: input/dvb/dvbpanel.cpp:338
+#, fuzzy
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+#, fuzzy
+msgid "Timers..."
+msgstr "წამზომები..."
+
+#: input/dvb/dvbpanel.cpp:340
+#, fuzzy
+msgid "Broadcasting..."
+msgstr "მაუწყებლობა..."
+
+#: input/dvb/dvbpanel.cpp:341
+#, fuzzy
+msgid "Channels..."
+msgstr "არხები..."
+
+#: input/dvb/dvbpanel.cpp:342
+#, fuzzy
+msgid "Configure DVB..."
+msgstr "DVB-ს კონფიგურაცია..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+#, fuzzy
+msgid "All"
+msgstr "ყველა"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, fuzzy, no-c-format
+msgid "TV"
+msgstr "ტელევიზორი"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, fuzzy, no-c-format
+msgid "Radio"
+msgstr "რადიო"
+
+#: input/dvb/dvbpanel.cpp:420
+#, fuzzy
+msgid "New Category..."
+msgstr "ახალი კატეგორია..."
+
+#: input/dvb/dvbpanel.cpp:423
+#, fuzzy
+msgid "Change Icon..."
+msgstr "ხატულის შეცვლა..."
+
+#: input/dvb/dvbpanel.cpp:425
+#, fuzzy
+msgid "Delete Category..."
+msgstr "კატეგორიის წაშლა..."
+
+#: input/dvb/dvbpanel.cpp:430
+#, fuzzy
+msgid "New Category"
+msgstr "ახალი კატეგორია"
+
+#: input/dvb/dvbpanel.cpp:430
+#, fuzzy
+msgid "Enter a name for this category:"
+msgstr "ამ კატეგორიის სახელის შეყვანა:"
+
+#: input/dvb/dvbpanel.cpp:449
+#, fuzzy
+msgid "Do you really want to delete this category?"
+msgstr "ნამდვილად გსურთ ამ კატეგორიის წაშლა?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+#, fuzzy
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>DVB მონაცემები http://hftom.free.fr/kaxtv/dvbdata.tar.gz დან ვერ იქნა "
+"მიღებული!"
+"<br>\t\t\tშეამოწმეთ თქვენი კავშირი ინტერნეტთან და კიდევ თქვით დიახ."
+"<br>\t\t\tან გასაუქმებლად თქვით არა."
+"<br>\t\t\tთუ უკვე გაქვთ ეს არქივი, გააკეთეთ მისი ასლი "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz -ში და თქვით დიახ."
+"<br>"
+"<br>კიდევ ვცადო?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+#, fuzzy
+msgid "Broadcasting failed."
+msgstr "მაუწყებლობა ვერ შედგა."
+
+#: input/dvb/dvbpanel.cpp:1135
+#, fuzzy
+msgid "Can't start broadcasting."
+msgstr "მაუწყებლობა ვერ გაიშვა."
+
+#: input/dvb/dvbpanel.cpp:1287
+#, fuzzy
+msgid "Timer successfully created and started."
+msgstr "მრიცხველი წარმატებით შეიქმნა და გაეშვა."
+
+#: input/dvb/dvbpanel.cpp:1427
+#, fuzzy
+msgid "You may want to define some channel first!"
+msgstr "თქვენ შეიძლება დაგჭირდეთ ჯერ ზოგი არხის განსაზღვრა!"
+
+#: input/dvb/dvbpanel.cpp:1491
+#, fuzzy
+msgid "Timer successfully created."
+msgstr "მრიცხველი წარმატებით შეიქმნა."
+
+#: input/dvb/dvbpanel.cpp:1887
+#, fuzzy
+msgid "Still recording."
+msgstr "ჯერ კიდევ იწერება."
+
+#: input/dvb/dvbpanel.cpp:1890
+#, fuzzy
+msgid "Still broadcasting."
+msgstr "მაუწყებლობა ჯერ კიდევ მიდის."
+
+#: input/dvb/dvbpanel.cpp:1893
+#, fuzzy
+msgid "Can't tune dvb!"
+msgstr "dvb ვერ გაიმართა!"
+
+#: input/dvb/dvbpanel.cpp:1896
+#, fuzzy
+msgid "Can't set pid(s)"
+msgstr "pid ვერ მინიჭა"
+
+#: input/dvb/dvbpanel.cpp:1899
+#, fuzzy
+msgid "No CAM free"
+msgstr "CAM თავისუფალი არაა"
+
+#: input/dvb/dvbpanel.cpp:2493
+#, fuzzy
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine ჯერ კიდევ იწერს. ნამდვილად გსურთ გასვლა?"
+
+#: input/dvb/dvbpanel.cpp:2498
+#, fuzzy
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine-მა წამზომები რიგში ჩააყენა. ნამდვილად გსურთ გასვლა?"
+
+#: input/dvb/scandialog.cpp:84
+#, fuzzy
+msgid "Signal:"
+msgstr "სიგნალი:"
+
+#: input/dvb/scandialog.cpp:88
+#, fuzzy
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+#, fuzzy
+msgid "Lock:"
+msgstr "ჩაკეტილი:"
+
+#: input/dvb/scandialog.cpp:236
+#, fuzzy
+msgid "Edit..."
+msgstr "რედაქტირება..."
+
+#: input/dvb/scandialog.cpp:342
+#, fuzzy
+msgid "Do you really want to delete all channels?"
+msgstr "ნამდვილად გსურთ ყველა არხის წაშლა?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+#, fuzzy
+msgid "START scan"
+msgstr "სკანირების დაწყება"
+
+#: input/dvb/scandialog.cpp:837
+#, fuzzy
+msgid "STOP scan"
+msgstr "სკანირების შეწყვეტა"
+
+#: input/dvb/scandialog.cpp:843
+#, fuzzy
+msgid "Stopping..."
+msgstr "შეჩერება..."
+
+#: input/dvb/scandialog.cpp:939
+#, fuzzy
+msgid "Found: %1 TV - %2 radio"
+msgstr "მოიძებნა: %1 ტელევიზორი - %2 რადიო"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+#, fuzzy
+msgid "Can't open DVB info socket."
+msgstr "DVB ინფო სოკეტი ვერ გაიხსნა."
+
+#: input/dvb/krecord.cpp:40
+#, fuzzy
+msgid "Timers list:"
+msgstr "მრიცხველთა სია:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+#, fuzzy
+msgid "New"
+msgstr "ახალი"
+
+#: input/dvb/krecord.cpp:91
+#, fuzzy
+msgid "Stop/Delete"
+msgstr "გაჩერება/წაშლა"
+
+#: input/dvb/krecord.cpp:232
+#, fuzzy
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"მრიცხველი მეორდება. გსურთ მიმდინარე სამუშაოდ გამოტოვება ან მრიცხველის წაშლა?"
+
+#: input/dvb/krecord.cpp:232
+#, fuzzy
+msgid "Skip Current"
+msgstr "მიმდინარეს გაცდენა"
+
+#: input/dvb/krecord.cpp:234
+#, fuzzy
+msgid "Delete the selected timer?"
+msgstr "გსურთ არჩეული მრიცხველის წაშლა?"
+
+#: input/dvb/dvbconfig.cpp:247
+#, fuzzy
+msgid "Downloading... "
+msgstr "მიმდინარეობს ჩამოქაჩვა... "
+
+#: input/dvb/dvbconfig.cpp:247
+#, fuzzy
+msgid "Copying data files..."
+msgstr "მონაცემთა ფაილების ასლი..."
+
+#: input/dvb/dvbconfig.cpp:478
+#, fuzzy
+msgid "DVB Settings"
+msgstr "DVB პარამეტრები"
+
+#: input/dvb/dvbconfig.cpp:497
+#, fuzzy
+msgid "DVB Device"
+msgstr "DVB მოწყობილობა"
+
+#: input/dvb/dvbconfig.cpp:497
+#, fuzzy
+msgid "Device Settings"
+msgstr "მოწყობილობის პარამეტრები"
+
+#: input/dvb/dvbconfig.cpp:504
+#, fuzzy
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>სახელი:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+#, fuzzy
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>ტიპი:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+#, fuzzy
+msgid "Cable"
+msgstr "კაბელი"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+#, fuzzy
+msgid "Satellite"
+msgstr "სატელიტი"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "შემსრულებელი"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+#, fuzzy
+msgid "Unknown"
+msgstr "უცნობი"
+
+#: input/dvb/dvbconfig.cpp:524
+#, fuzzy
+msgid "Number of LNBs:"
+msgstr "LNBების ნომერი:"
+
+#: input/dvb/dvbconfig.cpp:531
+#, fuzzy
+msgid "1st sat:"
+msgstr "1 sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+#, fuzzy
+msgid "LNB Settings..."
+msgstr "LNB პარამეტრები..."
+
+#: input/dvb/dvbconfig.cpp:545
+#, fuzzy
+msgid "2nd sat:"
+msgstr "2 sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+#, fuzzy
+msgid "3rd sat:"
+msgstr "3 sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+#, fuzzy
+msgid "4th sat:"
+msgstr "4 sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+#, fuzzy
+msgid "LNB settings..."
+msgstr "LNB პარამეტრები..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, fuzzy, no-c-format
+msgid "Source:"
+msgstr "წყარო:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+#, fuzzy
+msgid "DVB Recording Options"
+msgstr "DVB ჩაწერის პარამეტრები"
+
+#: input/dvb/dvbconfig.cpp:626
+#, fuzzy
+msgid "Records directory:"
+msgstr "ჩანაწერთა დირექტორია:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+#, fuzzy
+msgid "Time shifting directory:"
+msgstr "დროის შერევის დირექტორია:"
+
+#: input/dvb/dvbconfig.cpp:644
+#, fuzzy
+msgid "Begin margin:"
+msgstr "შერწყმის დაწყება:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+#, fuzzy
+msgid "(minutes)"
+msgstr "(წუთები)"
+
+#: input/dvb/dvbconfig.cpp:653
+#, fuzzy
+msgid "End margin:"
+msgstr "შერწყმის დასასრული:"
+
+#: input/dvb/dvbconfig.cpp:662
+#, fuzzy
+msgid "Instant record duration:"
+msgstr "უმალვე ჩანაწერი ხანგძლივობა:"
+
+#: input/dvb/dvbconfig.cpp:671
+#, fuzzy
+msgid "Preferred format:"
+msgstr "უპირატესი ფორმატი:"
+
+#: input/dvb/dvbconfig.cpp:693
+#, fuzzy
+msgid "DVB Broadcasting"
+msgstr "DVB მაუწყებლობა"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+#, fuzzy
+msgid "Broadcast address:"
+msgstr "მაუწყებლობის მისამართი:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+#, fuzzy
+msgid "Broadcast port:"
+msgstr "მაუწყებლობის პორტი:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+#, fuzzy
+msgid "Info port:"
+msgstr "ინფორმაციის პორტი:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+#, fuzzy
+msgid "Misc"
+msgstr "სხვადასხვა"
+
+#: input/dvb/dvbconfig.cpp:725
+#, fuzzy
+msgid "Default charset (restart needed):"
+msgstr "ნაგულისხმები კოდირება (საჭიროა გადატვირთვა):"
+
+#: input/dvb/dvbconfig.cpp:736
+#, fuzzy
+msgid "Update scan data:"
+msgstr "სკანირებული მონაცემების განახლება:"
+
+#: input/dvb/dvbconfig.cpp:739
+#, fuzzy
+msgid "Download"
+msgstr "ჩამოტვირთვა"
+
+#: input/dvb/dvbconfig.cpp:742
+#, fuzzy
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Dump epg's მოვლენები \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+#, fuzzy
+msgid "Dump"
+msgstr "Dump"
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "DVB კლიენტი"
+
+#: input/dvb/dvbconfig.cpp:806
+#, fuzzy
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>DVB მონაცემები http://hftom.free.fr/kaxtv/dvbdata.tar.gz დან ვერ იქნა "
+"მიღებული!"
+"<br>\t\t\tშეამოწმეთ თქვენი კავშირი ინტერნეტთან და კიდევ თქვით დიახ."
+"<br>\t\t\tან გასაუქმებლად თქვით არა."
+"<br>"
+"<br>კიდევ ვცადო?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+#, fuzzy
+msgid "Invalid records directory."
+msgstr "არასწორი ჩანაწერთა დირექტორია."
+
+#: input/dvb/dvbconfig.cpp:882
+#, fuzzy
+msgid "Invalid time shifting directory."
+msgstr "არასწორი დროის შერევის დირექტორია."
+
+#: input/dvb/dvbconfig.cpp:887
+#, fuzzy
+msgid "Broadcast and Info ports must be different."
+msgstr "მაუწყებლობა და ინფორმაციის პორტები სხვადასხვა უნდა იყოს."
+
+#: input/dvb/dvbconfig.cpp:892
+#, fuzzy
+msgid "Invalid broadcast address."
+msgstr "მაუწყებლობის არასწორი მისამართი."
+
+#: input/dvb/dvbconfig.cpp:957
+#, fuzzy
+msgid "LNB Settings"
+msgstr "LNB პარამეტრები"
+
+#: input/dvb/dvbconfig.cpp:967
+#, fuzzy
+msgid "Universal LNB"
+msgstr "უნივერსალური LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+#, fuzzy
+msgid "Dual LO"
+msgstr "ორმაგი LO"
+
+#: input/dvb/dvbconfig.cpp:981
+#, fuzzy
+msgid "Single LO"
+msgstr "ცალი LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+#, fuzzy
+msgid "Dual LO switch frequency:"
+msgstr "ორმაგი LO-ს გადართვის სიხშირე:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid " (MHz)"
+msgstr "(მჰც)"
+
+#: input/dvb/dvbconfig.cpp:988
+#, fuzzy
+msgid "Lo-band frequency:"
+msgstr "Lo-band სიხშირე:"
+
+#: input/dvb/dvbconfig.cpp:992
+#, fuzzy
+msgid "Hi-band frequency:"
+msgstr "Hi-band სიხშირე:"
+
+#: input/dvb/dvbconfig.cpp:996
+#, fuzzy
+msgid "Single LO frequency:"
+msgstr "ცალი LO სიხშირე:"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "ცალი LO სიხშირე:"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "ცალი LO სიხშირე:"
+
+#: input/dvb/broadcasteditor.cpp:39
+#, fuzzy
+msgid "Reset"
+msgstr "ხელახალი კონფიგურაცია"
+
+#: input/dvb/ts2rtp.cpp:113
+#, fuzzy
+msgid "Can't open DVB broadcast socket."
+msgstr "DVB მაუწყებლობის სოკეტი ვერ გაიხსნა."
+
+#: input/dvb/ts2rtp.cpp:125
+#, fuzzy
+msgid "Can't init DVB broadcast socket."
+msgstr "DVB მაუწყებლობის სოკეტის ინიციალიზაცია ვერ შედგა."
+
+#: input/disc/paranoia.cpp:266
+#, fuzzy
+msgid "No audio encoders could be found."
+msgstr "აუდიო ენკოდერი ვერ კოიძებნა."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+#, fuzzy
+msgid "Loading of encoder '%1' failed."
+msgstr "'%1' კოდერის ჩატვირთვა ვერ შედგა."
+
+#: input/disc/paranoia.cpp:346
+#, fuzzy
+msgid "Unable to create folder: "
+msgstr "საქაღალდე ვერ შეიქმნა: "
+
+#: input/disc/paranoia.cpp:559
+#, fuzzy
+msgid "MB"
+msgstr "მბ"
+
+#: input/disc/paranoia.cpp:560
+#, fuzzy
+msgid "KB"
+msgstr "კბ"
+
+#: input/disc/paranoia.cpp:561
+#, fuzzy
+msgid "Bytes"
+msgstr "ბაიტები"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+#, fuzzy
+msgid "Audio CD"
+msgstr "აუდიო CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+#, fuzzy
+msgid "Play CD"
+msgstr "CD-ს დაკვრა"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+#, fuzzy
+msgid "Rip CD"
+msgstr "CD-ს გაფატვრა"
+
+#: input/disc/disc.cpp:132
+#, fuzzy
+msgid "Artist:"
+msgstr "არტისტი:"
+
+#: input/disc/disc.cpp:140
+#, fuzzy
+msgid "Album:"
+msgstr "ალბომი:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+#, fuzzy
+msgid "Track"
+msgstr "ჩანაწერი"
+
+#: input/disc/disc.cpp:165
+#, fuzzy
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "ამოირჩიეთ გასაფატრი ჩანაწერი და დააწკაპეთ <b>კოდირების</b> ღილაკს."
+
+#: input/disc/disc.cpp:169
+#, fuzzy
+msgid "Encode..."
+msgstr "კოდირება..."
+
+#: input/disc/disc.cpp:209
+#, fuzzy
+msgid "Audio CD encoding"
+msgstr "აუდიო CD-ს კოდირება"
+
+#: input/disc/disc.cpp:212
+#, fuzzy
+msgid "Play Audio CD"
+msgstr "Audio CD-ის დაკვრა"
+
+#: input/disc/disc.cpp:215
+#, fuzzy
+msgid "Play DVD"
+msgstr "DVD-ს დაკვრა"
+
+#: input/disc/disc.cpp:218
+#, fuzzy
+msgid "Play VCD"
+msgstr "VCD-ს დაკვრა"
+
+#: input/disc/disc.cpp:286
+#, fuzzy
+msgid "Open &DVD"
+msgstr "&DVD-ს გახსნა"
+
+#: input/disc/disc.cpp:287
+#, fuzzy
+msgid "Open &VCD"
+msgstr "&VCD-ს გახსნა"
+
+#: input/disc/disc.cpp:288
+#, fuzzy
+msgid "Open &Audio-CD"
+msgstr "&აუდიო CD-ს გახსნა"
+
+#: input/disc/disc.cpp:340
+#, fuzzy
+msgid "You must select the tracks to rip."
+msgstr "თქვენ უნდა აირჩიოთ გასაფატრი ჩანაწერი."
+
+#: input/disc/disc.cpp:439
+#, fuzzy
+msgid "Several Audio CD found. Choose one:"
+msgstr "რამდენიმე აუდიო CD მოიძებნა. აირჩიეთ ერთი:"
+
+#: input/disc/disc.cpp:539
+#, fuzzy
+msgid "No audio CD found."
+msgstr "აუდიო CD ვერ მოიძებნა."
+
+#: input/disc/disc.cpp:576
+#, fuzzy
+msgid "DVD Video"
+msgstr "DVD ვიდეო"
+
+#: input/disc/disc.cpp:576
+#, fuzzy
+msgid "Several DVD Video found. Choose one:"
+msgstr "რამდენიმე DVD ვიდეო მოიძებნა. აირჩიეთ ერთი:"
+
+#: input/disc/disc.cpp:632
+#, fuzzy
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+#, fuzzy
+msgid "Several (S)VCD found. Choose one:"
+msgstr "რამდენიმე VCD მოიძებნა. აირჩიეთ ერთი:"
+
+#: input/disc/cddb.cpp:330
+#, fuzzy
+msgid "No Title"
+msgstr "სათაურის გარეშე"
+
+#: input/disc/cddb.cpp:342
+#, fuzzy, c-format
+msgid "Track %1"
+msgstr "ჩანაწერი %1"
+
+#: input/disc/cddb.cpp:427
+#, fuzzy
+msgid "Searching local cddb entry ..."
+msgstr "იძებნება ლოკალური cddb ჩანაწერი..."
+
+#: input/disc/cddb.cpp:452
+#, fuzzy
+msgid "Searching remote cddb entry ..."
+msgstr "იძებნება დაშორებული cddb ჩანაწერი..."
+
+#: input/disc/cddb.cpp:476
+#, fuzzy
+msgid "Found exact match cddb entry ..."
+msgstr "ზუსტად დამთხვეული ჩანაწერი მოიძებნა cddb-ში..."
+
+#: input/disc/cddb.cpp:534
+#, fuzzy
+msgid "Found close cddb entry ..."
+msgstr "cddb-ში ახლო მდგომი ჩანაწერი მოიძებნა..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "რამდენიმე DVD ვიდეო მოიძებნა. აირჩიეთ ერთი:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+#, fuzzy
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+#, fuzzy
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Lame mp3 კოდირების მოდული Kaffeine-სთვის."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+#, fuzzy
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+#, fuzzy
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Ogg Vorbis კოდირების მოდული Kaffeine-სთვის."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+#, fuzzy
+msgid "DVB Client"
+msgstr "DVB კლიენტი"
+
+#: input/dvbclient/cdlisten.cpp:69
+#, fuzzy
+msgid "Can't open info socket."
+msgstr "ინფო სოკეტი ვერ გაიხსნა."
+
+#: input/dvbclient/cdlisten.cpp:80
+#, fuzzy
+msgid "Can't bind info socket!!!"
+msgstr "ინფო სოკეტი ვერ მიება!!!"
+
+#: input/dvbclient/cddump.cpp:191
+#, fuzzy
+msgid "Can't open socket."
+msgstr "სოკეტი ვერ მიენიჭა."
+
+#: input/dvbclient/cddump.cpp:202
+#, fuzzy
+msgid "Can't set socket option!!!"
+msgstr "სოკეტის პარამერი ვერ მიენიჭა!!!"
+
+#: input/dvbclient/cddump.cpp:209
+#, fuzzy
+msgid "Can't bind socket!!!"
+msgstr "სოკეტი ვერ მიება!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+#, fuzzy
+msgid "All Sizes"
+msgstr "ყველა ზომები"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+#, fuzzy
+msgid "Very Small"
+msgstr "ძალიან პატარა"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+#, fuzzy
+msgid "Small"
+msgstr "პატარა"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+#, fuzzy
+msgid "Medium"
+msgstr "საშუალო"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+#, fuzzy
+msgid "Large"
+msgstr "დიდი"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+#, fuzzy
+msgid "Very Large"
+msgstr "ძალიან დიდი"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+#, fuzzy
+msgid "New Search"
+msgstr "ახალი ძიება"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+#, fuzzy
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "არჩეული ყდა ხელმიუწვდომელია. გთხოვთ სხვა აირჩიოთ."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+#, fuzzy
+msgid "Cover Unavailable"
+msgstr "ყდა ხელმიუწვდომელია"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+#, fuzzy
+msgid "Cover Downloader"
+msgstr "ყვების ჩამომქაჩველი"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+#, fuzzy
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+"დამთხვეული გამოსახულებები ვერ მოიძებნა, გთხოვთ შეიყვანოთ ახალი საძიებო სიტყვა:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+#, fuzzy
+msgid "Enter new search terms:"
+msgstr "ახალი საძიებო სიტყვის შეყვანა:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+#, fuzzy
+msgid "Play"
+msgstr "დაკვრა"
+
+#: input/audiobrowser/urllistview.cpp:45
+#, fuzzy
+msgid "Play Next/Add to Queue"
+msgstr "შემდეგის დაკვრა/რიგში დამატება"
+
+#: input/audiobrowser/urllistview.cpp:51
+#, fuzzy
+msgid "Select &All"
+msgstr "&ყველას ამორჩევა"
+
+#: input/audiobrowser/urllistview.cpp:52
+#, fuzzy
+msgid "Create Playlist From Selected"
+msgstr "არჩეულისგან რეპერტუარის შექმნა"
+
+#: input/audiobrowser/urllistview.cpp:54
+#, fuzzy
+msgid "Add Sub&title..."
+msgstr "სუბ&ტიტრების დამატება..."
+
+#: input/audiobrowser/urllistview.cpp:56
+#, fuzzy
+msgid "&Edit Title"
+msgstr "სათაურის &რედაქტირება"
+
+#: input/audiobrowser/urllistview.cpp:57
+#, fuzzy
+msgid "&Info"
+msgstr "&ინფორმაცია"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+#, fuzzy
+msgid "Length"
+msgstr "სიგრძე"
+
+#: input/audiobrowser/urllistview.cpp:190
+#, fuzzy
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+#, fuzzy
+msgid "Artist"
+msgstr "შემსრულებელი"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+#, fuzzy
+msgid "Album"
+msgstr "ალბომი"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+#, fuzzy
+msgid "Year"
+msgstr "წელი"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+#, fuzzy
+msgid "Genre"
+msgstr "ჟანრი"
+
+#: input/audiobrowser/urllistview.cpp:199
+#, fuzzy
+msgid "Subtitles"
+msgstr "სუბტიტრები"
+
+#: input/audiobrowser/urllistview.cpp:205
+#, fuzzy
+msgid "in use"
+msgstr "გამოიყენება"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+#, fuzzy
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|სუბტიტრების ფაილები\n"
+"*.*|ყველა ფაილი"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+#, fuzzy
+msgid "Select Subtitle File"
+msgstr "სუბტიტრების ფაილის ამორჩევა"
+
+#: input/audiobrowser/playlist.cpp:263
+#, fuzzy
+msgid "Choose a Cover..."
+msgstr "ყდის ამორჩევა..."
+
+#: input/audiobrowser/playlist.cpp:264
+#, fuzzy
+msgid "Gallery..."
+msgstr "გალერეა..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+#, fuzzy
+msgid "Filter"
+msgstr "ფილტრი"
+
+#: input/audiobrowser/playlist.cpp:398
+#, fuzzy
+msgid "Playlist:"
+msgstr "რეპერტუარი:"
+
+#: input/audiobrowser/playlist.cpp:406
+#, fuzzy
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"ამოირჩიეთ აქტიური რეპერტუარი. რეპერტუარის სახელის შესაცვლად ჩაასწორეთ იგი და "
+"'დაბრუნებით' დაადასტურეთ."
+
+#: input/audiobrowser/playlist.cpp:458
+#, fuzzy
+msgid "Play Playlist"
+msgstr "რეპერტუარის დაკვრა"
+
+#: input/audiobrowser/playlist.cpp:486
+#, fuzzy
+msgid "&Repeat"
+msgstr "&გამეორება"
+
+#: input/audiobrowser/playlist.cpp:487
+#, fuzzy
+msgid "Loop playlist"
+msgstr "რეპერტუარის გამეორება"
+
+#: input/audiobrowser/playlist.cpp:488
+#, fuzzy
+msgid "Sh&uffle"
+msgstr "&არევა"
+
+#: input/audiobrowser/playlist.cpp:489
+#, fuzzy
+msgid "Play items in random order"
+msgstr "შემთხვევითი თანმიმდევრობით დაკვრა"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "მიმდინარე რეპერტუარის &წაშლა"
+
+#: input/audiobrowser/playlist.cpp:493
+#, fuzzy
+msgid "Ne&w Playlist"
+msgstr "&ახალი რეპერტუარი"
+
+#: input/audiobrowser/playlist.cpp:494
+#, fuzzy
+msgid "&Import Playlist..."
+msgstr "რეპერტუარის &იმპორტი..."
+
+#: input/audiobrowser/playlist.cpp:495
+#, fuzzy
+msgid "&Save Current Playlist As..."
+msgstr "მიმდინარე რეპერტუარის შენახვა &როგორც..."
+
+#: input/audiobrowser/playlist.cpp:496
+#, fuzzy
+msgid "Re&move Current Playlist"
+msgstr "მიმდინარე რეპერტუარის &წაშლა"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+#, fuzzy
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine რეპერტუარები"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+#, fuzzy
+msgid "All Files"
+msgstr "ყველა ფაილი"
+
+#: input/audiobrowser/playlist.cpp:527
+#, fuzzy
+msgid "Open Playlist"
+msgstr "რეპერტუარის გახსნა"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+#, fuzzy
+msgid "M3U Playlists"
+msgstr "M3U რეპერტუარები"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+#, fuzzy
+msgid "PLS Playlists"
+msgstr "PLS რეპერტუარები"
+
+#: input/audiobrowser/playlist.cpp:542
+#, fuzzy
+msgid "Save Playlist"
+msgstr "რეპერტუარის შენახვა"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+#, fuzzy
+msgid "Playlist"
+msgstr "რეპერტუარი"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+#, fuzzy
+msgid "NEW"
+msgstr "ახალი"
+
+#: input/audiobrowser/playlist.cpp:1004
+#, fuzzy
+msgid "Importing media resources..."
+msgstr "მედია რესურსების იმპორტი..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+#, fuzzy
+msgid "(no subtitles)"
+msgstr "(სუბტიტრები არაა)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+#, fuzzy
+msgid "Other subtitle..."
+msgstr "სხვა სუბტიტრები..."
+
+#: input/audiobrowser/playlist.cpp:1588
+#, fuzzy
+msgid "Gallery"
+msgstr "გალერეა"
+
+#: input/audiobrowser/playlist.cpp:1751
+#, fuzzy
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "რიგი: %1 ჩანაწერი, დაკვრის დრო: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+#, fuzzy
+msgid "Entries: %1, Playtime: %2"
+msgstr "ჩანაწერები: %1, დაკვრის დრო: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+#, fuzzy
+msgid "Remove '%1' from list and from disk?"
+msgstr "გსურთ '%1'-ს სიიდან და დისკიდან წაშლა?"
+
+#: input/audiobrowser/playlist.cpp:1888
+#, fuzzy
+msgid "Playlist Name Already Exists"
+msgstr "რეპერტუარის სახელი უკვე არსებობს"
+
+#: input/audiobrowser/playlist.cpp:1889
+#, fuzzy
+msgid "Enter different playlist name:"
+msgstr "განსხვასვებული რეპერტუარის სახელის შეყვანა:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+#, fuzzy
+msgid "Select Subtitle"
+msgstr "სუბტიტრების ამორჩევა"
+
+#: input/audiobrowser/playlist.cpp:2298
+#, fuzzy
+msgid "Media file:"
+msgstr "მედია ფაილი:"
+
+#: input/audiobrowser/playlist.cpp:2315
+#, fuzzy
+msgid "Select Movie"
+msgstr "ფილმის ამორჩევა"
+
+#: input/audiobrowser/playlist.cpp:2319
+#, fuzzy
+msgid "Subtitle file:"
+msgstr "სუბტიტრების ფაილი:"
+
+#: systemtray.cpp:60
+#, fuzzy
+msgid "Play / Pause"
+msgstr "დაკვრა / შეჩერება"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+#, fuzzy
+msgid "&Next"
+msgstr "&შემდეგი"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+#, fuzzy
+msgid "&Mute"
+msgstr "&ხმის გათიშვა"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+#, fuzzy
+msgid "Kaffeine Player"
+msgstr "Kaffeine დამკვრელი"
+
+#: startwindow.cpp:85
+#, fuzzy
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine დამკვრელი]"
+
+#: _translatorinfo.cpp:1
+#, fuzzy
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "რუსუდან ცისკრელი"
+
+#: _translatorinfo.cpp:3
+#, fuzzy
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "tsiskreli@gmail.com"
+
+#: main.cpp:73
+#, fuzzy
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"მედია დამკვრელი KDE 3-სთვის. დასაკრავად შეუძლია მრავალი backend-ის გამოყენება, "
+"ნაგულისხმევი (და რეკომენდირებული) არის xine."
+
+#: main.cpp:74
+#, fuzzy
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Kaffeine ავტორები"
+
+#: main.cpp:77
+#, fuzzy
+msgid "Current maintainer"
+msgstr "მიმდინარე მხარდამჭერი"
+
+#: main.cpp:78
+#, fuzzy
+msgid "Original author"
+msgstr "თავდაპირველი ავტორი"
+
+#: main.cpp:82
+#, fuzzy
+msgid "CICAM support."
+msgstr "CICAM მხარდაჭერა."
+
+#: main.cpp:83
+#, fuzzy
+msgid "Various valuable patches."
+msgstr "სხვადასხვა მნიშვნელოვანი ბებკი."
+
+#: main.cpp:84
+#, fuzzy
+msgid "DVB OSD browsing patch."
+msgstr "DVB OSD მიმოხილვის ბებკი."
+
+#: main.cpp:85
+#, fuzzy
+msgid "DVB categories patches."
+msgstr "DVB კატეგორიების ბებკი."
+
+#: main.cpp:86
+#, fuzzy
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Kaffeine 0.8 ლოგო და სხვა artwork."
+
+#: main.cpp:87
+#, fuzzy
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "ლოგოს ანიმაცია Kaffeine 0.5-სთვის"
+
+#: main.cpp:88
+#, fuzzy
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "მეტა ჭდეების ალტერნატიული კოდირება. ბევრი ბებკი."
+
+#: main.cpp:89
+#, fuzzy
+msgid "xine post plugin handling. Many patches."
+msgstr "xine პოსტ მოდულის დამმუშავებელი. ბევრი ბებკი."
+
+#: main.cpp:90
+#, fuzzy
+msgid "Subtitle file import."
+msgstr "სუბტიტრების ფაილის იმპორტი."
+
+#: main.cpp:91
+#, fuzzy
+msgid "M3U import. Testing."
+msgstr "M3U იმპორტი გამოცდა."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "სუბტიტრების PID რედაქტორი"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs"
+msgstr "სუბტიტრების PID"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, fuzzy, no-c-format
+msgid "New Item"
+msgstr "ახალი ელემენტი"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, fuzzy, no-c-format
+msgid "Move Up"
+msgstr "ზემოთ აწევა"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, fuzzy, no-c-format
+msgid "Move Down"
+msgstr "ქვემოთ ჩაწევა"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, fuzzy, no-c-format
+msgid "<< Update Selected"
+msgstr "<< რჩეულის განახლება"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, fuzzy, no-c-format
+msgid "<< New"
+msgstr "<< ახალი"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, fuzzy, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, fuzzy, no-c-format
+msgid "Page:"
+msgstr "გვერდი:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, fuzzy, no-c-format
+msgid "Sub page:"
+msgstr "ქვეგვერდი:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, fuzzy, no-c-format
+msgid "Lang:"
+msgstr "ენა:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, fuzzy, no-c-format
+msgid "Repeated Timer"
+msgstr "გამეორებული მრიცხველი"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, fuzzy, no-c-format
+msgid "Audio PIDs editor"
+msgstr "აუდიო PIDs რედაქტორი"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, fuzzy, no-c-format
+msgid "Audio PIDs"
+msgstr "აუდიო PIDs"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, fuzzy, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, fuzzy, no-c-format
+msgid "Broadcasting Editor"
+msgstr "მაუწყებლობის რედაქტორი"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, fuzzy, no-c-format
+msgid "Available channels:"
+msgstr "ხელმისაწვდომი არხები:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, fuzzy, no-c-format
+msgid "Broadcasting list:"
+msgstr "მაუწყებლობათა სია:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, fuzzy, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(მარჯვენა წკაპი რედაქტირებისთვის/წასაშლელად)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, fuzzy, no-c-format
+msgid "New..."
+msgstr "ახალი..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, fuzzy, no-c-format
+msgid "Search On"
+msgstr "ძიება"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, fuzzy, no-c-format
+msgid "Offset (KHz)"
+msgstr "წანაცვლება (კჰც)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, fuzzy, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, fuzzy, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, fuzzy, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, fuzzy, no-c-format
+msgid "Start Scan"
+msgstr "სკანირების გაშვება"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "ფილტრები"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, fuzzy, no-c-format
+msgid "Free to air"
+msgstr "თავისუფალი ეთერი"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, fuzzy, no-c-format
+msgid "Provider:"
+msgstr "მომწოდებელი:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, fuzzy, no-c-format
+msgid "<< Add Selected"
+msgstr "<< არჩეულის დამატება"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, fuzzy, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< გაფილტრულის დამატება"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, fuzzy, no-c-format
+msgid "Found"
+msgstr "მოიძებნა"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "SNR"
+msgstr "SNR:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, fuzzy, no-c-format
+msgid "Done"
+msgstr "შესრულებულია"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, fuzzy, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, fuzzy, no-c-format
+msgid "Channel Editor"
+msgstr "არხის რედაქტორი"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, fuzzy, no-c-format
+msgid "Nr:"
+msgstr "ნომერი:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, fuzzy, no-c-format
+msgid "Polarity"
+msgstr "ზრდილობა"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, fuzzy, no-c-format
+msgid "Frequency:"
+msgstr "სიხშირე:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, fuzzy, no-c-format
+msgid "Symbol rate:"
+msgstr "სიმბოლოთა სიხშირე:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, fuzzy, no-c-format
+msgid "Scrambled"
+msgstr "ცოცვა"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, fuzzy, no-c-format
+msgid "Teletext PID:"
+msgstr "Teletext PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, fuzzy, no-c-format
+msgid "Service ID:"
+msgstr "სერვისი ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, fuzzy, no-c-format
+msgid "Video PID:"
+msgstr "ვიდეო PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, fuzzy, no-c-format
+msgid "Transport stream ID:"
+msgstr "ტრანსპორტის დინების ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "სუბტიტრების PID..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, fuzzy, no-c-format
+msgid "Audio PIDs..."
+msgstr "აუდიო PID..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Bandwidth:"
+msgstr "გამტარობა:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, fuzzy, no-c-format
+msgid "FEC high:"
+msgstr "FEC მაღალი:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "Transmission:"
+msgstr "გადაცემა:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, fuzzy, no-c-format
+msgid "FEC low:"
+msgstr "FEC დაბალი:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, fuzzy, no-c-format
+msgid "Guard interval:"
+msgstr "დაცვის ინტერვალი:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Hierarchy:"
+msgstr "იერარქია:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, fuzzy, no-c-format
+msgid "Modulation:"
+msgstr "მოდულაცია:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Inversion:"
+msgstr "ინცვერსია:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, fuzzy, no-c-format
+msgid "Encoding Preferences"
+msgstr "კოდირების პარამეტრები"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, fuzzy, no-c-format
+msgid "Encoder:"
+msgstr "კოდირება:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Base directory:"
+msgstr "ამოსავალი დირექტორია:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, fuzzy, no-c-format
+msgid "Paranoia:"
+msgstr "პარანოია:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, fuzzy, no-c-format
+msgid "Disable all checking"
+msgstr "ყველა შემოწმების გამორთვა"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, fuzzy, no-c-format
+msgid "Normal mode"
+msgstr "ჩვეულებრივი რეჟიმი"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, fuzzy, no-c-format
+msgid "Paranoia mode"
+msgstr "პარანოიდალური რეჟიმი"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, fuzzy, no-c-format
+msgid "Normalize"
+msgstr "ნორმალიზაცია"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid "CD Toolbar"
+msgstr "CD ინსტრუმენტთა პანელი"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, fuzzy, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame mp3 პარამეტრები"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, fuzzy, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, fuzzy, no-c-format
+msgid "Bitrate:"
+msgstr "Bitrate:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, fuzzy, no-c-format
+msgid "Kb/s"
+msgstr "კბ/წმ"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, fuzzy, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis პარამეტრები"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, fuzzy, no-c-format
+msgid "Quality :"
+msgstr "ხარისხი:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, fuzzy, no-c-format
+msgid "Play&list"
+msgstr "&რეპერტუარი"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, fuzzy, no-c-format
+msgid "Quit Options"
+msgstr "გასვლის პარამეტრები"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, fuzzy, no-c-format
+msgid "&Player"
+msgstr "&დამკვრელი"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, fuzzy, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "ავტო &ზომის შეცვლის ჩართვა"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, fuzzy, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&ქსელში მაუწყებლობა"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, fuzzy, no-c-format
+msgid "&Navigation"
+msgstr "&ნავიგაცია"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, fuzzy, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, fuzzy, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD მენიუები"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, fuzzy, no-c-format
+msgid "&Audio"
+msgstr "&აუდიო"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, fuzzy, no-c-format
+msgid "&Video"
+msgstr "&ვიდეო"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, fuzzy, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&დასაშვები დონე"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, fuzzy, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "ეკრანის ანაბეჭდი ინსტრუმენტთა პანელი"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, fuzzy, no-c-format
+msgid "Controls Toolbar"
+msgstr "მართვის ინსტრუმენტთა პანელი"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, fuzzy, no-c-format
+msgid "Volume Toolbar"
+msgstr "ხმის ინსტრუმენტთა პანელი"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, fuzzy, no-c-format
+msgid "Position Toolbar"
+msgstr "პოზიციის ინსტრუმენტთა პანელი"
+
+#: pref.cpp:46
+#, fuzzy
+msgid "Kaffeine Setup"
+msgstr "Kaffeine გამართვა"
+
+#: pref.cpp:57
+#, fuzzy
+msgid "Behavior"
+msgstr "ქცევა"
+
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "დამალვისას ვიდეოს შეჩერება"
+
+#: pref.cpp:75
+#, fuzzy
+msgid "Embed in system tray"
+msgstr "ჩვენება სისტემურ &არეში"
+
+#: pref.cpp:81
+#, fuzzy
+msgid " sec"
+msgstr "წმ"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+#, fuzzy
+msgid "off"
+msgstr "გამორთულია"
+
+#: pref.cpp:84
+#, fuzzy
+msgid "Duration of title announcement in system tray"
+msgstr "სათაურის გამოცხადების ხანგრძლიობა სისტემურ პანელში"
+
+#: pref.cpp:96
+#, fuzzy
+msgid "Enable DVB client"
+msgstr "DVB კლიენტის ჩართვა"
+
+#: pref.cpp:130
+#, fuzzy
+msgid "Miscellaneous Options"
+msgstr "სხვადასხვა პარამეტრები"
+
+#: pref.cpp:135
+#, fuzzy
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "მეტა ჭდეებისთვის ალტერნატიული (არა-უნიკოდი) კოდირების გამოყენება"
+
+#: pref.cpp:155
+#, fuzzy
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"მეტა ჭდეებისთვის ალტერნატიული კოდირების სახელი აირჩიეთ\n"
+"(უნიკოდში კონვერრტაციისთვის)"
+
+#: pref.cpp:167
+#, fuzzy
+msgid "Clear recent files list"
+msgstr "უკანასკნელ ფაილთა სიის გაწმენდა"
+
+#: kaffeine.cpp:98
+#, fuzzy
+msgid "Start playing immediately"
+msgstr "დამკვრელის უმალვე გაშვება"
+
+#: kaffeine.cpp:100
+#, fuzzy
+msgid "Start in fullscreen mode"
+msgstr "სრული ეკრანის რეჟიმის დაწყება"
+
+#: kaffeine.cpp:102
+#, fuzzy
+msgid "Set audio driver"
+msgstr "აუდიო დრაივერის მითითება"
+
+#: kaffeine.cpp:104
+#, fuzzy
+msgid "Set video driver"
+msgstr "ვიდეო დრაივერის მითითება"
+
+#: kaffeine.cpp:106
+#, fuzzy
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "აუდიო-CD/VCD/DVD მოწყობილობების გეზის მითითება."
+
+#: kaffeine.cpp:107
+#, fuzzy
+msgid "Output xine debug messages"
+msgstr "xine განბზიკვის გამონატანის შეტყობინებები"
+
+#: kaffeine.cpp:109
+#, fuzzy
+msgid "Run installation wizard"
+msgstr "დაყენების ოსტატის გაშვება"
+
+#: kaffeine.cpp:110
+#, fuzzy
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"დასაკრავი ფაილ(ებ)ი. შესაძლოა იყოს ლოკალური ფაილი, URL, დირექტორია ან 'DVD', "
+"'VCD', 'AudioCD'."
+
+#: kaffeine.cpp:175
+#, fuzzy
+msgid "Start"
+msgstr "გაშვება"
+
+#: kaffeine.cpp:179
+#, fuzzy
+msgid "Player Window"
+msgstr "დამკვრელის ფანჯარა"
+
+#: kaffeine.cpp:205
+#, fuzzy
+msgid "Supported Media Formats"
+msgstr "მხარდაჭერილი მედია ფორმატები"
+
+#: kaffeine.cpp:206
+#, fuzzy
+msgid "MPEG Audio Files"
+msgstr "MPEG აუდიო ფაილები"
+
+#: kaffeine.cpp:207
+#, fuzzy
+msgid "MPEG Video Files"
+msgstr "MPEG ვიდეო ფაილები"
+
+#: kaffeine.cpp:208
+#, fuzzy
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis ფაილები"
+
+#: kaffeine.cpp:209
+#, fuzzy
+msgid "AVI Files"
+msgstr "AVI ფაილები"
+
+#: kaffeine.cpp:210
+#, fuzzy
+msgid "Quicktime Files"
+msgstr "Quicktime ფაილები"
+
+#: kaffeine.cpp:211
+#, fuzzy
+msgid "Real Media Files"
+msgstr "Real მედია ფაილები"
+
+#: kaffeine.cpp:212
+#, fuzzy
+msgid "Matroska Files"
+msgstr "Matroska ფაილები"
+
+#: kaffeine.cpp:213
+#, fuzzy
+msgid "FLAC Files"
+msgstr "FLAC ფაილები"
+
+#: kaffeine.cpp:214
+#, fuzzy
+msgid "Windows Media Files"
+msgstr "Windows მედია ფაილები"
+
+#: kaffeine.cpp:215
+#, fuzzy
+msgid "WAV Files"
+msgstr "WAV ფაილები"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+#, fuzzy
+msgid "Loading of player part '%1' failed."
+msgstr "დამკვრელის '%1' ნაწილის ჩატვირთვა ვერ შედგა."
+
+#: kaffeine.cpp:351
+#, fuzzy
+msgid "%1 not found in search path."
+msgstr "%1 ძიების გეზში ვერ მოიძებნა."
+
+#: kaffeine.cpp:698
+#, fuzzy
+msgid "Open &URL..."
+msgstr "&URL-ს გახსნა..."
+
+#: kaffeine.cpp:699
+#, fuzzy
+msgid "Open D&irectory..."
+msgstr "&დირექტორიის გახსნა..."
+
+#: kaffeine.cpp:701
+#, fuzzy
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "ამ ჩანაწერის შემდეგ გასვლა და მონიტორის გამორთვა"
+
+#: kaffeine.cpp:702
+#, fuzzy
+msgid "Quit After This Track"
+msgstr "გასვლა ამ ჩანაწერის შემდეგ"
+
+#: kaffeine.cpp:703
+#, fuzzy
+msgid "Quit After Playlist"
+msgstr "გასვლა რეპერტუარის შემდეგ"
+
+#: kaffeine.cpp:708
+#, fuzzy
+msgid "&Minimal Mode"
+msgstr "&მინიმალური რეჟიმი"
+
+#: kaffeine.cpp:709
+#, fuzzy
+msgid "Toggle &Playlist/Player"
+msgstr "რეპერტუარი/დამკვრელის &გადართვა"
+
+#: kaffeine.cpp:710
+#, fuzzy
+msgid "Keep &Original Aspect"
+msgstr "&ორიგინალური მდგომარეობის შენახვა"
+
+#: kaffeine.cpp:712
+#, fuzzy
+msgid "Original Size"
+msgstr "ორიგინალური ზომა"
+
+#: kaffeine.cpp:713
+#, fuzzy
+msgid "Double Size"
+msgstr "ორმაგი ზომა"
+
+#: kaffeine.cpp:714
+#, fuzzy
+msgid "Triple Size"
+msgstr "სამმაგი ზომა"
+
+#: kaffeine.cpp:716
+#, fuzzy
+msgid "&Player Engine"
+msgstr "&დამკვრელის ძრავა"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+#, fuzzy
+msgid "DVB client"
+msgstr "DVB კლიენტი"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+#, fuzzy
+msgid "Player"
+msgstr "დამკვრელი"
+
+#: kaffeine.cpp:1000
+#, fuzzy
+msgid "Main Window"
+msgstr "ძირითადი ფანჯარა"
+
+#: kaffeine.cpp:1061
+#, fuzzy
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS Xserver გაფართოვებები ვერ მოიძებნა."
+
+#: kaffeine.cpp:1068
+#, fuzzy
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"ეს გავა Kaffeine-დან და გამორთავს მონიტორს, როდესაც ფაილი/რეპერტუარი "
+"დასრულდება. პარამეტრი \"dpms\" უნდა იყოს თქვენს X config ფაილში მონიტორის "
+"გამოსართავად."
+
+#: kaffeine.cpp:1139
+#, fuzzy
+msgid "Open File(s)"
+msgstr "ფაილ(ებ)ის გახსნა"
+
+#: kaffeine.cpp:1448
+#, fuzzy
+msgid "Open URL"
+msgstr "URL-ს გახსნა"
+
+#: kaffeine.cpp:1448
+#, fuzzy
+msgid "Enter a URL:"
+msgstr "ჩაწერეთ URL:"
+
+#: kaffeine.cpp:1466
+#, fuzzy
+msgid "Open Folder"
+msgstr "საქაღალდის გახსნა"
+
+#: kaffeine.cpp:1489
+#, fuzzy
+msgid "No %1 in drive, or wrong path to device."
+msgstr "%1 არ არის მოწყობილობაში, ან მოწყობილობის გეზი არაა სწორი."
+
+#: kaffeine.cpp:1490
+#, fuzzy
+msgid "Please select correct drive:"
+msgstr "გთხოვთ სწორი მოწყობილობა აირჩიოთ:"
+
+#: instwizard.cpp:52
+#, fuzzy
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 დაყენების ოსტატი"
+
+#: instwizard.cpp:58
+#, fuzzy
+msgid "Installation Check"
+msgstr "დაყენების შემოწმება"
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine გამართვა"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+#, fuzzy
+msgid "Ok."
+msgstr "ოკ."
+
+#: instwizard.cpp:74
+#, fuzzy
+msgid "Part not found. Please check your installation!"
+msgstr "Part ვერ მოიძებნა. გთხოვთ შეამოწმოთ დაყენების მართებულობა!"
+
+#: instwizard.cpp:78
+#, fuzzy
+msgid "Found version"
+msgstr "მოიძებნა ვერსია"
+
+#: instwizard.cpp:82
+#, fuzzy, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine მოითხოვს KDE >= %1."
+
+#: instwizard.cpp:109
+#, fuzzy
+msgid "WIN32 Codecs"
+msgstr "WIN32 კოდეკები"
+
+#: instwizard.cpp:115
+#, fuzzy
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"WIN32 კოდეკები /usr/lib/win32-ში ვერ მოიძებნა. თქვენ არ შეგიძლიათ Windows Media "
+"9 ფაილების, ახალი Real Media ფაილების და სხვა ნაკლებად გამოყენებადი ფორმატების "
+"დაკვრა. კოდეკები აქედან ჩამოტვირთეთ:"
+
+#: instwizard.cpp:140
+#, fuzzy
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss ვერ მოიძებნა. თქვენ არ შეგიძლიათ დაშიფრული (უმეტესად კომერციული) "
+"DVD-ს დაკვრა. ბიბლიოთეკის აღება აქ შეგიძლიათ (მაგრამ მისი გამოყენება შეიძლება "
+"შეეწინააღმდეგოს თქვენს ქვეყანაში არსებულ საავტორო უფლებებს!):"
+
+#: instwizard.cpp:146
+#, fuzzy
+msgid "DVD Drive"
+msgstr "DVD მოწყობილობა"
+
+#: instwizard.cpp:155
+#, fuzzy
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "DMA რეჟიმი გამორთულია! გლუვად DVD დასაკრავად გაუშვით root-ად:"
+
+#: instwizard.cpp:157
+#, fuzzy
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"DMA რეჟიმის შემოწმება ვერ მოხერხდა. უფლება არ გაქვთ ან ეგეთი მოწყობილობა არ "
+"არსებობს:"
+
+#: instwizard.cpp:162
+#, fuzzy
+msgid "DVB-Device"
+msgstr "DVB-მოწყობილობა"
+
+#: instwizard.cpp:169
+#, fuzzy
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"DVB მოწყობილობები ვერ მოიძებნა. DVB-სთან დაკავშირებული ფუნქციები დაიმალება."
+
+#: instwizard.cpp:174
+#, fuzzy
+msgid "Distribution"
+msgstr "დისტრიბუტივი"
+
+#: instwizard.cpp:181
+#, fuzzy
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"xine-lib SuSE-ს მიერ გაკეთებულს \"შეიძლება ზოგი ფუნქცია აკლდეს "
+"კანონიერებისთვის\". თქვენ ეს პაკეტი აქედან უნდა გამოიყენოთ:"
+
+#: instwizard.cpp:189
+#, fuzzy
+msgid "RESULT"
+msgstr "შედეგი"
+
+#: instwizard.cpp:193
+#, fuzzy
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+"ზოგიერთი პრობლემა შეიქმნა, მიუხედავად ამისა Kaffeine-მა შეიძლება იმუშავოს."
+
+#: instwizard.cpp:197
+#, fuzzy
+msgid "All ok!"
+msgstr "ყველაფერი კარგადაა!"
+
+#: instwizard.cpp:208
+#, fuzzy
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Kaffeine-ის გამოყენება როგორც mms:// (Microsoft Media)-ის ნაკადების დამხმარე "
+"პროგრამის"
+
+#: instwizard.cpp:212
+#, fuzzy
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Kaffeine-ის გამოყენება როგორც rtsp:// (Real Media and others)-ის ნაკადების "
+"დამხმარე პროგრამის"
+
+#: instwizard.cpp:216
+#, fuzzy
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Kaffeine ხატულის სამუშაო მაგიდაზე შექმნა"
+
+#: instwizard.cpp:220
+#, fuzzy
+msgid "Installation Options"
+msgstr "დაყენების პარამეტრები"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+#, fuzzy
+msgid "User defined"
+msgstr "მომხმარებლის მიერ განსაზღვრული"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:38
+#, fuzzy
+msgid "Effect Plugins"
+msgstr "ეფექტის მოდულები"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+#, fuzzy
+msgid "Audio"
+msgstr "აუდიო"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+#, fuzzy
+msgid "Audio Filters"
+msgstr "აუდიო ფილტრები"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+#, fuzzy
+msgid "Add Filter"
+msgstr "ფილტრის დამატება"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+#, fuzzy
+msgid "Remove All Filters"
+msgstr "ყველა ფილტრის წაშლა"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+#, fuzzy
+msgid "Video"
+msgstr "ვიდეო"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+#, fuzzy
+msgid "Video Filters"
+msgstr "ვიდეო ფილტრები"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+#, fuzzy
+msgid "Enable video filters"
+msgstr "ვიდეო ფილტრების ჩართვა"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+#, fuzzy
+msgid "xine Engine Parameters"
+msgstr "xine ძრავის პარამეტრები"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+#, fuzzy
+msgid "%1 Options"
+msgstr "%1 პარამეტრები"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+#, fuzzy
+msgid "Beginner Options"
+msgstr "დამწყები პარამეტრები"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+#, fuzzy
+msgid "Expert Options"
+msgstr "ექსპერტი პარამეტრები"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "KaffeinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+#, fuzzy
+msgid "A xine based player part for Kaffeine."
+msgstr "xine-ზე დამყარებული დამკვრელის ნაწილი Kaffeine-სთვის."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:608
+#, fuzzy
+msgid "Save Stream As"
+msgstr "ნაკადის შენახვა როგორც"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+#, fuzzy
+msgid "Subtitle"
+msgstr "სუბტიტრები"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+#, fuzzy
+msgid "Audiochannel"
+msgstr "აუდიო არხი"
+
+#: player-parts/xine-part/xine_part.cpp:782
+#, fuzzy
+msgid "%1 of %2"
+msgstr "%1 %2-დან"
+
+#: player-parts/xine-part/xine_part.cpp:792
+#, fuzzy
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-ფაილი\n"
+"*.bmp|BMP-ფაილი\n"
+"*.xbm|XBM-ფაილი"
+
+#: player-parts/xine-part/xine_part.cpp:795
+#, fuzzy
+msgid "Save Screenshot As"
+msgstr "ეკრანის ანაბეჭდის შენახვა როგორც"
+
+#: player-parts/xine-part/xine_part.cpp:879
+#, fuzzy
+msgid "Broadcasting port:"
+msgstr "მაუწყებლობის პორტი:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+#, fuzzy
+msgid "Configure Receive Broadcast Stream"
+msgstr "მაუწყებლობის ნაკადის მიღების კონფიგურაცია"
+
+#: player-parts/xine-part/xine_part.cpp:903
+#, fuzzy
+msgid "Sender address:"
+msgstr "გამგზავნი მისამართი:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+#, fuzzy
+msgid "Port:"
+msgstr "პორტი:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+#, fuzzy
+msgid "Jump to position:"
+msgstr "პოზიციაზე გადასვლა:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+#, fuzzy
+msgid "xine Error"
+msgstr "xine შეცდომა"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+#, fuzzy
+msgid "xine Message"
+msgstr "xine შეტყობინება"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+#, fuzzy
+msgid "Ready"
+msgstr "მზად"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+#, fuzzy
+msgid "Playing"
+msgstr "იკვრება"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+#, fuzzy
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+#, fuzzy
+msgid "Subtitle File"
+msgstr "სუბტიტრების ფაილი"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+#, fuzzy
+msgid "Save Stream as"
+msgstr "ნაკადის შენახვა როგორც"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "ჩანაწერზე &ინფორმაცია"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+#, fuzzy
+msgid "Copy URL to Clipboard"
+msgstr "URL გაცვლის ბუფერში ასლი"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+#, fuzzy
+msgid "Play in Kaffeine Externally"
+msgstr "Kaffeine-ში გარეთ დაკვრა"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+#, fuzzy
+msgid "&Send Broadcast Stream..."
+msgstr "სამაუწყებლო ნაკადის &გაგზავნა..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+#, fuzzy
+msgid "&Receive Broadcast Stream..."
+msgstr "სამაუწყებლო ნაკადის მი&ღება..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+#, fuzzy
+msgid "&Save Screenshot..."
+msgstr "ეკრანის ანაბეჭდის &შენახვა..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+#, fuzzy
+msgid "Save Stream..."
+msgstr "ნაკადის შენახვა..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "&მინიმალური რეჟიმი"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+#, fuzzy
+msgid "Pause"
+msgstr "შეჩერება"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+#, fuzzy
+msgid "&Fast Forward"
+msgstr "&სწრაფი გადახვევა"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+#, fuzzy
+msgid "Slow &Motion"
+msgstr "ნელა &დაკვრა"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+#, fuzzy
+msgid "Skip Forward (20s)"
+msgstr "წინ გადასვლა (20წმ)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+#, fuzzy
+msgid "Skip Backward (20s)"
+msgstr "უკან გადასვლა (20წმ)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+#, fuzzy
+msgid "Skip Forward (1m)"
+msgstr "წინ გადასვლა (1წთ)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+#, fuzzy
+msgid "Skip Backward (1m)"
+msgstr "უკან გადასვლა (1წთ)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+#, fuzzy
+msgid "Skip Forward (10m)"
+msgstr "წინ გადასვლა (10წთ)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+#, fuzzy
+msgid "Skip Backward (10m)"
+msgstr "უკან გადასვლა (10წთ)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+#, fuzzy
+msgid "Jump to Position..."
+msgstr "პოზიციაზე გადასვლა..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+#, fuzzy
+msgid "DVD Menu Left"
+msgstr "DVD მენიუ მარცხნივ"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+#, fuzzy
+msgid "DVD Menu Right"
+msgstr "DVD მენიუ მარჯვნივ"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+#, fuzzy
+msgid "DVD Menu Up"
+msgstr "DVD მენიუ ზემოთ"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+#, fuzzy
+msgid "DVD Menu Down"
+msgstr "DVD მენიუ ქვემოთ"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+#, fuzzy
+msgid "DVD Menu Select"
+msgstr "DVD მენიუს ამორჩევა"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+#, fuzzy
+msgid "Audio Channel"
+msgstr "აუდიო არხი"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+#, fuzzy
+msgid "Select audio channel"
+msgstr "აუდიო არხის ამორჩევა"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+#, fuzzy
+msgid "Audio &Visualization"
+msgstr "აუდიო &ვიზუალიზაცია"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+#, fuzzy
+msgid "Volume Up"
+msgstr "ხმის ამოწევა"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+#, fuzzy
+msgid "Volume Down"
+msgstr "ხმის ჩაწევა"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+#, fuzzy
+msgid "&Auto"
+msgstr "&ავტო"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+#, fuzzy
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+#, fuzzy
+msgid "A&namorphic"
+msgstr "ა&ნამორფული"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+#, fuzzy
+msgid "&Square"
+msgstr "&კვადრატი"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+#, fuzzy
+msgid "Zoom In Horizontal"
+msgstr "ჰორიზონტალურად გაზრდა"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+#, fuzzy
+msgid "Zoom Out Horizontal"
+msgstr "ჰორიზონტალურად შემცირება"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+#, fuzzy
+msgid "Zoom In Vertical"
+msgstr "ვერტიკალურად გაზრდა"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+#, fuzzy
+msgid "Zoom Out Vertical"
+msgstr "ვერტიკალურად შემცირება"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+#, fuzzy
+msgid "&Video Settings"
+msgstr "&ვიდეო პარამეტრები"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+#, fuzzy
+msgid "&Equalizer"
+msgstr "&ეკვალაიზერი"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+#, fuzzy
+msgid "&Menu Toggle"
+msgstr "&მენიუს გადართვა"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+#, fuzzy
+msgid "&Title"
+msgstr "&სათაური"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+#, fuzzy
+msgid "&Root"
+msgstr "&Root"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+#, fuzzy
+msgid "&Subpicture"
+msgstr "&ქვესურათი"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+#, fuzzy
+msgid "An&gle"
+msgstr "კუ&თხე"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+#, fuzzy
+msgid "&Part"
+msgstr "&ნაწილი"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+#, fuzzy
+msgid "Titles"
+msgstr "სათაურები"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+#, fuzzy
+msgid "Chapters"
+msgstr "თავები"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+#, fuzzy
+msgid "Angles"
+msgstr "კუთხეები"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+#, fuzzy
+msgid "Track &Info"
+msgstr "ჩანაწერზე &ინფორმაცია"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+#, fuzzy
+msgid "Effect &Plugins..."
+msgstr "ეფექტის &მოდულები..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+#, fuzzy
+msgid "&xine Engine Parameters"
+msgstr "&xine ძრავის პარამეტრები"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+#, fuzzy
+msgid "Volume"
+msgstr "ხმა"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+#, fuzzy
+msgid "Position"
+msgstr "პოზიცია"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+#, fuzzy
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"მოკლე წკაპი: მრიცხველის წინ/უკან გადრთვა\n"
+"გრძელი წკაპი: OSD მრიცხველის გადრთვა"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+#, fuzzy
+msgid "Playtime"
+msgstr "დაკვრის დრო"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+#, fuzzy
+msgid "Looking for CDDB entries..."
+msgstr "CDDB ჩანაწერების ჩატვირთვა..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, fuzzy, c-format
+msgid "AudioCD Track %1"
+msgstr "AudioCD ჩანაწერი %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, fuzzy, c-format
+msgid "VCD Track %1"
+msgstr "VCD ჩანაწერი %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+#, fuzzy
+msgid "Video Settings"
+msgstr "ვიდეოს პარამეტრები"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+#, fuzzy
+msgid "Hue"
+msgstr "ტონი"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+#, fuzzy
+msgid "Saturation"
+msgstr "ინტენსივობა"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+#, fuzzy
+msgid "Contrast"
+msgstr "კონტრასტი"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+#, fuzzy
+msgid "Brightness"
+msgstr "სიკაშკაშე"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+#, fuzzy
+msgid "Audio/Video Offset"
+msgstr "აუდიო/ვიდეო შერევა"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+#, fuzzy
+msgid "Subtitle Offset"
+msgstr "სუბტიტრების შეწევა"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+#, fuzzy
+msgid "auto"
+msgstr "ავტო"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+#, fuzzy
+msgid ""
+"General Warning: \n"
+msgstr ""
+"საერთო გაფრთხილება: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+#, fuzzy
+msgid "No Informations available."
+msgstr "ინფორმაცია არაა ხელმისაწვდომი."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+#, fuzzy
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"დაცვის გაფრთხილება: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+#, fuzzy
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"ჰოსტი რომელთანაც დაკავშირებას ცდილობთ უცნობია.\n"
+"შეამოწმეთ მითითებული ჰოსტის მართებულობა. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+#, fuzzy
+msgid "The device name you specified seems invalid. "
+msgstr "მითითებული მოწყობილობის სახელი არასწორი ჩანს. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+#, fuzzy
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"ქსელი როგორც ჩანს მიუწვდომელია.\n"
+"შეამოწმეთ ქსელის გამართვა და სერვერის სახელი. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+#, fuzzy
+msgid "Audio output unavailable. Device is busy. "
+msgstr "აუდიო გამონატანი ხელმიუწვდომელია. მოწყობილობა დაკავებულია. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+#, fuzzy
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"კავშირი უარყოფილ იქნა.\n"
+"შეამოწმეთ ჰოსტის სახელი. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+#, fuzzy
+msgid "The specified file or url was not found. Please check it. "
+msgstr "აღნიშნული ფაილი ან url ვერ მოიძებნა. გთხოვთ შეამოწმოთ იგი. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+#, fuzzy
+msgid "Permission to this source was denied. "
+msgstr "ამ წყაროს წვდომის უფლება არ გაქვთ. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+#, fuzzy
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"წყაროვერ წაიკითხება.\n"
+"შესაძლოა არ გაქვთ ამისთვის საკმარისი უფლებები, ან წყარო არ შეიცავს მონაცემებს "
+"(მაგ: დისკი არაა მოწყობილობაში). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+#, fuzzy
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "ბიბლიოთეკის ან დეკოდერის ჩატვირთვისას შეცდომა მოხდა: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+#, fuzzy
+msgid "The source seems encrypted, and can't be read. "
+msgstr "წყარო როგორც ჩანს დაშიფრულია და ვერ წაიკითხება. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+#, fuzzy
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"თქვენი DVD ალბათ დაშიფრულია. თქვენი ქვეყვების კანონების თანახმად, თქვენ ან "
+"შეგიძლიათ ან არა გამოიყებოთ libdvdcss ამ დისკის წასაკითხად. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+#, fuzzy
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"უცნობი შეცდომა: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+#, fuzzy
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"შეცდომა: ახალი ვიდიო დრაივერის %1 ინიციალიზაცია ვერ შედგა - გამოიყენება %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, fuzzy, c-format
+msgid "Using Video Driver: %1"
+msgstr "ვიდეო დრაივერის გამოყენება: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+#, fuzzy
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"შეცდომა: ახალი აუდიო დრაივერის %1 ინიციალიზაცია ვერ შედგა - გამოიყენება %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, fuzzy, c-format
+msgid "Using Audio Driver: %1"
+msgstr "აუდიო დრაივერის გამოყენება: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+#, fuzzy
+msgid "Init xine..."
+msgstr "Init xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+#, fuzzy
+msgid "Can't init xine Engine!"
+msgstr "xine ძრავის ინიციალიზაცია ვერ შედგა!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+#, fuzzy
+msgid "Audiodriver to use (default: auto)"
+msgstr "გამოსაყენებელი აუდეო დრაივერი (ნაგულისხმევი:ავტო)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+#, fuzzy
+msgid "Videodriver to use (default: auto)"
+msgstr "გამოსაყენებელი ვიდეო დრაივერი (ნაგულისხმევი:ავტო)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+#, fuzzy
+msgid "Use software audio mixer"
+msgstr "პროგრამული აუდიო მიქსერის გამოყენება"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+#, fuzzy
+msgid "Show OSD Messages"
+msgstr "OSD შეტყობინებების ჩვენება"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+#, fuzzy
+msgid "Size of OSD text"
+msgstr "OSD ტექსტის ზომა"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+#, fuzzy
+msgid "Font for OSD Messages"
+msgstr "შრიფტი OSD შეტყობინებებისთვის"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+#, fuzzy
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "'%1' ვიდიო დრაივერის ინიციალიზაცია ვერ შედგა - 'ავტოს' ცდა..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+#, fuzzy
+msgid "All Video Drivers failed to initialize!"
+msgstr "ვერცერთი ვიდეო დრაივერის ინიციალიზაცია ვერ შედგა!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+#, fuzzy
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "'%1' აუდიო დრაივერის ინიციალიზაცია ვერ შედგა - 'ავტოს' ცდა..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+#, fuzzy
+msgid "All Audio Drivers failed to initialize!"
+msgstr "ვერცერთი აუდიო დრაივერის ინიციალიზაცია ვერ შედგა!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+#, fuzzy
+msgid "Can't create a new xine Stream!"
+msgstr "ახალი xine ნაკადი ვერ შეიქმნა!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+#, fuzzy
+msgid "DVB: opening..."
+msgstr "DVB: გახსნა..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+#, fuzzy
+msgid "Opening..."
+msgstr "იხსნება..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+#, fuzzy
+msgid "Audio Codec"
+msgstr "აუდიო კოდეკი"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+#, fuzzy
+msgid "Video Codec"
+msgstr "ვიდეო კოდეკი"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+#, fuzzy
+msgid "No plugin found to handle this resource"
+msgstr "ამ რესურსის დასმუშავებლად მოდული ვერ მოიძებნა"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+#, fuzzy
+msgid "Resource seems to be broken"
+msgstr "რესურსი როგორც ჩანს დაზიანებულია"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+#, fuzzy
+msgid "Requested resource does not exist"
+msgstr "მოთხვნილი რესურსი არ არსებობს"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+#, fuzzy
+msgid "Resource can not be opened"
+msgstr "რესურსი ვერ გაიხსნება"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+#, fuzzy
+msgid "Generic error"
+msgstr "ზოგადი შეცდომა"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+#, fuzzy
+msgid "Mute Off"
+msgstr "ხმის ჩართვა"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+#, fuzzy
+msgid "Mute On"
+msgstr "ხმის გამორთვა"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, fuzzy, c-format
+msgid "Fast Forward %1"
+msgstr "სწრაფი გადახვევა %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, fuzzy, c-format
+msgid "Slow Motion %1"
+msgstr "ნელი დაკვრა %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+#, fuzzy
+msgid "Aspect Ratio"
+msgstr "მისაღები დონე"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#, fuzzy
+msgid "Auto"
+msgstr "ავტო"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#, fuzzy
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#, fuzzy
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#, fuzzy
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+#, fuzzy
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+#, fuzzy
+msgid "Zoom X"
+msgstr "X გადიდება"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+#, fuzzy
+msgid "Zoom Y"
+msgstr "Y გადიდება"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#, fuzzy
+msgid "msec"
+msgstr "მწმ"
+
+#: player-parts/xine-part/equalizer.cpp:31
+#, fuzzy
+msgid "Equalizer Settings"
+msgstr "ეკვალაიზერის პარამეტრები"
+
+#: player-parts/xine-part/equalizer.cpp:43
+#, fuzzy
+msgid "Volume gain"
+msgstr "ხმის მიღება"
+
+#: player-parts/xine-part/equalizer.cpp:44
+#, fuzzy
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "ხმის მიღება ეკვალაიზერისთვის - თუ ხმა გაფუჭდა გამორთეთ ეს"
+
+#: player-parts/xine-part/postfilter.cpp:158
+#, fuzzy
+msgid "Delete Filter"
+msgstr "ფილტრის წაშლა"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, fuzzy, c-format
+msgid "Seeking to %s"
+msgstr "%s იძებნება"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+#, fuzzy
+msgid "GStreamer initializing failed!"
+msgstr "GStreamer ინიციალიზაცია ვერ შედგა!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+#, fuzzy
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+#, fuzzy
+msgid "Mute"
+msgstr "ხმის გათიშვა"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+#, fuzzy
+msgid "Comment"
+msgstr "კომენტარი"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+#, fuzzy
+msgid "&GStreamer Engine Parameters"
+msgstr "&GStreamer ძრავის პარამეტრები"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+#, fuzzy
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer ინიციალიზაცია ვერ მოხერხდა!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+#, fuzzy
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"GStreamer-registry არ არის! დაყენების შემდეგ დაგავიწყდათ <b>gst-register</b>"
+"-ის გაშვება?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+#, fuzzy
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "'%1' აუდიო დრაივერის ინიციალიზაცია ვერ მოხერხდა - სხვას ვცდი..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+#, fuzzy
+msgid "No useable audio-driver found!"
+msgstr "გამოსაყენებელი აუდიო დრაივერი ვერ მოიძებნა!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+#, fuzzy
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "'%1' ვიდეო დრაივერის ინიციალიზაცია ვერ მოხერხდა - სხვას ვცდი..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+#, fuzzy
+msgid "No useable video-driver found!"
+msgstr "გამოსაყენებელი ვიდეო დრაივერი ვერ მოიძებნა!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+#, fuzzy
+msgid "GStreamer Engine Parameters"
+msgstr "GStreamer ძრავის პარამეტრები"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#, fuzzy
+msgid "Audio Options"
+msgstr "აუდიო პარამეტრები"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+#, fuzzy
+msgid "Prefered audio driver"
+msgstr "უპირატესი აუდიო დრაივერი"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#, fuzzy
+msgid "Video Options"
+msgstr "ვიდეო პარამეტრები"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+#, fuzzy
+msgid "Prefered video driver"
+msgstr "უპირატესი ვიდეო დრაივერი"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+#, fuzzy
+msgid "* Restart required!"
+msgstr "* გადატვირთვაა საჭირო!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+#, fuzzy
+msgid "Media"
+msgstr "მედია"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+#, fuzzy
+msgid "Media Options"
+msgstr "მედია პარამეტრები"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+#, fuzzy
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD მოწყობილობა"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+#, fuzzy
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#, fuzzy
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "ეს არხები უკვე არსებობს და არ დაემატა:"
+
+#, fuzzy
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "X სერვერთან დაკავშირება ვერ განხორციელდა!"
+
+#, fuzzy
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "მთავარი ფანჯრის დახურვის შემდეგ Kaffeine დარჩება გაშვებული სისტემურ პანელში. პროგრამიდან გასასვლელად გამოიყენეთ დასრულება ფაილის მენიუდან."
+
+#, fuzzy
+#~ msgid "No player"
+#~ msgstr "დამკვრელი არაა"
+
+#, fuzzy
+#~ msgid "No layer"
+#~ msgstr "დონე არაა"
+
+#, fuzzy
+#~ msgid "Ch %1"
+#~ msgstr "თავი %1"
+
+#, fuzzy
+#~ msgid "Alternate Layout"
+#~ msgstr "ალტერნატიული განლაგება"
+
+#, fuzzy
+#~ msgid "Kaffeine Part"
+#~ msgstr "Kaffeine Part"
diff --git a/po/km.po b/po/km.po
new file mode 100644
index 0000000..e4686c3
--- /dev/null
+++ b/po/km.po
@@ -0,0 +1,3259 @@
+# translation of kaffeine.po to Khmer
+# translation of kaffeine.po to
+#
+# Khoem Sokhem <khoemsokhem@khmeros.info>, 2006.
+# Leang Chumsoben <soben@khmeros.info>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-04-25 15:50+0700\n"
+"Last-Translator: Leang Chumsoben <soben@khmeros.info>\n"
+"Language-Team: Khmer <support@khmeros.info>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "ធ្វើ​ឲ្យ​ស្រស់"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "បច្ចុប្បន្ន/បន្ទាប់"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "ឆានែល"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "ចាប់ផ្ដើម"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "ថិរវេលា"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "ចំណងជើង"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "មើល​កម្មវិធី​ទាំង​អស់"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "បន្ថែម​ទៅ​ឧបករណ៍​កំណត់​ពេលវេលា"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "ឈ្មោះ ៖"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "ឆានែល ៖"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "ចាប់ផ្ដើម ៖"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "ថិរវេលា ៖"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "បញ្ចប់ ៖"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "ថត​ជា ៖"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "គ្មាន"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "រាល់​ថ្ងៃ"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "រាល់​សប្ដាហ៍"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "រាល់​ខែ"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "ផ្ទាល់ខ្លួន"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "ចាក់​ម្ដង​ទៀត..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "កម្មវិធី​និពន្ធ​ឧបករណ៍​កំណត់​ពេលវេលា"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "អ្នក​ត្រូវ​តែ​ដាក់​ឈ្មោះ​ឲ្យ​វា !"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "ថិរវេលា​ត្រូវ​មាន​រយៈពេល​យ៉ាង​ហោច​ណាស់ ១ នាទី !"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "ឈ្មោះ​ត្រូវ​តែ​មិន​មាន​តួអក្សរ​ទាំងនេះ ៖ > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "ការ​កំណត់​ឧបករណ៍​ទទួល​ទូរលេខ​ដំបូង"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "ឈ្មោះ​នេះ​មិនមែន​មាន​តែ​មួយ​ឡើយ ។"
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "បាត់ pid របស់​អូឌីយ៉ូ !"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Pid ត្រូវ​តែ​មិនមែន​ជា​សូន្យ !"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "អ្នក​ត្រូវ​តែ​ជ្រើស​ថ្ងៃ​ណា​មួយ ។​"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "ឆានែល"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "ឧបករណ៍​កំណត់​ពេល​វេលា"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "មគ្គុទ្ទេសក៍​កម្មវិធី​អេឡិច​ត្រូនិក"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "ការ​កំណត់ DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "លេខ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "ឈ្មោះ"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "ឆានែល​អូឌីយ៉ូ"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "ថតភ្លាមៗ"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "ផ្សាយ"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "ការ​ផ្លាស់ប្ដូរ​ពេលវេលា"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "កំពុងថត"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "កំពុងផ្សាយ"
+
+#: input/dvb/dvbpanel.cpp:271
+#, fuzzy
+msgid "Select icon..."
+msgstr "ជ្រើស​ភាពយន្ត​"
+
+#: input/dvb/dvbpanel.cpp:278
+#, fuzzy
+msgid "Choose channel icon"
+msgstr "កម្មវិធី​និពន្ធ​ឆានែល"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "ទូរទស្សន៍​ឌីជីថល"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "ទូរទស្សន៍​ឌីជីថល​បន្តផ្ទាល់ ដំណើរការ​តែ​ជាមួយ​ម៉ាស៊ីន xine ប៉ុណ្ណោះ ។"
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "ឆានែល​បន្ទាប់​របស់ OSD"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "ឆានែល​មុន​របស់ OSD"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Zap"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "ព្រឹត្តិការណ៍​បន្ទាប់​របស់ OSD"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "ព្រឹត្តិការណ៍​មុន​របស់ OSD"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "បង្ហាញ OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "ឧបករណ៍​កំណត់​ពេល​វេលា..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "កំពុង​ផ្សាយ..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "ឆានែល..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "កំណត់​រចនាសម្ព័ន្ធ DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "ទាំងអស់"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "ទូរទស្សន៍"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "វិទ្យុ"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "ប្រភេទ​ថ្មី..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "ផ្លាស់ប្ដូរ​រូបតំណាង..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "លុប​ប្រភេទ..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "ប្រភេទ​ថ្មី"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "បញ្ចូល​ឈ្មោះ​មួយ​ឲ្យ​ប្រភេទ​នេះ ៖"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "តើ​អ្នក​ពិត​ជា​ចង់​លុប​ប្រភេទ​នេះ​ឬ ?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>មិន​អាច​ទទួល​ទិន្នន័យ DVB ពីhttp://hftom.free.fr/kaxtv/dvbdata.tar.gz "
+"បាន​ឡើយ !"
+"<br>\t\t\tសូម​ពិនិត្យ​មើល​ការ​តភ្ជាប់​អ៊ិនធឺណិត​របស់​អ្នក ហើយ​ចុច​ បាទ/ចាស "
+"ដើម្បី​ព្យាយាម​ម្ដង​ទៀត ។"
+"<br>\t\t\tឬ ចុច ទេ​ ​ដើម្បី​​បោះបង់ ។"
+"<br>\t\t\tប្រសិន​បើ​អ្នក​មាន​ប័ណ្ណសារ​នេះ​រួច​ហើយ "
+"សូម​ចម្លង​វា​ទៅ​ក្នុង~/.kde/share/apps/kaffeine/dvbdata.tar.gz ហើយ​ចុច​ "
+"បាទ/ចាស ។"
+"<br>"
+"<br>តើ​ខ្ញុំ​គួរ​ព្យាយាម​ម្ដង​ទៀត​ទេ ?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "ការ​ផ្សាយ​បាន​បរាជ័យ ។"
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "មិន​អាច​ចាប់ផ្ដើម​ផ្សាយ​ឡើយ ។"
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "បាន​បង្កើត និង ចាប់ផ្ដើម​ឧបករណ៍​កំណត់​ពេលវេលា​​ដោយ​ជោគជ័យ ។"
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "អ្នក​ប្រហែល​ជា​ចង់​កំណត់​ឆានែល​មួយ​ចំនួន​សិន !"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "បាន​បង្កើត​ឧបករណ៍​កំណត់​ពេលវេលា​ដោយ​ជោគជ័យ ។"
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "នៅ​កំពុង​ថត​នៅ​ឡើយ ។"
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "នៅ​កំពុង​ផ្សាយ​នៅ​ឡើយ ។"
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "មិន​អាច​រាវ​ប៉ុស្តិ៍ dvb ឡើយ !"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "មិន​អាច​កំណត់ pid ឡើយ"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine នៅ​កំពុង​ថត​នៅ​ឡើយ ។ តើ​អ្នក​ពិត​ជា​ចង់​ចេញ​ឬ ?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Kaffeine បាន​រៀប​ឧបករណ៍​កំណត់​ពេលវេលា​ជា​ជួរ ។ តើ​អ្នក​ពិត​ជា​ចង់​ចេញ​ឬ ?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "សញ្ញា ៖"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR ៖"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "សោ ៖"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "កែសម្រួល..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "តើ​អ្នក​ពិត​ជា​ចង់​លុប​ឆានែល​ទាំង​អស់​ឬ ?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "ចាប់ផ្ដើម​វិភាគរក"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "ឈប់​វិភាគរក"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "កំពុង​បញ្ឈប់..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "រកឃើញ ៖ ទូរទស្សន៍ %1 - វិទ្យុ %2"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "មិន​អាច​បើក​រន្ធ​ព័ត៌មាន DVB ឡើយ ។"
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "បញ្ជី​ឧបករណ៍​កំណត់​ពេលវេលា ៖"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "ថ្មី"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "បញ្ឈប់/លុប"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"ឧបករណ៍​កំណត់​ពេលវេលា​នេះ​ត្រូវ​បានធ្វើ​ម្ដង​ទៀត ។ "
+"តើ​អ្នក​ចង់​រំលង​ការងារ​បច្ចុប្បន្ន ឬ ក៏​លុប​ឧបករណ៍​កំណត់​ពេលវេលា ?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "រំលង​បច្ចុប្បន្ន"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "លុប​ឧបករណ៍​កំណត់​ពេលវេលា​ដែល​បាន​ជ្រើស ?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "កំពុង​ទាញយក... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "កំពុង​ចម្លង​ឯកសារ​ទិន្នន័យ..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "ការ​កំណត់ DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "ឧបករណ៍ DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "ការ​កំណត់​ឧបករណ៍"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>ឈ្មោះ ៖</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>ប្រភេទ ៖</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+#, fuzzy
+msgid "Satellite"
+msgstr "រក្សាទុក​បញ្ជីចាក់"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "សិល្បករ"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "មិនស្គាល់"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "ចំនួន LNB ៖"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "Sat ទីមួយ ៖"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "ការ​កំណត់ LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "Sat ទីពីរ ៖"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "Sat ទីបី ៖"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "Sat ទីបួន ៖"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "ការ​កំណត់ LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "ប្រភពដើម ៖"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "ជម្រើស​ការ​ថត DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "ថត​ការ​ថត ៖"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "ថតផ្លាស់ប្ដូរ​ពេលវេលា ៖"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "រឹម​ចាប់ផ្ដើម ៖"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(នាទី)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "រឹម​បញ្ចប់ ៖"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "ថិរវេលា​ថត​ភ្លាមៗ ៖"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "ទ្រង់ទ្រាយ​​ដែល​ចូលចិត្ត ៖"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "ការ​ផ្សាយ​ DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "អាសយដ្ឋាន​ការ​ផ្សាយ ៖"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "ច្រក​ការផ្សាយ ៖"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "ច្រក​ព័ត៌មាន ៖"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "ផ្សេងៗ"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "សំណុំ​តួអក្សរ​លំនាំដើម (ទាមទារ​ចាប់ផ្ដើម​ឡើង​វិញ) ៖"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "​ធ្វើ​ឲ្យ​ការ​វិភាគរក​​ទិន្នន័យ​ទាន់​សម័យ ៖"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "ទាញយក"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"បោះចោល​ព្រឹត្តិការណ៍​របស់ epg នៅ​ត្រង់ \n"
+"~/kaffeine_dvb_events.tx ៖"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "បោះចោល"
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "ម៉ាស៊ីន​ភ្ញៀវ​ DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>មិន​អាច​ទទួល​ទិន្នន័យ​ DVB ពីhttp://hftom.free.fr/kaxtv/dvbdata.tar.gz "
+"ឡើយ !"
+"<br>\t\t\tសូមពិនិត្យ​មើល​ការ​តភ្ជាប់​អ៊ិនធឺណិត​របស់​អ្នក ហើយ​ចុច បាទ/ចាស "
+"ដើម្បី​ព្យាយាម​ម្ដង​ទៀត ។"
+"<br>\t\t\tឬ​ចុច ទេ ដើម្បី​បោះបង់ ។"
+"<br> តើ​ខ្ញុំ​គួរ​ព្យាយាម​ម្ដង​ទៀតឬ ?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "ថត​​ការ​ថត​មិន​ត្រឹមត្រូវ​ឡើយ ។"
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "ថត​ផ្លាស់ប្ដូរ​ពេលវេលា​មិន​ត្រឹមត្រូវ​ឡើយ ។"
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "ច្រក​ការ​ផ្សាយ និង ច្រក​ព័ត៌មាន​ត្រូវ​តែ​ខុស​គ្នា ។"
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "អាសយដ្ឋាន​ការ​ផ្សាយ​មិន​ត្រឹមត្រូវ​ឡើយ ។"
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "ការ​កំណត់ LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "LNB សកល"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "LO ទ្វេ"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "LO ទោល"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "ប្រេកង់​ប្ដូរ LO ទ្វេ ៖"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "ប្រេកង់​រលក​អាកាសទាប ៖"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "ប្រេកង់​រលកអាកាស​ខ្ពស់ ៖"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "ប្រេកង់ LO ទោល ៖"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "ប្រេកង់ LO ទោល ៖"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "ប្រេកង់ LO ទោល ៖"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "កំណត់​ឡើង​វិញ"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "មិន​អាច​បើក​រន្ធ​ការផ្សាយ DVB ឡើយ ។"
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "មិន​អាច​ចាប់ផ្ដើម​រន្ធ​ការ​ផ្សាយ DVB ឡើយ ។"
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "មិន​អាច​រក​ឃើញ​អ៊ិនកូឌ័រ​អូឌីយ៉ូ​ឡើយ ។"
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "ការ​ផ្ទុក​អ៊ិនកូឌ័រ '%1' បាន​បរាជ័យ ។"
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "មិន​អាច​បង្កើត​ថត ៖ "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "មេកាបៃ"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "គីឡូបៃ"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "បៃ"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "ស៊ីឌី​អូឌីយ៉ូ"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "ចាក់​ស៊ីឌី"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "បម្លែង​ស៊ីឌី"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "សិល្បករ ៖"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "​អាល់ប៊ុម ៖"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "បទ"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "ជ្រើស​បទ​ដែល​អ្នក​ចង់​បម្លែង ហើយ​ចុច​ប៊ូតុង <b>អ៊ិនកូដ</b> ។"
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "អ៊ិនកូដ..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "ការ​អ៊ិនកូដ​​ស៊ីឌី​អូឌីយ៉ូ"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "ចាក់​ស៊ីឌី​អូឌីយ៉ូ"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "ចាក់​ឌីវីឌី"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "ចាក់​វីស៊ីឌី"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "បើក​ឌីវីឌី"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "បើក​វីស៊ីឌី"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "បើក​ស៊ីឌី​​អូឌីយ៉ូ"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "អ្នក​ត្រូវតែ​ជ្រើស​បទ ដើម្បី​បម្លែង ។"
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "បាន​រកឃើញ​ស៊ីឌី​អូឌីយ៉ូ​ជា​ច្រើន ។ សូម​ជ្រើស​ស៊ីឌី​មួយ ៖"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "រក​មិន​ឃើញ​ស៊ីឌី​អូឌីយ៉ូ​ឡើយ ។"
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "វីដេអូ​ឌីវីឌី"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "បាន​រក​ឃើញ​វីដេអូ​ឌីវីឌី​ជា​ច្រើន ។ សូម​ជ្រើស​វីដេអូឌីវីឌី​មួយ ៖"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "វីស៊ីឌី-អេសវីស៊ីឌី"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "បាន​រក​ឃើញ (អេស)វីស៊ីឌី​ជា​ច្រើន ។ សូម​ជ្រើស (អេស)វីស៊ីឌីមួយ ៖"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "គ្មាន​ចំណង​ជើង"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "បទ %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "កំពុង​ស្វែងរក​ធាតុ cddb មូលដ្ឋាន..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "កំពុង​ស្វែងរក​ធាតុ cddb ពី​ចម្ងាយ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "បាន​រកឃើញ​ធាតុ cddb ដូច​បេះបិទ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "បាន​រក​ឃើញ​ធាតុ cddb ស្រដៀង​គ្នា..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "បាន​រក​ឃើញ​វីដេអូ​ឌីវីឌី​ជា​ច្រើន ។ សូម​ជ្រើស​វីដេអូឌីវីឌី​មួយ ៖"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "កម្មវិធី​ជំនួយ​អ៊ិនកូឌ័រ mp3 របស់ Lame សម្រាប់ Kaffeine ។"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "កម្មវិធី​ជំនួយ​អ៊ិនកូឌ័រ Vorbis របស់ Ogg សម្រាប់ Kaffeine ។"
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "ម៉ាស៊ីន​ភ្ញៀវ DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "មិន​អាច​បើក​រន្ធ​ព័ត៌មាន​ឡើយ ។"
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "មិន​អាច​ចង​រន្ធ​ព័ត៌មាន​ឡើយ !!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "មិន​អាច​បើក​រន្ធ​ឡើយ ។"
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "មិន​អាច​កំណត់​ជម្រើស​រន្ធ​ឡើយ !!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "មិន​អាច​ចង​រន្ធ​ឡើយ !!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "ទំហំ​ទាំងអស់"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "តូច​បំផុត"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "តូច"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "មធ្យម"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "ធំ"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "ធំ​បំផុត"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "ស្វែងរក​ថ្មី"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "មិន​មាន​គម្រប​ដែល​អ្នក​បាន​ជ្រើស​ឡើយ ។ សូម​ជ្រើស​គម្រប​មួយ​ទៀត ។"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "មិន​មាន​គម្រប​ឡើយ"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "កម្មវិធី​ទាញ​យក​គម្រប"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "រក​មិន​ឃើញ​រូបភាព​ដូច​ឡើយ ។ សូម​បញ្ចូល​ពាក្យ​ស្វែងរក​ថ្មី ៖"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "បញ្ចូល​ពាក្យ​ស្វែងរក​ថ្មី ៖"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "ចាក់"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "ចាក់​បន្ទាប់/បន្ថែម​ទៅជួរ"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "ជ្រើស​ទាំងអស់"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "បង្កើត​បញ្ជី​ចាក់​ពី​ធាតុ​ដែល​បាន​ជ្រើស"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "បន្ថែម​ចំណងជើងរង..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "កែសម្រួល​ចំណងជើង"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "ព័ត៌មាន"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "ប្រវែង"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "សិល្បករ"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "អាល់ប៊ុម"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "ឆ្នាំ"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "ចង្វាក់"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "ចំណង​ជើង​រង"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "កំពុង​ប្រើ"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|ឯកសារ​ចំណង​ជើង​រង\n"
+"*.*|ឯកសារ​ទាំងអស់"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "ជ្រើស​ឯកសារ​ចំណងជើង​រង"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "ជ្រើស​គម្រប​មួយ..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "វិចិត្រសាល..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "តម្រង"
+
+#: input/audiobrowser/playlist.cpp:398
+#, fuzzy
+msgid "Playlist:"
+msgstr "បញ្ជីចាក់"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"ជ្រើស​បញ្ជី​ចាក់​សកម្ម ។ ដើម្បី​ផ្លាស់ប្ដូរ​​ឈ្មោះ​បញ្ជីចាក់ សូម​កែសម្រួល​វា "
+"ហើយ​ចុច​ប៊ូតុង 'បញ្ចូល' ។"
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "ចាក់​បញ្ជីចាក់"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "ចាក់​ម្ដង​ទៀត"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "រង្វិលជុំ​បញ្ជីចាក់"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "សាប់"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "ចាក់​ធាតុ​តាម​លំដាប់​ចៃដន្យ"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "យក​បញ្ជីចាក់​បច្ចុប្បន្ន​ចេញ"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "បញ្ជីចាក់​ថ្មី"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "នាំចូល​បញ្ជីចាក់..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "រក្សាទុក​បញ្ជីចាក់​បច្ចុប្បន្ន​ជា..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "យក​បញ្ជីចាក់​បច្ចុប្បន្ន​ចេញ"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "បញ្ជីចាក់ Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "ឯកសារ​ទាំងអស់"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "បើក​បញ្ជីចាក់"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "បញ្ជីចាក់ M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "បញ្ជីចាក់ PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "រក្សាទុក​បញ្ជីចាក់"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "បញ្ជីចាក់"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "ថ្មី"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "កំពុង​នាំចូល​ធនធាន​មេឌៀ..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(គ្មាន​ចំណង​ជើងរង)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "ចំណង​ជើងរង​ផ្សេងទៀត..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "វិចិត្រសាល"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "ជួរ ៖ %1 ធាតុ, ចំនួន​ចាក់ ៖ %2 ដង"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "ធាតុ ៖ %1, ចំនួន​ចាក់ ៖ %2 ដង"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "យក '%1' ចេញ​ពី​បញ្ជី និង ពី​ថាស ?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "មាន​ឈ្មោះ​បញ្ជីចាក់​រួច​ហើយ"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "បញ្ចូល​ឈ្មោះ​បញ្ជីចាក់​ផ្សេង​ទៀត ៖"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "ជ្រើស​ចំណង​ជើងរង"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "ឯកសារ​មេឌៀ ៖"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "ជ្រើស​ភាពយន្ត​"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "ឯកសារ​ចំណង​ជើងរង ៖"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "ចាក់ / ផ្អាក"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "បន្ទាប់"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "ស្ងាត់"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "កម្មវិធី​ចាក់ Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[កម្មវិធី​ចាក់ Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "ខឹម សុខែម, ប៉ុច សុគន្ធ, លៀង ជុំសុបិន, អេង វណ្ណៈ, អោក ពិសិដ្ឋ"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+"khoemsokhem@khmeros.info,sokun_poch@khmeros.info,soben@khmeros.info,"
+"evannak@khmeros.info,piseth_dv@khmeros.info"
+
+#: main.cpp:73
+#, fuzzy
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"កម្មវិធី​ចាក់​មេឌៀ​​សម្រាប់ KDE ៣ ។ "
+"អាច​ប្រើ​កម្មវិធី​ខាង​ក្រោយ​ជាច្រើន​ដើម្បី​ចាក់ លំនាំដើម​គឺ xine ។"
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "រក្សាសិទ្ធិ​ឆ្នាំ ២០០៣-២០០៥ ដោយ​អ្នក​និពន្ធ Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr ""
+
+#: main.cpp:78
+#, fuzzy
+msgid "Original author"
+msgstr "ទំហំ​ដើម"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr ""
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "ឡូហ្គោ​សម្រាប់ Kaffeine ០.៨ និង​សិល្បកម្ម​ផ្សេង​ទៀត ។"
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "ឡូហ្គោ​​មាន​ចលនា​សម្រាប់ Kaffeine ០.៥"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "ការ​អ៊ិនកូដ​ជំនួស សម្រាប់​ស្លាក​មេតា ។ បំណះ​មួយ​ចំនួន​ទៀត ។"
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "ដោះស្រាយ​កម្មវិធី​ជំនួយ​បន្ទាប់​ពី xine ។ បំណះ​មួយ​ចំនួន​ទៀត ។"
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "ការ​នាំចូល​ឯកសារ​ចំណង​ជើងរង ។"
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "ការ​នាំចូល M3U និង សាកល្បង ។"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "កម្មវិធី​និពន្ធ PID របស់​ចំណងជើងរង"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID របស់​ចំណងជើងរង"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "ធាតុ​ថ្មី"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "ផ្លាស់ទី​ឡើង​លើ"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "ផ្លាស់ទី​ចុះ​ក្រោម"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< ធ្វើ​ឲ្យ​ធាតុ​ដែល​បាន​ជ្រើស​ទាន់សម័យ"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< ថ្មី"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid ៖"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "ទំព័រ ៖"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "ទំព័រ​រង ៖"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "ភាសា ៖"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "ធ្វើ​ឧបករណ៍​កំណត់​ពេលវេលា​ម្ដង​ទៀត"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "កម្មវិធី​និពន្ធ PID របស់​អូឌីយ៉ូ"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "PID របស់​អូឌីយ៉ូ"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "កម្មវិធី​និពន្ធ​ការ​ផ្សាយ"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "ឆានែល​ដែល​មាន ៖"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "បញ្ជី​ការផ្សាយ ៖"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(ចុច​កណ្ដុរ​ស្ដាំ ដើម្បី​កែសម្រួល/លុប)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "ថ្មី..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "ស្វែងរក​នៅ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "ចាប់ផ្តើម​វិភាគរក"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "តម្រង"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "ផ្សាយ​ដោយ​សេរី"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "ក្រុមហ៊ុន​ផ្ដល់ ៖"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< បន្ថែម​ធាតុ​ដែល​បាន​ជ្រើស"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< បន្ថែម​ធាតុ​ដែល​បាន​ត្រង"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "រកឃើញ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "SNR"
+msgstr "SNR ៖"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "ធ្វើរួច"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "កម្មវិធី​និពន្ធ​ឆានែល"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "លក្ខណៈ​ជា​ប៉ូល"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "ប្រេកង់ ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "អត្រា​និមិត្តសញ្ញា ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "ខុស​ទម្រង់​ដើម"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID របស់​អត្ថបទ​រត់​លើ​អេក្រង់​ទូរទស្សន៍ ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "លេខ​សម្គាល់​សេវា ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID របស់​វីដេអូ ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "លេខសម្គាល់​ស្ទ្រីម​ការ​ផ្ទេរ ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PID របស់​ចំណងជើងរង..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "PID របស់​អូឌីយ៉ូ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "កម្រិត​បញ្ជូន ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC ខ្ពស់ ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "ការ​បញ្ជូន ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC ទាប ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "ចន្លោះពេល​យាម ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "ឋានានុក្រម ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "ការ​ប្ដូរ​សម្លេង​ឡើង​ចុះ ៖"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "ការ​បញ្ច្រាស ៖"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "ចំណង់ចំណូល​ចិត្តការ​​អ៊ិនកូដ"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "អ៊ិនកូឌ័រ ៖"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "ថត​គោល ៖"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "ឆ្កួតៗ ៖"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "បិទ​ការ​ពិនិត្យ​មើល​ទាំង​អស់"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "របៀប​ធម្មតា"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "របៀប​ឆ្កួតៗ"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "ធ្វើ​ឲ្យ​សាមញ្ញ"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "របារ​ឧបករណ៍​ស៊ីឌី"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "ជម្រើស mp3 របស់ Lame"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "អត្រា​ប៊ីត ៖"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "គីឡូបៃ/វិ."
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "ជម្រើស Vorbis របស់ Ogg"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "គុណភាព ៖"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "បញ្ជីចាក់"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "ជម្រើស​ចេញ​"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "កម្មវិធីចាក់"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "អនុញ្ញាត​ឲ្យ​ប្ដូរ​ទំហំ​ដោយ​ស្វ័យ​ប្រវត្តិ"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "ការ​ផ្សាយ​បណ្ដាញ"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "ការ​រុករក"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "ឌីវីឌី"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "ម៉ឺនុយ​ឌីវីឌី"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "អូឌីយ៉ូ"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "វីដេអូ"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "សមាមាត្រ"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "របារ​ឧបករណ៍​រូបថត​អេក្រង់"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "របារឧបករណ៍​វត្ថុ​បញ្ជា"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "របារ​ឧបករណ៍​កម្រិត​សម្លេង"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "របារ​ឧបករណ៍​ទីតាំង"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "ការ​រៀបចំ Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "ឥរិយាបថ"
+
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "ផ្អាក​វីដេអូ នៅ​ពេល​លាក់"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "បង្កប់​ក្នុង​ថាស​ប្រព័ន្ធ"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " វិ."
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "បិទ"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "ថិរវេលា​នៃ​ការ​ប្រកាស​ចំណង​ជើង​ក្នុង​ថាស​ប្រព័ន្ធ​"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "អនុញ្ញាត​ម៉ាស៊ីន​ភ្ញៀវ​ DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "ជម្រើស​ផ្សេងៗ​​"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "ប្រើ​ការ​អ៊ិនកូដ​ (មិន​មែន​ជា​យូនីកូដ) ជំនួស ​សម្រាប់​ស្លាក​មេតា"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"ជ្រើស​ឈ្មោះ​ការ​អ៊ិនកូដ​ជំនួស​សម្រាប់​ស្លាក​មេតា\n"
+"(ដើម្បី​អាច​បម្លែង​ទៅ​ជា​យូនីកូដ)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "ជម្រះ​បញ្ជី​ឯកសារ​បច្ចុប្បន្ន"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "ចាប់ផ្ដើម​ចាក់​ភ្លាមៗ"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "ចាប់ផ្ដើម​ក្នុង​របៀប​​​ពេញ​អេក្រង់​"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "កំណត់​កម្មវិធី​បញ្ជា​អូឌីយ៉ូ"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "កំណត់​កម្មវិធី​បញ្ជា​វីដេអូ"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "កំណត់​ផ្លូវ​ឧបករណ៍​របស់ ស៊ីឌីអូឌីយ៉ូ/វីស៊ីឌី/ឌីវីឌី ។"
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "បង្ហាញ​សារ​កំហុស​របស់ xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "រត់​អ្នក​ជំនួយការ​ដំឡើង​"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"ឯកសារ​ត្រូវចាក់ ។ អាច​ជា​ឯកសារ​មូលដ្ឋាន, URL, ថត ឬ 'ឌីវីឌី', 'វីស៊ីឌី', "
+"'ស៊ីឌី​អូឌីយ៉ូ' ។"
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "ចាប់ផ្ដើម"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "បង្អួច​កម្មវិធី​ចាក់"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "ទ្រង់ទ្រាយ​មេឌៀ​ដែល​គាំទ្រ"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "ឯកសារ​អូឌីយ៉ូ MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "ឯកសារ​វីដេអូ MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "ឯកសារ Vorbis Ogg"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "ឯកសារ AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "ឯកសារ Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "ឯកសារ Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "ឯកសារ Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "ឯកសារ FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "ឯកសារ​មេឌៀ​របស់​វ៉ីនដូ"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "ឯកសារ WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "ការ​ផ្ទុក​ផ្នែក '%1' របស់​កម្មវិធីចាក់ បាន​បរាជ័យ ។"
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "រក​មិន​ឃើញ %1 ក្នុង​ផ្លូវ​ស្វែងរក​ឡើយ ។"
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "បើក &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "បើក​ថត..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "ចេញ && បិទ​ម៉ូនីទ័រ បន្ទាប់​ពី​បទ​នេះ"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "ចេញ​បន្ទាប់ពី​បទ​នេះ"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "ចេញ​បន្ទាប់ពី​បញ្ជីចាក់"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "របៀប​អប្បបរមា​"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "បិទបើក បញ្ជីចាក់/កម្មវិធីចាក់"
+
+#: kaffeine.cpp:710
+#, fuzzy
+msgid "Keep &Original Aspect"
+msgstr "ការពារ​ទ្រង់ទ្រាយ​ដើម"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "ទំហំ​ដើម"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "ទំហំ​ទ្វេ"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "ទំហំ​ត្រីគុណ"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "ម៉ាស៊ីន​កម្មវិធី​ចាក់"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "ម៉ាស៊ីន​ភ្ញៀវ​ DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "កម្មវិធីចាក់"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "បង្អួច​មេ"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "រក​មិន​ឃើញ​ផ្នែក​បន្ថែម DPMS Xserver ឡើយ ។"
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"អំពើ​នេះ​នឹង​ចេញ​ពី Kaffeine ហើយ​បិទ​ម៉ូនីទ័រ បន្ទាប់​ពី​បញ្ចប់​ឯកសារ ឬ "
+"បញ្ជីចាក់ ។ ជម្រើស \"dpms\" ត្រូវ​តែ​ស្ថិត​នៅក្នុង​ឯកសារ​កំណត់រចនាសម្ព័ន្ធ X "
+"របស់​អ្នក ដើម្បី​ឲ្យ​ម៉ូនីទ័រ​បិទ​បាន ។"
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "បើក​ឯកសារ"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "បើក URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "បញ្ចូល URL មួយ ៖"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "បើក​ថត"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "មិន​មាន %1 នៅក្នុង​ដ្រាយ​ឡើយ ឬ ខុសផ្លូវ​ទៅ​កាន់​ឧបករណ៍ ។"
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "សូម​ជ្រើស​ដ្រាយ​ដែល​​ត្រឹមត្រូវ ៖​"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "អ្នក​ជំនួយ​ការ​ដំឡើង Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "ពិនិត្យ​មើល​ការ​ដំឡើង"
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "ការ​រៀបចំ Kaffeine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "គ្មាន​បញ្ហា ។"
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "រក​មិន​ឃើញ​ផ្នែក​ឡើយ ។ សូម​ពិនិត្យមើល​ការ​ដំឡើង​របស់​អ្នក !"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "បាន​រកឃើញ​កំណែ"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine ត្រូវ​ការ KDE >= %1 ។"
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "កូឌិក WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"រក​មិនឃើញ​កូឌិក WIN32 នៅ​ក្នុង /usr/lib/win32 ឡើយ ។ អ្នក​មិន​អាច​ចាក់​ឯកសារ "
+"Windows Media 9, ឯកសារ​ Real Media ថ្មីៗ និង "
+"ទ្រង់ទ្រាយ​សាមញ្ញៗ​មួយ​ចំនួន​ទៀត​ឡើយ ។ អ្នក​អាច​ទាញយក​កូដិក​នៅ​ទីនេះ ៖"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"រក​មិនឃើញ libdvdcss ឡើយ ។ អ្នក​មិន​អាច​ចាក់​ឌីវីឌី​ដែល​បាន​អ៊ិនគ្រីប​ "
+"(ភាគ​ច្រើន​ជា​ឌីវីឌី​ដែល​គេ​ដាក់​លក់) បាន​ឡើយ ។ អ្នក​អាច​យក​បណ្ណាល័យ​នៅ​ទី​នេះ "
+"(ប៉ុន្តែ​ការ​ប្រើប្រាស់​វា "
+"អាច​នឹង​បំពាន​ច្បាប់​រក្សាសិទ្ធិ​នៅ​ក្នុង​ប្រទេស​របស់​អ្នក !) ៖"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "ដ្រាយ​ឌីវីឌី"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"របៀប DMA បាន​បិទ​ហើយ ! ដើម្បីចាក់​ឌីវីឌី​កាន់​តែ​ប្រសើរ សូម​រត់​ជា root ៖"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"មិន​អាច​ពិនិត្យ​មើល​របៀប DMA បាន​ឡើយ ។ អ្នក​មិន​មាន​សិទ្ធិ ឬ "
+"មិន​មាន​ដ្រាយ​ប្រភេទ​នេះ ៖"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "ឧបករណ៍ DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"រក​មិន​ឃើញ​ឧបករណ៍ DVB ឡើយ ។ មុខងារ​ដែល​ទាក់ទង​នឹង DVB នឹង​ត្រូវ​បាន​លាក់ ។"
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "ការ​ចែកចាយ"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"xine-lib ដែល​ភ្ជាប់​មក​ជាមួយ​ស៊ូស៊ី \"អាច​នឹង​មាន​លក្ខណៈ​ពិសេស​មិន​គ្រប់គ្រាន់ "
+"ព្រោះ​តែ​បញ្ហា​ផ្លូវច្បាប់ (មិន​អាច​បំពាន​ប៉ាតង់​បាន​ឡើយ)\" ។ "
+"អ្នក​គួរតែ​ប្រើ​កញ្ចប់​ពី​ទីនេះ ៖"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "លទ្ធផល"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+"បាន​រកឃើញ​បញ្ហា​មួយ​ចំនួន ប៉ុន្តែ​ទោះជា​យ៉ាង​ណា​ក៏​ដោយ​ Kaffeine "
+"នៅ​តែអាច​ដំណើរការ​បាន ។"
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "គ្មាន​បញ្ហា​អ្វី​ទាំងអស់ !"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "ប្រើ Kaffeine ជា​កម្មវិធី​ជំនួយ​សម្រាប់​ស្ទ្រីម mms:// (វ៉ីនដូមេឌៀ)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"ប្រើ Kaffeine ជា​កម្មវិធី​ជំនួយ​សម្រាប់ rtsp:// ស្ទ្រីម (Real Media "
+"និង​ផ្សេងៗទៀត)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "បង្កើត​រូបតំណាង Kaffeine លើ​ផ្ទៃតុ"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "ជម្រើស​ដំឡើង​"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "គុណភាព​មិន​ត្របាញ់"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>ប្រើប្រាស់​ស៊ីភីយូ​ទាប​បំផុត គុណភាព​អន់​បំផុត ។</b>"
+"<br>បាត់បង់​គុណភាព​បង្ហាញ​បញ្ឈរ​ពាក់កណ្ដាល ។ សម្រាប់​ប្រព័ន្ធ​មួយ​ចំនួន "
+"(ដែល​មាន​កាត​វីដេអូ PCI) វា​អាច​បន្ថយ​ការ​ប្រើប្រាស់​ស៊ីភីយូ "
+"ពេល​ប្រៀបធៀប​ទៅ​នឹង​ការ​ចាក់​វីដេអូ​ធម្មតា (មិន​មាន​ការ​ត្របាញ់) ។"
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>ប្រើប្រាស់​ស៊ីភីយូ​ទាប គុណភាព​អន់ ។</b>"
+"<br>រូបភាព​ត្រូវ​បាន​ធ្វើ​ឲ្យ​ព្រិល​បញ្ឈរ "
+"ដូច្នេះ​បែបផែន​ត្របាញ់​នឹង​ត្រូវ​បាន​យក​ចេញ ។"
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>ប្រើប្រាស់​ស៊ីភីយូ​មធ្យម គុណភាព​មធ្យម ។</b>"
+"<br>រូបភាព​ត្រូវ​បាន​វិភាគ "
+"ហើយ​ផ្ទៃ​ដែល​បង្ហាញ​ការ​ត្របាញ់​នឹង​មិន​ប្រែប្រួល​ឡើយ (បាន​កែខៃ) ។"
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>ប្រើប្រាស់​ស៊ីភីយូ​ខ្ពស់ គុណភាព​ល្អ ។</b>"
+"<br>ការ​បម្លែង​ទ្រង់ទ្រាយ​​រូបភាព​ឌីវីឌី​ នឹង​បង្កើន​គុណភាព "
+"ហើយ​នឹង​ជួយ​ជួសជុល​កំហុស​ក្នុង​ការ​តំណាង​ពណ៌ ។"
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>ប្រើប្រាស់​ស៊ីភីយូ​ខ្ពស់​គួរសម គុណភាពល្អ​ណាស់ ។</b>"
+"<br>ក្រៅ​ពី​ប្រើ​ក្បួន​ដោះស្រាយ​ការ​មិន​ត្របាញ់​ដ៏​ប៉ិនប្រសប់ "
+"​វា​ក៏​នឹង​បង្កើន​អត្រា​ស៊ុម​ទ្វេដង​ផង​ដែរ (ពី ៣០->៦០ fps) "
+"ដើម្បី​ផ្គូផ្គង​នឹង​អត្រា​វាល​របស់​ទូរទស្សន៍ ។ វា​នឹង​រក​ឃើញ "
+"ហើយ​ត្រឡប់​ទៅ​ភាព​ដើម​វិញដោយ​បន្ថយ ៣-២ ។ *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>ប្រើប្រាស់​ស៊ីភីយូ​ខ្ពស់​បំផុត "
+"គុណភាព​ល្អ​បំផុត​ព្រម​ជាមួយ​នឹង​ការ​បង្កើន​ប្រសិទ្ធិភាព ។</b>"
+"<br>អនុញ្ញាត​ឲ្យ​មាន​ការ​កែប្រែ judder "
+"(ចាក់​ភាពយន្ត​ត្រឹម​ល្បឿន​ដើម​របស់​ពួក​វា​គឺ 24 fps) "
+"ព្រម​ទាំង​អនុញ្ញាត​ឲ្យ​បង្ហាញ​ពណ៌​បញ្ឈរ​យ៉ាង​រលូន (បំបាត់​ស្នាម​ឆ្នូត​តូចៗ "
+"ដែល​ធ្លាប់​ឃើញ​នៅ​ក្នុង​ឌីវីឌី​ខ្លះ) ។ *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "កំណត់​ដោយ​អ្នក​ប្រើ"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "កំណត់​រចនាសម្ព័ន្ធ​កម្មវិធី​ជំនួយ​មិន​ត្របាញ់​របស់ tvtime..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>អាច​ទាមទារ​ខឺណែល ២.៤ ដែល​បាន​ប៉ះប៉ូវ (ដូច​ជា RedHat ជាដើម) ឬ ខឺណែល ២.៦ "
+" ។</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "កំណត់​រចនាសម្ព័ន្ធ​កម្មវិធី​ជំនួយ​មិន​ត្របាញ់​របស់ tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "កម្មវិធី​ជំនួយ​បែបផែន"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "អូឌីយ៉ូ"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "​តម្រង​អូឌីយ៉ូ"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "អនុញ្ញាត​តម្រង​អូឌីយ៉ូ"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "បន្ថែម​តម្រង"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "យក​តម្រង​ទាំង​អស់​ចេញ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "វីដេអូ"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "តម្រង​វីដេអូ"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "អនុញ្ញាត​តម្រង​វីដេអូ"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "ប៉ារ៉ាម៉ែត្រ​ម៉ាស៊ីន xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "ជម្រើស %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "ជម្រើស​ដំបូង"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "ជម្រើស​ជំនាញ​​"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "KaffeinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "ផ្នែក​កម្មវិធី​ចាក់​ដែល​ផ្អែក​លើ xine សម្រាប់ Kaffeine ។"
+
+#: player-parts/xine-part/xine_part.cpp:253
+#, fuzzy
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"ការ​គាំទ្រ SMIL (Synchronized Multimedia Integration Language) "
+"គឺ​នៅ​មាន​កម្រិត​ទាប​នៅ​ឡើយ !\n"
+"ឥឡូវនេះ KaffeinePart អាច​សាកល្បង​ចាក់​ប្រភព​វីដេអូ​ដែល​មាន "
+"ដោយ​មិន​មាន​ប្លង់​អ្វី​ទាំងអស់ ។ បន្ត ?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "រក្សា​ទុក​​​ស្ទ្រីម​ជា"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "ចំណងជើង​រង"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "ឆានែល​អូឌីយ៉ូ"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 នៃ %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|ឯកសារ PNG\n"
+"*.bmp|ឯកសារ BMP\n"
+"*.xbm|ឯកសារ XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "រក្សាទុក​រូបថត​អេក្រង់​ជា"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "ច្រក​ការ​ផ្សាយ ៖"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "កំណត់​រចនាសម្ព័ន្ធ​ស្ទ្រីម​ទទួល​ការ​ផ្សាយ"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "អាសយដ្ឋាន​អ្នក​ផ្ញើ ៖"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "ច្រក ៖"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "លោត​ទៅ​ទីតាំង ៖"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "កំហុស xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "សារ xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "រួចរាល់"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "កំពុង​ចាក់"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "ឯកសារ​ចំណងជើង​រង"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "រក្សាទុក​ស្ទ្រីម​ជា"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "ព័ត៌មានបទ"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "ចម្លង URL ទៅ​ក្ដារ​តម្បៀត​ខ្ទាស់"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "ចាក់​នៅ​ខាង​ក្នុង Kaffeine"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "ផ្ញើ​ស្ទ្រីម​ការផ្សាយ..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "ទទួល​ស្ទ្រីម​ការផ្សាយ..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "រក្សាទុក​រូបថត​អេក្រង់..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "រក្សាទុក​​​ស្ទ្រីម..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"រក្សាទុក​ស្ទ្រីម​បច្ចុប្បន្ន​ទៅ​ថាសរឹង ។ "
+"លក្ខណៈ​ពិសេស​នេះ​មិន​ត្រូវ​បាន​​អនុញ្ញាត​ឡើយ សម្រាប់​ទ្រង់ទ្រាយ​មួយ​ចំនួន (ឧ. "
+"Real Media) ដើម្បី​ការពារ​កុំ​ឲ្យ​មាន​បញ្ហា​រំលោភ​ច្បាប់ ។"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "របៀប​អប្បបរមា​"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "ផ្អាក"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "ទៅ​មុខ​លឿន"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "ចលនា​យឺត"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+#, fuzzy
+msgid "Skip Forward (20s)"
+msgstr "រំលង​ទៅ​មុខ (១០ វិ.)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+#, fuzzy
+msgid "Skip Backward (20s)"
+msgstr "រំលង​ថយក្រោយ (១០ វិ.)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "រំលង​ទៅ​មុខ (១ នាទី)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "រំលង​ថយក្រោយ (១ នាទី)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "រំលង​ទៅ​មុខ (១០ នាទី)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "រំលង​ថយក្រោយ (១០ នាទី)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "លោត​ទៅ​ទីតាំង..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "ម៉ឺនុយ​ឌីវីឌី ឆ្វេង"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "ម៉ឺនុយ​ឌីវីឌី ស្ដាំ"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "ម៉ឺនុយ​ឌីវីឌី ឡើង​លើ"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "ម៉ឺនុយ​ឌីវីឌី ចុះក្រោម"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "ម៉ឺនុយ​ឌីវីឌី ជ្រើស"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "ឆានែល​អូឌីយ៉ូ"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "ជ្រើស​ឆានែល​អូឌីយ៉ូ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "រូបភាព​មើល​ឃើញ​របស់​អូឌីយ៉ូ"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "បង្កើន​កម្រិត​សម្លេង"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "បន្ថយ​កម្រិត​សម្លេង"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "មិន​ត្របាញ់"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+"ធ្វើ​ឲ្យ​វា​សកម្ម សម្រាប់​ស្ទ្រីម​ត្របាញ់ ឧទាហរណ៍​ របស់​ឌីវីឌី​មួយ​ចំនួន ។"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "ស្វ័យប្រវត្តិ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "វែង"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "ការេ"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "ពង្រីក​ផ្ដេក"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "បង្រួម​ផ្ដេក"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "ពង្រីក​​បញ្ឈរ"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "បង្រួម​បញ្ឈរ"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "គុណភាព​មិន​ត្របាញ់"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "ការ​កំណត់​វីដេអូ"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "អេហ្គុយ"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "បិទបើក ម៉ឺនុយ"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "ចំណងជើង"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Root"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "រូបភាពរង"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "ជ្រុង"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "ផ្នែក"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "ចំណង​​ជើង​"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "វគ្គ"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "ជ្រុង"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "ព័ត៌មានបទ"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "កម្មវិធី​ជំនួយ​បែបផែន..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "ប៉ារ៉ាម៉ែត្រ​ម៉ាស៊ីន xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "កម្រិត​សម្លេង"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "ទីតាំង"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"ចុច​មួយ​ភ្លែត ៖ បិទបើក ទៅមុខ/ថយក្រោយ របស់​ឧបករណ៍​កំណត់​ពេលវេលា\n"
+"ចុច​យូរ ៖ បិទបើក OSD របស់​ឧបករណ៍​កំណត់​ពេលវេលា"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "ចំនួន​ចាក់"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "កំពុង​រកធាតុ CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, fuzzy, c-format
+msgid "AudioCD Track %1"
+msgstr "បទ %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, fuzzy, c-format
+msgid "VCD Track %1"
+msgstr "បទ %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "ការ​កំណត់​វីដេអូ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "ពណ៌លាំៗ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "តិត្ថិភាព"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "កម្រិត​ពណ៌​"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "ពន្លឺ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "អុហ្វសិត​​អូឌីយ៉ូ/វីដេអូ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "អុហ្វសិត​ចំណង​ជើងរង"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "ស្វ័យប្រវត្តិ"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"ការព្រមាន​ទូទៅ ៖ \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "មិន​មាន​ព័ត៌មាន​ឡើយ ។"
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"ការ​ព្រមាន​សុវត្ថិភាព ៖ \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"មិនស្គាល់​ម៉ាស៊ីន​ដែល​អ្នក​កំពុង​ព្យាយាម​តភ្ជាប់​ឡើយ ។\n"
+"សូម​ពិនិត្យ​មើល​សុពលភាព​​របស់​ឈ្មោះ​ម៉ាស៊ីន​ដែល​បាន​បញ្ជាក់ ។"
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "ឈ្មោះ​ឧបករណ៍​ដែល​អ្នក​បាន​បញ្ជាក់ ​ហាក់​ដូច​ជា​មិន​ត្រឹមត្រូវ​ឡើយ ។ "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"បណ្ដាញ​ទំនង​ជា​មិន​អាច​ទៅ​ដល់​ឡើយ ។\n"
+"សូម​ពិនិត្យមើល​ការ​រៀបចំ​បណ្ដាញ​របស់​អ្នក និង ឈ្មោះ​ម៉ាស៊ីន​បម្រើ ។ "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "មិនមាន​លទ្ធផល​អូឌីយ៉ូ​ឡើយ ។ ឧបករណ៍​កំពុង​ជាប់រវល់ ។ "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"ការតភ្ជាប់​ត្រូវ​បាន​បដិសេធ ។\n"
+"សូម​ពិនិត្យមើល​ឈ្មោះ​ម៉ាស៊ីន ។ "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "រក​មិន​ឃើញ​ឯកសារ ឬ url ដែល​បាន​បញ្ជាក់​ឡើយ ។ សូម​ពិនិត្យ​មើល​វា​ ។ "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "បាន​បដិសេធ​សិទ្ធិ​​ចូលដំណើរ​ការ​ធនធាន​នេះ ។ "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"មិន​អាច​អាន​ប្រភព​បាន​ឡើយ ។\n"
+"ប្រហែល​ជា​អ្នក​មិន​មាន​សិទ្ធិ​គ្រប់គ្រាន់​ឡើយ ឬ​ក៏​ប្រភព​មិនមាន​ទិន្នន័យ(ឧ. "
+"គ្មាន​ថាស​ក្នុង​ដ្រាយ​ជាដើម) ។ "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "បញ្ហា​មួយ​​បាន​កើតឡើង​ ខណៈពេល​ផ្ទុក​បណ្ណាល័យ ឬ ឌិកូឌ័រ​មួយ ៖ "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr ""
+"ប្រភព​ទំនងជា​ត្រូវ​បាន​អ៊ិនគ្រីប​រួច​ហើយ ដូច្នេះ​មិន​អាច​អាន​បាន​ឡើយ ។ "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"ឌីវីឌី​របស់​អ្នក​ប្រហែល​ជា​ត្រូវ​បាន​គ្រីប​រួច​ហើយ ។ "
+"អាស្រ័យ​តាម​ច្បាប់​នៅ​ក្នុង​ប្រទេស​របស់អ្នក អ្នក​អាច ឬ មិន​អាច​ប្រើ​ libdvdcss "
+"ដើម្បី​អាច​អាន​ថាស​នេះ ។ "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"កំហុស​មិន​ស្គាល់ ៖ \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"កំហុស ៖ មិន​អាច​ចាប់ផ្ដើម​កម្មវិធី​បញ្ជា​វីដេអូ​ថ្មី %1 បាន​ឡើយ - កំពុង​ប្រើ "
+"%2 !"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, fuzzy, c-format
+msgid "Using Video Driver: %1"
+msgstr "កំពុង​ប្រើ​កម្មវិធី​បញ្ជា​វីដេអូ ៖ "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"កំហុស ៖ មិន​អាច​ចាប់ផ្ដើម​កម្មវិធី​បញ្ជា​អូឌីយ៉ូ​ថ្មី %1 បាន​ឡើយ - កំពុង​ប្រើ "
+"%2 !"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, fuzzy, c-format
+msgid "Using Audio Driver: %1"
+msgstr "កំពុង​ប្រើ​កម្មវិធី​បញ្ជា​អូឌីយ៉ូ ៖ "
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "ចាប់ផ្ដើម xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "មិន​អាច​ចាប់ផ្ដើម​ម៉ាស៊ីន xine បាន​ឡើយ !"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "កម្មវិធី​បញ្ជា​អូឌីយ៉ូ​ដែល​ត្រូវ​ប្រើ (លំនាំដើម ៖ ស្វ័យប្រវត្តិ)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "កម្មវិធី​បញ្ជា​វីដេអូ​ដែល​ត្រូ​វប្រើ (លំនាំដើម ៖ ស្វ័យប្រវត្តិ)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "ប្រើ​ឧបករណ៍​លាយ​អូឌីយ៉ូ​​ផ្នែកទន់"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "បង្ហាញ​សារ OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "ទំហំ​របស់​អត្ថបទ OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "ពុម្ពអក្សរ​សម្រាប់​សារ OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"មិន​អាច​ចាប់ផ្ដើម​កម្មវិធី​បញ្ជា​វីដេអូ '%1' បាន​ឡើយ - កំពុង​សាកល្បង "
+"'ស្វ័យប្រវត្តិ'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "បរាជ័យ​ក្នុង​ការ​ចាប់ផ្ដើម កម្មវិធី​បញ្ជា​វីដេអូ​ទាំង​អស់ !​"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"មិន​អាច​ចាប់ផ្ដើម​កម្មវិធី​បញ្ជា​អូឌីយ៉ូ '%1' បាន​ឡើយ - កំពុង​សាកល្បង "
+"'ស្វ័យប្រវត្តិ'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "បរាជ័យ​ក្នុង​ការ​ចាប់ផ្ដើម ​កម្មវិធី​បញ្ជា​អូឌីយ៉ូ​ទាំង​អស់ !"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "មិន​អាច​បង្កើត​ស្ទ្រីម​ xine ថ្មី​បាន​ឡើយ !"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB ៖ កំពុង​បើក..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "កំពុង​បើក..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "កូឌិក​អូឌីយ៉ូ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "កូឌិក​វីដេអូ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "រក​មិន​ឃើញ​កម្មវិធី​ជំនួយ ដើម្បី​ប្រើប្រាស់​ធនធាន​នេះ​បាន​ឡើយ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "ធនធាន​ទំនង​ជា​ខូច​ហើយ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "មិន​មាន​ធនធាន​ដែល​បាន​ស្នើ​ឡើយ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "មិន​អាច​បើក​ធនធាន​បាន​ឡើយ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "កំហុស​ទូទៅ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+#, fuzzy
+msgid "Mute Off"
+msgstr "ស្ងាត់"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+#, fuzzy
+msgid "Mute On"
+msgstr "ស្ងាត់"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "ទៅ​មុខ​លឿន %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "ចលនា​យឺត %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "មិន​ត្របាញ់ ៖ បើក"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "មិន​ត្របាញ់ ៖ បិទ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "សមាមាត្រ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "ស្វ័យប្រវត្តិ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "ពង្រីក X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "ពង្រីក Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "មិ.វិ."
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "ការ​កំណត់​អេហ្គុយ"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "ការ​តម្លើង​កម្រិត​សម្លេង"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"ការ​តម្លើង​កម្រិត​សម្លេង​សម្រាប់​អេហ្គុយ - បើ​សម្លេង​ប្រែ​ជា​រញ៉េរញ៉ៃ "
+"សូម​បិទ​វា"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "លុប​តម្រង"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "កំពុង​ស្វែងរក​ទៅ​ដល់ %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "ការ​ចាប់ផ្ដើម GStreamer បាន​បរាជ័យ !"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "ស្ងាត់"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "សេចក្តី​អធិប្បាយ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "ប៉ារ៉ាម៉ែត្រ​ម៉ាស៊ីន &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "មិន​អាច​ចាប់ផ្ដើម GStreamer បាន​ឡើយ !"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"បាត់​បញ្ជី​ឈ្មោះ GStreamer ! តើ​អ្នក​មាន​ភ្លេច​រត់ <b>gst-register</b> "
+"(ជា root) បន្ទាប់ពី​ដំឡើង​ឬ​អត់ ?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"មិន​អាច​ចាប់ផ្ដើម​កម្មវិធី​បញ្ជា​អូឌីយ៉ូ '%1' បាន​ឡើយ - "
+"​កំពុង​សាកល្បង​កម្មវិធី​បញ្ជា​មួយ​ទៀត..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "រក​មិន​ឃើញ​កម្មវិធី​បញ្ជា​អូឌីយ៉ូ​ដែល​អាច​ប្រើ​បាន​ឡើយ !"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"មិន​អាច​ចាប់ផ្ដើម​កម្មវិធី​បញ្ជា​វីដេអូ '%1' បាន​ឡើយ - "
+"កំពុង​សាកល្បង​​កម្មវិធី​បញ្ជា​មួយ​ទៀត..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "រក​មិន​ឃើញ​កម្មវិធី​បញ្ជា​វីដេអូ​ដែល​អាច​ប្រើ​បាន​ឡើយ !"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "ប៉ារ៉ាម៉ែត្រ​ម៉ាស៊ីន GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "ជម្រើស​អូឌីយ៉ូ​"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "កម្មវិធី​បញ្ជា​អូឌីយ៉ូ​ដែល​ពេញចិត្ត"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "ជម្រើស​វីដេអូ​"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "កម្មវិធី​បញ្ជា​វីដេអូ​ដែល​ពេញចិត្ត"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* ទាមទារ​ចាប់ផ្ដើម​ឡើង​វិញ !"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "មេឌៀ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "ជម្រើស​មេឌៀ​"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "ដ្រាយ​ស៊ីឌី, វីស៊ីឌី, ឌីវីឌី"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "មាន​ឆានែល​ទាំង​នេះ​រួច​ហើយ ហើយ​នឹង​ត្រូវ​បាន​បន្ថែម​ទៀត​ឡើយ ៖"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "បរាជ័យ​ក្នុង​ការ​តភ្ជាប់​ទៅ X-Server !"
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "ការ​បិទ​បង្អួច​មេ​នឹង​​ទុក​ឲ្យ Kaffeine រត់​ក្នុង​ថាស​ប្រព័ន្ធ​ដដែល ។ អ្នក​អាច​ជ្រើស ចេញ ពី​ម៉ឺនុយ ឯកសារ ដើម្បី​ចេញ​ពី​កម្មវិធី ។"
+
+#~ msgid "No player"
+#~ msgstr "គ្មាន​កម្មវិធីចាក់​ឡើយ"
+
+#~ msgid "No layer"
+#~ msgstr "គ្មាន​ស្រទាប់"
+
+#, fuzzy
+#~ msgid "Ch %1"
+#~ msgstr "ឆានែល "
+
+#~ msgid "Alternate Layout"
+#~ msgstr "ប្លង់​ជំនួស​"
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "ផ្នែក​ Kaffeine"
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-C"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-T"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-S"
+
+#~ msgid "No DVD Video found."
+#~ msgstr "រក​មិន​ឃើញ​វីដេអូ​ឌីវីឌី​ឡើយ ។"
+
+#~ msgid "No (S)VCD found."
+#~ msgstr "រក​មិន​ឃើញ (អេស)វីស៊ីឌី​ឡើយ ។"
+
+#~ msgid "Developer"
+#~ msgstr "អ្នក​អភិវឌ្ឍន៍"
+
+#~ msgid "DVB Support"
+#~ msgstr "ការ​គាំទ្រ DVB"
diff --git a/po/lt.po b/po/lt.po
new file mode 100644
index 0000000..c15adb3
--- /dev/null
+++ b/po/lt.po
@@ -0,0 +1,3345 @@
+# translation of kaffeine.po to Lithuanian
+#
+# Donatas Glodenis <dgvirtual@akl.lt>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-03-31 08:03+0300\n"
+"Last-Translator: Donatas Glodenis <dgvirtual@akl.lt>\n"
+"Language-Team: Lithuanian <kde-i18n-lt@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>"
+"=2 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Atnaujinti"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Esamas/Kitas"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanalas"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Pradėti"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Tęsiasi"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Antraštė"
+
+#: input/dvb/kevents.cpp:140
+#, fuzzy
+msgid "View All Programs"
+msgstr "Rodyti visas programas"
+
+#: input/dvb/kevents.cpp:142
+#, fuzzy
+msgid "Add to Timers"
+msgstr "Pridėti prie laiko matuoklių"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, fuzzy, no-c-format
+msgid "Name:"
+msgstr "Vardas:"
+
+#: input/dvb/ktimereditor.cpp:39
+#, fuzzy
+msgid "Channel:"
+msgstr "Kanalas:"
+
+#: input/dvb/ktimereditor.cpp:43
+#, fuzzy
+msgid "Begin:"
+msgstr "Pradėti :"
+
+#: input/dvb/ktimereditor.cpp:47
+#, fuzzy
+msgid "Duration:"
+msgstr "Trukmė:"
+
+#: input/dvb/ktimereditor.cpp:51
+#, fuzzy
+msgid "End:"
+msgstr "Galas:"
+
+#: input/dvb/ktimereditor.cpp:55
+#, fuzzy
+msgid "Record as:"
+msgstr "Įrašyti kaip :"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Nieko"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Kasdien"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Kas savaitę"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Kas mėnesį"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Pasirinktas"
+
+#: input/dvb/ktimereditor.cpp:130
+#, fuzzy
+msgid "Repeat..."
+msgstr "Ka&rtoti"
+
+#: input/dvb/ktimereditor.cpp:132
+#, fuzzy
+msgid "Timer Editor"
+msgstr "Laikmačio redaktorius"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+#, fuzzy
+msgid "You must give it a name!"
+msgstr "Turite suteikti kokį nors vardą !"
+
+#: input/dvb/ktimereditor.cpp:215
+#, fuzzy
+msgid "Duration must be at least 1 minute!"
+msgstr "Turi būti nustatyta bent 1 minutės trukmė!"
+
+#: input/dvb/ktimereditor.cpp:236
+#, fuzzy
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Varde neturi būti ystrižų brūkšnelių (/) !"
+
+#: input/dvb/channeleditor.cpp:62
+#, fuzzy
+msgid "Initial Transponder Settings"
+msgstr "Pradiniai atsakiklio nustatymai"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Šis vardas nėra unikalus."
+
+#: input/dvb/channeleditor.cpp:126
+#, fuzzy
+msgid "Missing audio pid(s)!"
+msgstr "Trūksta audio pid!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+#, fuzzy
+msgid "Pid must be non zero!"
+msgstr "Pid negali būti lygus nuliui !"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanalai"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Laikmačiai"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektroninis programų gidas"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB nustatymai"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Skaičius"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Vardas"
+
+#: input/dvb/dvbpanel.cpp:176
+#, fuzzy
+msgid "Audio Channels"
+msgstr "Audio kanalas"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+#, fuzzy
+msgid "Instant Record"
+msgstr "Momentinis įrašas"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Transliacija"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Laikas perstūmimas"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Vyksta įrašymas"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:271
+#, fuzzy
+msgid "Select icon..."
+msgstr "Pasirinkti filmą"
+
+#: input/dvb/dvbpanel.cpp:278
+#, fuzzy
+msgid "Choose channel icon"
+msgstr "Kanalų redaktorius"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:331
+#, fuzzy
+msgid "OSD Next Channel"
+msgstr "Kitas kanalas"
+
+#: input/dvb/dvbpanel.cpp:332
+#, fuzzy
+msgid "OSD Previous Channel"
+msgstr "Ankstesnis kanalas"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Rodyti OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+#, fuzzy
+msgid "EPG..."
+msgstr "EPG ..."
+
+#: input/dvb/dvbpanel.cpp:339
+#, fuzzy
+msgid "Timers..."
+msgstr "Laiko matuokliai ..."
+
+#: input/dvb/dvbpanel.cpp:340
+#, fuzzy
+msgid "Broadcasting..."
+msgstr "Transliacija"
+
+#: input/dvb/dvbpanel.cpp:341
+#, fuzzy
+msgid "Channels..."
+msgstr "Kanalai..."
+
+#: input/dvb/dvbpanel.cpp:342
+#, fuzzy
+msgid "Configure DVB..."
+msgstr "Konfigūruoti DVB ..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Visi"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radijas"
+
+#: input/dvb/dvbpanel.cpp:420
+#, fuzzy
+msgid "New Category..."
+msgstr "Naujas ..."
+
+#: input/dvb/dvbpanel.cpp:423
+#, fuzzy
+msgid "Change Icon..."
+msgstr "Kanalai..."
+
+#: input/dvb/dvbpanel.cpp:425
+#, fuzzy
+msgid "Delete Category..."
+msgstr "Naujas ..."
+
+#: input/dvb/dvbpanel.cpp:430
+#, fuzzy
+msgid "New Category"
+msgstr "Naujas ..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:449
+#, fuzzy
+msgid "Do you really want to delete this category?"
+msgstr "Ar tikrai norite ištrinti visus kanalus ?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+#, fuzzy
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Nepavyksta gauti DVB duomenų iš http://hftom.free.fr/kaxtv/dvbdata.tar.gz !"
+"<br>\t\t\tPatikrinkite ryšį su internetu, ir pamėginkite iš naujo paspaudę "
+"Taip."
+"<br>\t\t\tProcesą galite nutraukti paspaudę Ne."
+"<br>\t\t\tJei jau turite šį archyvą, nukopijuokite jį į "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz ir paspauskite Taip."
+"<br>"
+"<br>Ar bandyti iš naujo ?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Laikmatis sėkmingai sukurtas ir įjungtas."
+
+#: input/dvb/dvbpanel.cpp:1427
+#, fuzzy
+msgid "You may want to define some channel first!"
+msgstr "Visų pirma turbūt norėsite nustatyti keletą kanalų!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Laikmatis sėkmingai sukurtas."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1893
+#, fuzzy
+msgid "Can't tune dvb!"
+msgstr "Negaliu suderinti dvb !"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Negaliu nustatyti pid."
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+#, fuzzy
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine vis dar įrašinėja. Ar tikrai norite baigti?"
+
+#: input/dvb/dvbpanel.cpp:2498
+#, fuzzy
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine turi nustatytus laikmačius. Ar tikrai norite baigti ?"
+
+#: input/dvb/scandialog.cpp:84
+#, fuzzy
+msgid "Signal:"
+msgstr "Signalas :"
+
+#: input/dvb/scandialog.cpp:88
+#, fuzzy
+msgid "SNR:"
+msgstr "SNR :"
+
+#: input/dvb/scandialog.cpp:92
+#, fuzzy
+msgid "Lock:"
+msgstr "Užrakinti :"
+
+#: input/dvb/scandialog.cpp:236
+#, fuzzy
+msgid "Edit..."
+msgstr "Redaguoti..."
+
+#: input/dvb/scandialog.cpp:342
+#, fuzzy
+msgid "Do you really want to delete all channels?"
+msgstr "Ar tikrai norite ištrinti visus kanalus ?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "PRADĖTI skenavimą"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "STABDYTI skenavimą"
+
+#: input/dvb/scandialog.cpp:843
+#, fuzzy
+msgid "Stopping..."
+msgstr "Stabdoma ..."
+
+#: input/dvb/scandialog.cpp:939
+#, fuzzy
+msgid "Found: %1 TV - %2 radio"
+msgstr "Rasta: %1 TV - %2 radijas"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr ""
+
+#: input/dvb/krecord.cpp:40
+#, fuzzy
+msgid "Timers list:"
+msgstr "Laikmačių sąrašas :"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Naujas"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr ""
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr ""
+
+#: input/dvb/krecord.cpp:234
+#, fuzzy
+msgid "Delete the selected timer?"
+msgstr "Trinti pažymėtą laikmatį ?"
+
+#: input/dvb/dvbconfig.cpp:247
+#, fuzzy
+msgid "Downloading... "
+msgstr "Parsiunčiama ..."
+
+#: input/dvb/dvbconfig.cpp:247
+#, fuzzy
+msgid "Copying data files..."
+msgstr "Kopijuojamos duomenų bylos ..."
+
+#: input/dvb/dvbconfig.cpp:478
+#, fuzzy
+msgid "DVB Settings"
+msgstr "DVB nustatymai"
+
+#: input/dvb/dvbconfig.cpp:497
+#, fuzzy
+msgid "DVB Device"
+msgstr "DVB įrenginys"
+
+#: input/dvb/dvbconfig.cpp:497
+#, fuzzy
+msgid "Device Settings"
+msgstr "Įrenginio nustatymai"
+
+#: input/dvb/dvbconfig.cpp:504
+#, fuzzy
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Vardas :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+#, fuzzy
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tipas :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+#, fuzzy
+msgid "Satellite"
+msgstr "Įrašyti grojaraštį"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "Atlikėjas"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Nežinoma"
+
+#: input/dvb/dvbconfig.cpp:524
+#, fuzzy
+msgid "Number of LNBs:"
+msgstr "LNB skaičius:"
+
+#: input/dvb/dvbconfig.cpp:531
+#, fuzzy
+msgid "1st sat:"
+msgstr "Pirmas sat :"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+#, fuzzy
+msgid "LNB Settings..."
+msgstr "DVB nustatymai"
+
+#: input/dvb/dvbconfig.cpp:545
+#, fuzzy
+msgid "2nd sat:"
+msgstr "Antras sat :"
+
+#: input/dvb/dvbconfig.cpp:559
+#, fuzzy
+msgid "3rd sat:"
+msgstr "Trečias sat :"
+
+#: input/dvb/dvbconfig.cpp:573
+#, fuzzy
+msgid "4th sat:"
+msgstr "Ketvirtas sat :"
+
+#: input/dvb/dvbconfig.cpp:581
+#, fuzzy
+msgid "LNB settings..."
+msgstr "DVB nustatymai"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, fuzzy, no-c-format
+msgid "Source:"
+msgstr "Šaltinis:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+#, fuzzy
+msgid "DVB Recording Options"
+msgstr "DVB įrašymo nustatymai"
+
+#: input/dvb/dvbconfig.cpp:626
+#, fuzzy
+msgid "Records directory:"
+msgstr "Įrašų aplankas :"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+#, fuzzy
+msgid "Time shifting directory:"
+msgstr "Laiko perstūmimo aplankas :"
+
+#: input/dvb/dvbconfig.cpp:644
+#, fuzzy
+msgid "Begin margin:"
+msgstr "Paraštės pradžia :"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minutės)"
+
+#: input/dvb/dvbconfig.cpp:653
+#, fuzzy
+msgid "End margin:"
+msgstr "Paraštės pabaiga :"
+
+#: input/dvb/dvbconfig.cpp:662
+#, fuzzy
+msgid "Instant record duration:"
+msgstr "Momentinio įrašo trukmė :"
+
+#: input/dvb/dvbconfig.cpp:671
+#, fuzzy
+msgid "Preferred format:"
+msgstr "Pageidaujamas formatas :"
+
+#: input/dvb/dvbconfig.cpp:693
+#, fuzzy
+msgid "DVB Broadcasting"
+msgstr "Transliacija"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+#, fuzzy
+msgid "Broadcast address:"
+msgstr "Transliacija"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+#, fuzzy
+msgid "Broadcast port:"
+msgstr "Transliacijos prievadas"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Įvairūs"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:736
+#, fuzzy
+msgid "Update scan data:"
+msgstr "Atnaujinti skenavimo duomenis :"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Parsisiųsti"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "DVB įrenginys"
+
+#: input/dvb/dvbconfig.cpp:806
+#, fuzzy
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Negaliu parsisiųsti DVB duomenų iš "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz !"
+"<br>\t\t\tPatikrinkite ryšį su internetu, ir pamėginkite iš naujo paspaudę "
+"Taip."
+"<br>\t\t\tProcesą galite nutraukti paspaudę Ne."
+"<br>Ar bandyti iš naujo ?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Neteisingas įrašų aplankas."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Neteisingas laiko poslinkio aplankas."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:957
+#, fuzzy
+msgid "LNB Settings"
+msgstr "DVB nustatymai"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:988
+#, fuzzy
+msgid "Lo-band frequency:"
+msgstr "Dažnis :"
+
+#: input/dvb/dvbconfig.cpp:992
+#, fuzzy
+msgid "Hi-band frequency:"
+msgstr "Dažnis :"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Iš naujo"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr ""
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr ""
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr ""
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+#, fuzzy
+msgid "Loading of encoder '%1' failed."
+msgstr "Grotuvo dalies „%1“ įkėlimas nepavyko."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr ""
+
+#: input/disc/paranoia.cpp:559
+#, fuzzy
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+#, fuzzy
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+#, fuzzy
+msgid "Bytes"
+msgstr "Baitai"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+#, fuzzy
+msgid "Audio CD"
+msgstr "Audio CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+#, fuzzy
+msgid "Play CD"
+msgstr "Groti"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr ""
+
+#: input/disc/disc.cpp:132
+#, fuzzy
+msgid "Artist:"
+msgstr "Atlikėjas:"
+
+#: input/disc/disc.cpp:140
+#, fuzzy
+msgid "Album:"
+msgstr "Albumas:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Takelis"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+
+#: input/disc/disc.cpp:169
+#, fuzzy
+msgid "Encode..."
+msgstr "Redaguoti ..."
+
+#: input/disc/disc.cpp:209
+#, fuzzy
+msgid "Audio CD encoding"
+msgstr "Audio pid redaktorius"
+
+#: input/disc/disc.cpp:212
+#, fuzzy
+msgid "Play Audio CD"
+msgstr "Atverti Audio-CD"
+
+#: input/disc/disc.cpp:215
+#, fuzzy
+msgid "Play DVD"
+msgstr "Groti"
+
+#: input/disc/disc.cpp:218
+#, fuzzy
+msgid "Play VCD"
+msgstr "Groti"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Atverti &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Atverti &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Atverti &audio CD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr ""
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr ""
+
+#: input/disc/disc.cpp:576
+#, fuzzy
+msgid "DVD Video"
+msgstr "Video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr ""
+
+#: input/disc/cddb.cpp:330
+#, fuzzy
+msgid "No Title"
+msgstr "Antraštė"
+
+#: input/disc/cddb.cpp:342
+#, fuzzy, c-format
+msgid "Track %1"
+msgstr "Takelis %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+#, fuzzy
+msgid "KaffeineMp3Lame"
+msgstr "KaffeinePart"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+#, fuzzy
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Xine paremta grotuvo dalis skirta Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+#, fuzzy
+msgid "KaffeineOggVorbis"
+msgstr "Kaffeine"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+#, fuzzy
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Xine paremta grotuvo dalis skirta Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+#, fuzzy
+msgid "DVB Client"
+msgstr "DVB įrenginys"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr ""
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+#, fuzzy
+msgid "All Sizes"
+msgstr "Visos bylos"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+#, fuzzy
+msgid "Small"
+msgstr "Mažas"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+#, fuzzy
+msgid "Medium"
+msgstr "Vidutinis"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+#, fuzzy
+msgid "Large"
+msgstr "Didelis"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+#, fuzzy
+msgid "Very Large"
+msgstr "L. didelė"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+#, fuzzy
+msgid "New Search"
+msgstr "Ieškoti vietoje :"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:263
+#, fuzzy
+msgid "Cover Downloader"
+msgstr "Parsisiųsti"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Groti"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Groti kitą / Įtraukti į eilę"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Pažymėti &viską"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Sukurti grojaraštį iš pažymėjimo"
+
+#: input/audiobrowser/urllistview.cpp:54
+#, fuzzy
+msgid "Add Sub&title..."
+msgstr "Pridė&ti subtitrus"
+
+#: input/audiobrowser/urllistview.cpp:56
+#, fuzzy
+msgid "&Edit Title"
+msgstr "K&eisti pavadinimą"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&info"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Ilgis"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Atlikėjas"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Albumas"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Metai"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Žanras"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Subtitrai"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "Naudojami"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitrų bylos\n"
+"*.*|Visos bylos"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+#, fuzzy
+msgid "Select Subtitle File"
+msgstr "Pasirinkti subtitrus"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtras"
+
+#: input/audiobrowser/playlist.cpp:398
+#, fuzzy
+msgid "Playlist:"
+msgstr "Grojaraštis"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Pasirinkite aktyvų grojaraštį. Norėdami pakeisti grojaraščio pavadinimą, "
+"redaguokite jį ir patvirtinkite pakeitimus su „Enter“."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Groti grojaraštį"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "Ka&rtoti"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Ka&rtoti grojaraštį"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Maišyti"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Groti įrašus atsitiktine tvarka"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "Pašalinti dabartinį grojaraštį"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Nau&jas grojaraštis"
+
+#: input/audiobrowser/playlist.cpp:494
+#, fuzzy
+msgid "&Import Playlist..."
+msgstr "&Importuoti grojaraštį"
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "Į&rašyti dabartinį grojaraštį kaip..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Pašalinti dabartinį grojaraštį"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine grojaraščiai"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Visos bylos"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Atverti grojaraštį"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U grojaraščiai"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Įrašyti grojaraštį"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Grojaraštis"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NAUJAS"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importuojami media resursai..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(be subtitrų)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Kiti subtitrai..."
+
+#: input/audiobrowser/playlist.cpp:1588
+#, fuzzy
+msgid "Gallery"
+msgstr "Galerija"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Eilėje: %1 įrašų, grojimo laikas: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Įrašai: %1, Grojimo laikas: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Pašalinti „%1“ iš sąrašo ir iš disko?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Pasirinkti subtitrus"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Media byla:"
+
+#: input/audiobrowser/playlist.cpp:2315
+#, fuzzy
+msgid "Select Movie"
+msgstr "Pasirinkti filmą"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Subtitrų byla:"
+
+#: systemtray.cpp:60
+#, fuzzy
+msgid "Play / Pause"
+msgstr "Groti / Pauzė"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Kitas"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Nutildyti"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine grotuvas"
+
+#: startwindow.cpp:85
+#, fuzzy
+msgid "[Kaffeine Player]"
+msgstr "Kaffeine grotuvas"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Donatas Glodenis,Darius Žitkevičius"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "dgvirtual@akl.lt,skystis@splius.lt"
+
+#: main.cpp:73
+#, fuzzy
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"KDE 3 media grotuvas. Grojimui gali naudoti keletą programinių variklių; "
+"numatytasis yra „Xine“."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr ""
+
+#: main.cpp:77
+#, fuzzy
+msgid "Current maintainer"
+msgstr "Dabartinis palaikytojas"
+
+#: main.cpp:78
+#, fuzzy
+msgid "Original author"
+msgstr "Orginalo autorius"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr ""
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Kaffeine 0.5 logotipo animavimas"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Meta deskriptorių alternatyvus kodavimas. Daug taisymų."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "xine post įskiepio tvarkymas. Daug pataisymų."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Subtitrų bilos importavimas."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U importas. Testuojama."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Subtitrų bilos importavimas."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Subtitrai"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Naujas elementas"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, fuzzy, no-c-format
+msgid "Move Up"
+msgstr "Aukštyn"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, fuzzy, no-c-format
+msgid "Move Down"
+msgstr "Žemyn"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, fuzzy, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Atnaujinti pažymėtą"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Naujas"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, fuzzy, no-c-format
+msgid "Pid:"
+msgstr "Pid :"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, fuzzy, no-c-format
+msgid "Page:"
+msgstr "Puslapis:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, fuzzy, no-c-format
+msgid "Lang:"
+msgstr "Kalba :"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, fuzzy, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Audio pid redaktorius"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, fuzzy, no-c-format
+msgid "Audio PIDs"
+msgstr "Audio :"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, fuzzy, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Transliacijos prievadas"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr ""
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, fuzzy, no-c-format
+msgid "Broadcasting list:"
+msgstr "Transliacijos prievadas"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Dešiniu klavišu - redagavimui/trynimui)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, fuzzy, no-c-format
+msgid "New..."
+msgstr "Nauja..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, fuzzy, no-c-format
+msgid "Search On"
+msgstr "Ieškoti vietoje :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, fuzzy, no-c-format
+msgid "Start Scan"
+msgstr "Pradėti skenavimą"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "Filtrai"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Ne šifruotas"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, fuzzy, no-c-format
+msgid "Provider:"
+msgstr "Tiekėjas :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, fuzzy, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Pridėti pažymėtus"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, fuzzy, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Pridėti išfiltruotus"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Rasta"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "SNR"
+msgstr "SNR :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Atlikta"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, fuzzy, no-c-format
+msgid "Channel Editor"
+msgstr "Kanalų redaktorius"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, fuzzy, no-c-format
+msgid "Nr:"
+msgstr "Nr :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Poliariškumas"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, fuzzy, no-c-format
+msgid "Frequency:"
+msgstr "Dažnis :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, fuzzy, no-c-format
+msgid "Symbol rate:"
+msgstr "Simbolių tempas :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Pažeistas"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, fuzzy, no-c-format
+msgid "Teletext PID:"
+msgstr "Teleteksto pid :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, fuzzy, no-c-format
+msgid "Service ID:"
+msgstr "Tarnybos id :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, fuzzy, no-c-format
+msgid "Video PID:"
+msgstr "Video pid :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, fuzzy, no-c-format
+msgid "Transport stream ID:"
+msgstr "Transporto srauto id :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Subtitrai"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, fuzzy, no-c-format
+msgid "Audio PIDs..."
+msgstr "Audio pid ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Bandwidth:"
+msgstr "Greitaveika :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, fuzzy, no-c-format
+msgid "FEC high:"
+msgstr "FEC aukštas"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "Transmission:"
+msgstr "Perdavimas :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, fuzzy, no-c-format
+msgid "FEC low:"
+msgstr "FEC žemas"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, fuzzy, no-c-format
+msgid "Guard interval:"
+msgstr "Apsaugotas intervalas :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarchija :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, fuzzy, no-c-format
+msgid "Modulation:"
+msgstr "Moduliacija :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Inversion:"
+msgstr "Inversija :"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, fuzzy, no-c-format
+msgid "Encoder:"
+msgstr "Redaguoti ..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Base directory:"
+msgstr "Įrašų aplankas :"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, fuzzy, no-c-format
+msgid "Normalize"
+msgstr "Normalus dydis"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid "CD Toolbar"
+msgstr "Kanalų įrankių juosta"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, fuzzy, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, fuzzy, no-c-format
+msgid "Bitrate:"
+msgstr "Bitų dažnis:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, fuzzy, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis bylos"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr ""
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Groja&raštis"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Nutraukimo parinktys"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Grotuvas"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Naudoti automatinį išmatavimų &keitimą"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Transliavimas ti&nkle"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigacija"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, fuzzy, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD meniu"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Audio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Santykis"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Valdymo įrankių juosta"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Garso įrankių juosta"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Pozicijos įrankių juosta"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine nustatymai"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Elgsena"
+
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "Daryti rodymo pauzę paslėpus"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Įterpti į sistemos dėklą"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sek."
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "išj."
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Pranešimo apie naują pavadinimą rodymo sistemos dėkle trukmė"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr ""
+
+#: pref.cpp:130
+#, fuzzy
+msgid "Miscellaneous Options"
+msgstr "Įvairios parinktys"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Naudoti alternatyvų (ne Unikodo) kodavimą Meta deskriptoriams"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Meta deskriptoriams parinkite alternatyvų kodavimo pavadinimą\n"
+"(to reikia norink konvertuoti į Unikodą)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Išvalyti neseniai naudotų bylų sąrašą"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Pradėti groti nedelsiant"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Pradėti pilno ekrano veiksena"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Nustatyti audio tvarkyklę"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Nustatyti video tvarkyklę"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Nurodykite audio-CD/VCD/DVD įrenginio kelią."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Išvesti xine išriktavimo pranešimus"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Startuoti įdiegimo vedlį"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Bylos grojimui. Tai gali būti vietinės bylos, URL, aplankas arba „DVD“, „VCD“, "
+"„AudioCD“."
+
+#: kaffeine.cpp:175
+#, fuzzy
+msgid "Start"
+msgstr "Paleistis"
+
+#: kaffeine.cpp:179
+#, fuzzy
+msgid "Player Window"
+msgstr "Įsitvirtinti grojaraščio langą"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Palaikomi media formatai"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG audio bylos"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG video bylos"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis bylos"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI bylos"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime bylos"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media bylos"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska bylos"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC bylos"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media bylos"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV bylos"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Grotuvo dalies „%1“ įkėlimas nepavyko."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 nerastas paieškos kelyje."
+
+#: kaffeine.cpp:698
+#, fuzzy
+msgid "Open &URL..."
+msgstr "Atverti &URL"
+
+#: kaffeine.cpp:699
+#, fuzzy
+msgid "Open D&irectory..."
+msgstr "Atverti ap&lanką"
+
+#: kaffeine.cpp:701
+#, fuzzy
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Nutraukti ir išjungti monitorių po šio takelio"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Nutraukti po šio takelio"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr ""
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Sumažintas režimas"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Pakeisti rodymą &grojaraštis/grotuvas"
+
+#: kaffeine.cpp:710
+#, fuzzy
+msgid "Keep &Original Aspect"
+msgstr "Išlaikyti &originalo proporcijas"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Orginalus dydis"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Dvigubas dydis"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Trigubas dydis"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Grotuvo variklis"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+#, fuzzy
+msgid "DVB client"
+msgstr "DVB įrenginys"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Grotuvas"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Pagrindinis langas"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS Xserver plėtiniai nerasti."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Įjungus šią parinktį pasibaigus bylos/grojaraščio peržiūrai Kaffeine bei "
+"monitoriaus maitinimas bus išjungti. Tam, kad monitorius būtų sėkmingai "
+"išjungtas, X serverio konfigūracijoje turi būti nurodyta parinktis „DPMS“."
+
+#: kaffeine.cpp:1139
+#, fuzzy
+msgid "Open File(s)"
+msgstr "Atverti bylą(s)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Atverti URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Įvesti URL:"
+
+#: kaffeine.cpp:1466
+#, fuzzy
+msgid "Open Folder"
+msgstr "Atverti aplanką"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Įrenginyje nėra %1, arba kelias į irenginį nurodytas klaidingai."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Prašome pasirinkti teisingą įrenginį:"
+
+#: instwizard.cpp:52
+#, fuzzy
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine diegimo vedlys"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Diegimo patikrinimas"
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine nustatymai"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Gerai."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Part nerastas. Prašome patikrinti, ar jis įdiegtas!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Rasta versija"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine veikia su KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 kodekai"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"/usr/lib/win32 kelyje nerasti kodekai WIN32. Jūs negalėsite peržiūrėti Windows "
+"Media 9 bylų, naujesnių Real Media bylų ir kai kurių kitų mažiau paplitusių "
+"formatų. Kodekus galite parsisiųsti iš čia:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss nerastas. Jūs negalėsite žiūrėti užšifruotų (daugumos komercinių) "
+"DVD. Šią biblioteką galite parsisiųsti iš čia (tačiau jos naudojimas gali "
+"pažeisti Jūsų šalies įstatymus!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD įrenginys"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"DMA veiksena išjungta! Norėdami sklandžiai žiūrėti DVD paleiskite įvykdykite "
+"šią komandą root teisėmis:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Neišeina patikrinti DMA veiksenos. Priėjimas uždraustas, arba nėra tokio "
+"įrenginio:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr ""
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribucija"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"Su SuSE platinamas xine-lib „gali neturėti kai kurių savybių dėl teisinių "
+"reikalavimų (potencialaus patentų pažeidimo)“. Turite naudoti paketą iš čia:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "REZULTATAS"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Aptikta keletas problemų, tačiau Kaffeine vis tiek turėtų veikti."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Viskas gerai!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Naudoti Kaffeine kaip pagalbinę priemonę mms:// (Microsoft media) srautams"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Naudoti Kaffeine kaip pagalbinę priemonę rtsp:// (Real media ir kt.) srautams"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Sukurti Kaffeine ženklelį darbastalyje"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Diegimo parinktys"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Išlyginimo kokybė"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Labai žemas cpu naudojimas, blogiausia kokybė.</b>"
+"<br>Pusė vertikaliosios rezoliucijos prarasta. Kai kuriose sistemose (su PCI "
+"video plokštėmis) tai gali sumažinti CPU naudojimą kai kalbama apie paprastą "
+"video grojimą (be išlyginimo (deinterlacing))."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>CPU naudojamas mažai, žema kokybė.</b>"
+"<br>Vaizdas išskydęs vertikaliai, tad „interlacing“ efektai pašalinami."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>CPU naudojamas vidutiniškai, vidutinė kokybė.</b>"
+"<br>Vaizdas analizuojamas, ir „interlacing“ trūkumai pataisomi "
+"(„interpolated“)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>CPU naudojimas padidintas, gera kokybė.</b>"
+"<br>DVD formato keitimas pagerina vaizdo kokybę ir ištaiso keletą klaidų."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Labai aukštas procesoriaus naudojimas, puiki kokybė.</b>"
+"<br>Naudojamas gudrus išlyginimo algoritmas, padidinamas kadrų per sekundę "
+"skaičius (30->60fps) kad atitiktu televizorių standartą. Kiti patobulinimai. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Ypatingai aukštas procesoriaus apkrovimas, puiki kokybė, naudojami "
+"eksperimentiniai ptobulinimai.</b>"
+"<br>Įjungiamas drebėjimo koregavimas (filmai rodomi 24 kadrų per sekundę "
+"greičiu) it vertikalus spalvų išlyginimas (ištaiso mažus spalvų dryžius, kurie "
+"pasitaiko kai kuriuose DVD diskuose). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+#, fuzzy
+msgid "User defined"
+msgstr "Naudotojo nustatyta"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+#, fuzzy
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Konfigūruoti tvtime išlyginimo priedą"
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>gali prireikti pataisyto 2.4 branduolio (tokio, kaip RedHat) arba 2.6 "
+"branduolio.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Konfigūruoti tvtime išlyginimo priedą"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Efektų priedai"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Audio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Audio filtrai"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+#, fuzzy
+msgid "Enable audio filters"
+msgstr "Naudoti audio filtrus"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Pridėti filtrą"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Pašalinti visus filtrus"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Video filtrai"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+#, fuzzy
+msgid "Enable video filters"
+msgstr "Naudoti video filtrus"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Xine variklio parametrai"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 parinktys"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Parinktys pradedantiesiems"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Parinktys ekspertams"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "KaffeinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Xine paremta grotuvo dalis skirta Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+#, fuzzy
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL (Synchronizuota multimedijos integracijos kalba) parama yra labai menko "
+"lygio!\n"
+"KaffeinePart gali bandyti groti turimus video šaltinius. Tęsti?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+#, fuzzy
+msgid "Save Stream As"
+msgstr "Įrašyti srautą kaip"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Subtitrai"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Audio Kanalas"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 iš %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-byla\n"
+"*.bmp|BMP-byla\n"
+"*.xbm|XBM-byla"
+
+#: player-parts/xine-part/xine_part.cpp:795
+#, fuzzy
+msgid "Save Screenshot As"
+msgstr "&Išsaugoti ekrano nuotrauką"
+
+#: player-parts/xine-part/xine_part.cpp:879
+#, fuzzy
+msgid "Broadcasting port:"
+msgstr "Transliacijos prievadas"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:903
+#, fuzzy
+msgid "Sender address:"
+msgstr "Siuntėjo adresas"
+
+#: player-parts/xine-part/xine_part.cpp:905
+#, fuzzy
+msgid "Port:"
+msgstr "Prievadas:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+#, fuzzy
+msgid "Jump to position:"
+msgstr "Peršokti į poziciją:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Xine klaida"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+#, fuzzy
+msgid "xine Message"
+msgstr "Xine pranešimas:"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Pasiruošęs"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Groja"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Subtitrų byla"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Įrašyti srautą kaip"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "Takel&io Informacija"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Kopijuoti URL į laikiną talpyklę"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+#, fuzzy
+msgid "Play in Kaffeine Externally"
+msgstr "Groti Kaffeine iš išorės"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+#, fuzzy
+msgid "&Send Broadcast Stream..."
+msgstr "&Siųsti transliacijos srautą"
+
+#: player-parts/xine-part/xine_part.cpp:1270
+#, fuzzy
+msgid "&Receive Broadcast Stream..."
+msgstr "&Priimti transliacijos srautą"
+
+#: player-parts/xine-part/xine_part.cpp:1271
+#, fuzzy
+msgid "&Save Screenshot..."
+msgstr "&Išsaugoti ekrano nuotrauką"
+
+#: player-parts/xine-part/xine_part.cpp:1272
+#, fuzzy
+msgid "Save Stream..."
+msgstr "Išsaugoti srautą kaip..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Išsaugo dabartinį srautą į kietąjį diską. Kai kuriems formatams ši parinktis "
+"yra išjungta (pvz., Real Media) siekiant išvengti potencialių teisinių "
+"problemų."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "&Sumažintas režimas"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pauzė"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Persukti pirmyn"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Sulėtinta &eiga"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+#, fuzzy
+msgid "Skip Forward (20s)"
+msgstr "Persukti į priekį %1"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+#, fuzzy
+msgid "Skip Backward (20s)"
+msgstr "Persukti į priekį %1"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+#, fuzzy
+msgid "Skip Forward (1m)"
+msgstr "Persukti į priekį %1"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1292
+#, fuzzy
+msgid "Skip Forward (10m)"
+msgstr "Persukti į priekį %1"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1294
+#, fuzzy
+msgid "Jump to Position..."
+msgstr "Peršokti į poziciją..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD meniu kairėn"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD meniu dešinėn"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD meniu aukštyn"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD meniu žemyn"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD meniu žymėti"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Audio kanalas"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Pasirinkite audio kanalą"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Audio &vizualizacija"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+#, fuzzy
+msgid "Volume Up"
+msgstr "Pagarsinti"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+#, fuzzy
+msgid "Volume Down"
+msgstr "Sumažinti garsumą"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Išlyginti"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Aktyvuokite nelygiems (interlaced) srautams."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "Iš&kreiptas"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Kvadratas"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Išlyginimo &Kokybė"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Video nustatymai"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Ekvalaizeris"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Meniu perjungimas"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "Ant&raštė"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Šaknis"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Paveikslėlis"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "Ka&mpas"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Dalis"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+#, fuzzy
+msgid "Titles"
+msgstr "Antraštės"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+#, fuzzy
+msgid "Chapters"
+msgstr "Kanalai"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+#, fuzzy
+msgid "Angles"
+msgstr "Ka&mpas"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Takel&io Informacija"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Efektų &priedai"
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&Xine variklio parametrai"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Garsas"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Pozicija"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Trumpas spustelėjimas: Įjungia/išjungia laikmačio prasukimą/atsukimą\n"
+"Ilgas spustelėjimas: Įjungia/išjungia laikmačio ekraną"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Grojimo laikas"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Ieškoma CDDB įrašų..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, fuzzy, c-format
+msgid "AudioCD Track %1"
+msgstr "Takelis"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, fuzzy, c-format
+msgid "VCD Track %1"
+msgstr "Takelis"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Vaizdo nustatymai"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Atspalvis (hue)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Sodrumas"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrastas"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Ryškumas"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Audio/Video poslinkis"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Subtitrų poslinkis"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "automatiškai"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Bendras perspėjimas:\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Nėra informacijos."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Saugumo perspėjimas: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Mazgas, kurį bandote pasiekti, yra nežinomas.\n"
+"Patikrinkite nurodyto mazgo vardo tikrumą."
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Nurodytas įrenginio pavadinimas greičiausiai yra neteisingas."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Tinklas greičiausiai yra nepasiekiamas.\n"
+"Patikrinkite tinklo nustatymus ir serverio vardą."
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Audio išvedimo nėra. Įrenginys užimtas."
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Prisijungimas neleistas.\n"
+"Patikrinkite mazgo vardą."
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Nurodyta byla ar url nerasta. Prašome ją patikrinti."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Leidimas prieiti prie šaltinio negautas."
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Įkeliant biblioteką ar dekoderį įvyko problema:"
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Šaltinis greičiausiai yra užkoduotas, jo negalima perskaityti."
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Nežinoma klaida: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+#, fuzzy
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Klaida: nepavyksta sužądinti video tvarkyklės„1%“, naudojama „%2“!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, fuzzy, c-format
+msgid "Using Video Driver: %1"
+msgstr "Naudojama video tvarkyklė:"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+#, fuzzy
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Klaida: nepavyksta sužądinti audio tvarkyklės„1%“, naudojama „%2“!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, fuzzy, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Naudojama audio tvarkyklė:"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Inicijuojamas xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Nepavyksta inicijuoti xine variklio!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Naudotina audio tvarkyklė (numatyta - „auto“)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Naudotina video tvarkyklė (numatyta - „auto“)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Naudoti programinės įrangos audio mikserį"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Rodyti OSD pranešimus"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "OSD teksto dydis"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Šriftas OSD pranešimams"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+#, fuzzy
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Nepavyksta sužądinti video tvarkyklės„1%“ - bandomas „auto“"
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Nepavyko sužadinti visų video tvarkyklių!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+#, fuzzy
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Nepavyksta sužądinti audio tvarkyklės„1%“ - bandomas „auto“"
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Nepavyko sužadinti visų audio tvarkyklių!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Neįmanoma sukurti naujos xine srovės!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+#, fuzzy
+msgid "DVB: opening..."
+msgstr "DVB : atveriama ..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Atveriama..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Audio kodekas"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Video kodekas"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Šiam resursui atverti nerasta tinkamo įskiepio"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Resursas greičiausiai yra sugadintas"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Prašomas resursas neegzistuoja"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Resursas negali būti atidarytas"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Bendra klaida"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+#, fuzzy
+msgid "Mute Off"
+msgstr "Begarsis"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+#, fuzzy
+msgid "Mute On"
+msgstr "Begarsis"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Persukti į priekį %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Lėta eiga %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+#, fuzzy
+msgid "Deinterlace: on"
+msgstr " Deinterlace : įjungta"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+#, fuzzy
+msgid "Deinterlace: off"
+msgstr "Deinterlace : išjungta"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Santykinis dydis"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "mili sek"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Ekvalaizerio nustatymai"
+
+#: player-parts/xine-part/equalizer.cpp:43
+#, fuzzy
+msgid "Volume gain"
+msgstr "Garso padidėjimas"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "Garso padidėjimas ekvalaizeriui - Jei garsas tampa nešvarus, išjunkite"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Pašalinti filtrą"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Begarsis"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Komentaras"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Nerasta naudotinos audio-tvarkyklės!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Nepavyksta sužadinti video valdyklės „%1“ - bandoma kita..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Nerasta naudotinos video tvarkyklės!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Audio parinktys"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Pageidaujama audio valdyklė"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Video parinktys"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Pageidaujama video valdyklė"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Reikia paleisti iš naujo!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "MEdia parinktys"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD dėklas"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Netikra dalis"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Nepavyko prisijungti prie X-serverio!"
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "Uždarius pagrindinį langą Kaffeine vis tiek veiks sistemos dėkle. Norėdami jį išjungti naudokite Nutraukti įrašą iš Bylos meniu."
+
+#~ msgid "No player"
+#~ msgstr "Nepasirinkta rodymo programa"
+
+#, fuzzy
+#~ msgid "No layer"
+#~ msgstr "Nepasirinkta rodymo programa"
+
+#, fuzzy
+#~ msgid "Ch %1"
+#~ msgstr "Kan."
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "Kaffeine Part"
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-C"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-T"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-S"
diff --git a/po/mk.po b/po/mk.po
new file mode 100644
index 0000000..85922d8
--- /dev/null
+++ b/po/mk.po
@@ -0,0 +1,3551 @@
+# translation of mk.po to
+# translation of mk.po to
+# translation of kaffeine.po to
+# translation of mk.po to
+# translation of mk.po to
+# translation of kaffeine.po to Macedonian
+# Igor Stamatovski <igor.stamatovski@gmail.com>, 2004, 2005.
+# Игор Стаматовски <igor.stamatovski@gmail.com>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: mk\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2005-08-08 17:42+0200\n"
+"Last-Translator: Игор Стаматовски <igor.stamatovski@gmail.com>\n"
+"Language-Team: <en@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.2beta3\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "ЕПГ"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Освежи"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Тековна/Следна"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Канал "
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Почни"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Траење"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Наслов"
+
+#: input/dvb/kevents.cpp:140
+#, fuzzy
+msgid "View All Programs"
+msgstr "Погледни ги сите програми"
+
+#: input/dvb/kevents.cpp:142
+#, fuzzy
+msgid "Add to Timers"
+msgstr "Додади во тајмери"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, fuzzy, no-c-format
+msgid "Name:"
+msgstr "Име :"
+
+#: input/dvb/ktimereditor.cpp:39
+#, fuzzy
+msgid "Channel:"
+msgstr "Канал :"
+
+#: input/dvb/ktimereditor.cpp:43
+#, fuzzy
+msgid "Begin:"
+msgstr "Почни :"
+
+#: input/dvb/ktimereditor.cpp:47
+#, fuzzy
+msgid "Duration:"
+msgstr "Траење :"
+
+#: input/dvb/ktimereditor.cpp:51
+#, fuzzy
+msgid "End:"
+msgstr "Најдов :"
+
+#: input/dvb/ktimereditor.cpp:55
+#, fuzzy
+msgid "Record as:"
+msgstr "Сними како :"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Ништо"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Дневно"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Неделно"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Месечно"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Кориснички дефинирано"
+
+#: input/dvb/ktimereditor.cpp:130
+#, fuzzy
+msgid "Repeat..."
+msgstr "Повтори ..."
+
+#: input/dvb/ktimereditor.cpp:132
+#, fuzzy
+msgid "Timer Editor"
+msgstr "Уредувач за тајмерот"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+#, fuzzy
+msgid "You must give it a name!"
+msgstr "Морате да му дадете име !"
+
+#: input/dvb/ktimereditor.cpp:215
+#, fuzzy
+msgid "Duration must be at least 1 minute!"
+msgstr "Траењето мора да биде најмалку 1 минута !"
+
+#: input/dvb/ktimereditor.cpp:236
+#, fuzzy
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Името не смее да содржи ниедна коса линија ( / ) !"
+
+#: input/dvb/channeleditor.cpp:62
+#, fuzzy
+msgid "Initial Transponder Settings"
+msgstr "Почетни подесувања на транспондерот"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Ова име не е единствено."
+
+#: input/dvb/channeleditor.cpp:126
+#, fuzzy
+msgid "Missing audio pid(s)!"
+msgstr "Недостасуваат аудио pid-овите!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+#, fuzzy
+msgid "Pid must be non zero!"
+msgstr "PID мора да бидат различни од нула !"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Треба да одберете неколку денови."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Канали"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Тајмери"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Електронски програмски водич"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Подесување за DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Број"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Име"
+
+#: input/dvb/dvbpanel.cpp:176
+#, fuzzy
+msgid "Audio Channels"
+msgstr "Канал за аудио"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+#, fuzzy
+msgid "Instant Record"
+msgstr "Инстантен запис"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Радиодифузија"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Временско поместување"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Снимам"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Радиодифузија "
+
+#: input/dvb/dvbpanel.cpp:271
+#, fuzzy
+msgid "Select icon..."
+msgstr "Одбери го филмот"
+
+#: input/dvb/dvbpanel.cpp:278
+#, fuzzy
+msgid "Choose channel icon"
+msgstr "Уредувач за канали"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:331
+#, fuzzy
+msgid "OSD Next Channel"
+msgstr "Следен канал"
+
+#: input/dvb/dvbpanel.cpp:332
+#, fuzzy
+msgid "OSD Previous Channel"
+msgstr "Претходен канал"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:335
+#, fuzzy
+msgid "OSD Previous Event"
+msgstr "Претходната Ставка/Поглавје"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr ""
+"Покажи го ПНЕ\n"
+"(Прикажи на екранот)"
+
+#: input/dvb/dvbpanel.cpp:338
+#, fuzzy
+msgid "EPG..."
+msgstr "ЕПГ .."
+
+#: input/dvb/dvbpanel.cpp:339
+#, fuzzy
+msgid "Timers..."
+msgstr "Тајмери ..."
+
+#: input/dvb/dvbpanel.cpp:340
+#, fuzzy
+msgid "Broadcasting..."
+msgstr "Радиодифузија ..."
+
+#: input/dvb/dvbpanel.cpp:341
+#, fuzzy
+msgid "Channels..."
+msgstr "Канали ..."
+
+#: input/dvb/dvbpanel.cpp:342
+#, fuzzy
+msgid "Configure DVB..."
+msgstr "Конфигурирај DVB ..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Се"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "ТВ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Радио"
+
+#: input/dvb/dvbpanel.cpp:420
+#, fuzzy
+msgid "New Category..."
+msgstr "Нова категорија ..."
+
+#: input/dvb/dvbpanel.cpp:423
+#, fuzzy
+msgid "Change Icon..."
+msgstr "Промени икона ..."
+
+#: input/dvb/dvbpanel.cpp:425
+#, fuzzy
+msgid "Delete Category..."
+msgstr "Избриши категорија..."
+
+#: input/dvb/dvbpanel.cpp:430
+#, fuzzy
+msgid "New Category"
+msgstr "Нова категорија"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Внесете има за оваа категорија:"
+
+#: input/dvb/dvbpanel.cpp:449
+#, fuzzy
+msgid "Do you really want to delete this category?"
+msgstr "Навистина сакате да ја избришете оваа категорија?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+#, fuzzy
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Неможам за ги земам податоците за DVB од "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz !"
+"<br>\t\t\tПроверете ја вашата врска кон интернет, и притиснете Да за да се "
+"обидете повторно."
+"<br>\t\t\tИли не за да се откажете."
+"<br>\t\t\tАко веќе ја имате оваа архива ископирајте ја во "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz и притиснете Да."
+"<br>"
+"<br>Да се обидам повторно?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Радиодифузија не беше успешна."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Не можам да почнам со радиодифузија."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Тајмерот е успешно креиран и стартуван."
+
+#: input/dvb/dvbpanel.cpp:1427
+#, fuzzy
+msgid "You may want to define some channel first!"
+msgstr "Можеби на почетокот ќе сакате да дефинирате некои канали!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Тајмерот е успешно креиран."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Сеуште снимам."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Сеуште вршам радиодифузија."
+
+#: input/dvb/dvbpanel.cpp:1893
+#, fuzzy
+msgid "Can't tune dvb!"
+msgstr "Не може да го нагодам dvb !"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Не можам да го сетирам pid-то"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+#, fuzzy
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Кафеине сеуште снима. Навистина сакате да го напуштите?"
+
+#: input/dvb/dvbpanel.cpp:2498
+#, fuzzy
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Кафеине има тајмери во редот за чекање. Навистина сакате да го напуштите?"
+
+#: input/dvb/scandialog.cpp:84
+#, fuzzy
+msgid "Signal:"
+msgstr "Сигнал :"
+
+#: input/dvb/scandialog.cpp:88
+#, fuzzy
+msgid "SNR:"
+msgstr "СНР :"
+
+#: input/dvb/scandialog.cpp:92
+#, fuzzy
+msgid "Lock:"
+msgstr "Заклучи :"
+
+#: input/dvb/scandialog.cpp:236
+#, fuzzy
+msgid "Edit..."
+msgstr "Уреди ..."
+
+#: input/dvb/scandialog.cpp:342
+#, fuzzy
+msgid "Do you really want to delete all channels?"
+msgstr "Навистина сакате да ги избришете сите канали?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Почни скенирање"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Запри скенирање"
+
+#: input/dvb/scandialog.cpp:843
+#, fuzzy
+msgid "Stopping..."
+msgstr "Запирам ..."
+
+#: input/dvb/scandialog.cpp:939
+#, fuzzy
+msgid "Found: %1 TV - %2 radio"
+msgstr "Најдов : %1 ТВ - %2 радио (ја)"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Не можам да го отворам DVB инфо сокетот."
+
+#: input/dvb/krecord.cpp:40
+#, fuzzy
+msgid "Timers list:"
+msgstr "Листа на тајмери:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Ново"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Стоп/Избриши"
+
+#: input/dvb/krecord.cpp:232
+#, fuzzy
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Овој тајмер се повторува. Сакате да се прескокне тековната работа или да се "
+"избрише тајмерот?"
+
+#: input/dvb/krecord.cpp:232
+#, fuzzy
+msgid "Skip Current"
+msgstr "Прескокни го тековниот"
+
+#: input/dvb/krecord.cpp:234
+#, fuzzy
+msgid "Delete the selected timer?"
+msgstr "Избриши го избраниот тајмер?"
+
+#: input/dvb/dvbconfig.cpp:247
+#, fuzzy
+msgid "Downloading... "
+msgstr "Симнувам ... "
+
+#: input/dvb/dvbconfig.cpp:247
+#, fuzzy
+msgid "Copying data files..."
+msgstr "Снимам датотеки со податоци ..."
+
+#: input/dvb/dvbconfig.cpp:478
+#, fuzzy
+msgid "DVB Settings"
+msgstr "Подесување за DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+#, fuzzy
+msgid "DVB Device"
+msgstr "DVB уред"
+
+#: input/dvb/dvbconfig.cpp:497
+#, fuzzy
+msgid "Device Settings"
+msgstr "Подесување за уредот"
+
+#: input/dvb/dvbconfig.cpp:504
+#, fuzzy
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Име :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+#, fuzzy
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Тип :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+#, fuzzy
+msgid "Satellite"
+msgstr "Зачувај листа"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "Изведувач"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Непознатo"
+
+#: input/dvb/dvbconfig.cpp:524
+#, fuzzy
+msgid "Number of LNBs:"
+msgstr "Број на LNB-а :"
+
+#: input/dvb/dvbconfig.cpp:531
+#, fuzzy
+msgid "1st sat:"
+msgstr "1 сателит :"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+#, fuzzy
+msgid "LNB Settings..."
+msgstr "Подесување за DVB"
+
+#: input/dvb/dvbconfig.cpp:545
+#, fuzzy
+msgid "2nd sat:"
+msgstr "2 сателит :"
+
+#: input/dvb/dvbconfig.cpp:559
+#, fuzzy
+msgid "3rd sat:"
+msgstr "3 сателит :"
+
+#: input/dvb/dvbconfig.cpp:573
+#, fuzzy
+msgid "4th sat:"
+msgstr "4 сателит :"
+
+#: input/dvb/dvbconfig.cpp:581
+#, fuzzy
+msgid "LNB settings..."
+msgstr "Подесување за DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, fuzzy, no-c-format
+msgid "Source:"
+msgstr "Извор :"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+#, fuzzy
+msgid "DVB Recording Options"
+msgstr "Опции за DVB снимање"
+
+#: input/dvb/dvbconfig.cpp:626
+#, fuzzy
+msgid "Records directory:"
+msgstr "Директориум за записи :"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+#, fuzzy
+msgid "Time shifting directory:"
+msgstr "Директориум за временско поместување :"
+
+#: input/dvb/dvbconfig.cpp:644
+#, fuzzy
+msgid "Begin margin:"
+msgstr "Почетна разлика :"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(минути)"
+
+#: input/dvb/dvbconfig.cpp:653
+#, fuzzy
+msgid "End margin:"
+msgstr "Завршна разлика :"
+
+#: input/dvb/dvbconfig.cpp:662
+#, fuzzy
+msgid "Instant record duration:"
+msgstr "Траење на инстант запис :"
+
+#: input/dvb/dvbconfig.cpp:671
+#, fuzzy
+msgid "Preferred format:"
+msgstr "Претпочитан формат :"
+
+#: input/dvb/dvbconfig.cpp:693
+#, fuzzy
+msgid "DVB Broadcasting"
+msgstr "Радиодифузија на дигитално видео (DVB)"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+#, fuzzy
+msgid "Broadcast address:"
+msgstr "Адреса за радиодифузија :"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+#, fuzzy
+msgid "Broadcast port:"
+msgstr "Порта за радиодифузија :"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+#, fuzzy
+msgid "Info port:"
+msgstr "Инфо порта :"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Разно"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:736
+#, fuzzy
+msgid "Update scan data:"
+msgstr "Ажурирај податоци за скенирање :"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Симни"
+
+#: input/dvb/dvbconfig.cpp:742
+#, fuzzy
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Исфрли ги настаните на ЕПГ во \n"
+"~/каафеине_двб_настани.tx"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Исфрли"
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "DVB клиент"
+
+#: input/dvb/dvbconfig.cpp:806
+#, fuzzy
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Неможам за ги земам податоците за DVB од "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz !"
+"<br>\t\t\tПроверете ја вашата врска кон интернет, и притиснете Да за да се "
+"обидете повторно."
+"<br>\t\t\tИли притиснете Не за да се откажете."
+"<br> Да се обидам повторно ?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Невалиден директориум за записи."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Невалиден директориум за временско поместување."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Инфо и портата за пренесување мора да бидат различни."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Невалиден адреса за радиодифузија."
+
+#: input/dvb/dvbconfig.cpp:957
+#, fuzzy
+msgid "LNB Settings"
+msgstr "Подесување за DVB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+#, fuzzy
+msgid "Dual LO switch frequency:"
+msgstr "Фреквенција :"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:988
+#, fuzzy
+msgid "Lo-band frequency:"
+msgstr "Фреквенција :"
+
+#: input/dvb/dvbconfig.cpp:992
+#, fuzzy
+msgid "Hi-band frequency:"
+msgstr "Фреквенција :"
+
+#: input/dvb/dvbconfig.cpp:996
+#, fuzzy
+msgid "Single LO frequency:"
+msgstr "Фреквенција :"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "Фреквенција :"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "Фреквенција :"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Ресетирај"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Не можам да го отворам сокетот за DVB  пренесување"
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Не можам да го иницијализирам DVB сокетот за пренесување"
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr ""
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+#, fuzzy
+msgid "Loading of encoder '%1' failed."
+msgstr "Вчитувањето на делот %1 од прикажувачот не успеа."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr ""
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr ""
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr ""
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr ""
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+#, fuzzy
+msgid "Audio CD"
+msgstr "Аудио :"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+#, fuzzy
+msgid "Play CD"
+msgstr "Пушти"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr ""
+
+#: input/disc/disc.cpp:132
+#, fuzzy
+msgid "Artist:"
+msgstr "Изведувач"
+
+#: input/disc/disc.cpp:140
+#, fuzzy
+msgid "Album:"
+msgstr "Албум"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Нумера"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+
+#: input/disc/disc.cpp:169
+#, fuzzy
+msgid "Encode..."
+msgstr "Уреди ..."
+
+#: input/disc/disc.cpp:209
+#, fuzzy
+msgid "Audio CD encoding"
+msgstr "Уредувач за аудио pids "
+
+#: input/disc/disc.cpp:212
+#, fuzzy
+msgid "Play Audio CD"
+msgstr "Отвори Audio-CD"
+
+#: input/disc/disc.cpp:215
+#, fuzzy
+msgid "Play DVD"
+msgstr "Пушти"
+
+#: input/disc/disc.cpp:218
+#, fuzzy
+msgid "Play VCD"
+msgstr "Пушти"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Отвори &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Отвори &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Отвори &Audio-CD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr ""
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr ""
+
+#: input/disc/disc.cpp:576
+#, fuzzy
+msgid "DVD Video"
+msgstr "Видео"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr ""
+
+#: input/disc/cddb.cpp:330
+#, fuzzy
+msgid "No Title"
+msgstr "Наслов"
+
+#: input/disc/cddb.cpp:342
+#, fuzzy, c-format
+msgid "Track %1"
+msgstr "Нумера"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+#, fuzzy
+msgid "KaffeineMp3Lame"
+msgstr "Кафеин дел"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+#, fuzzy
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Кaffeine дел за прикажување за базиран за xine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+#, fuzzy
+msgid "KaffeineOggVorbis"
+msgstr "Кафеин"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+#, fuzzy
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Кaffeine дел за прикажување за базиран за xine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+#, fuzzy
+msgid "DVB Client"
+msgstr "DVB клиент"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Не можам да го отворам инфо сокетот"
+
+#: input/dvbclient/cdlisten.cpp:80
+#, fuzzy
+msgid "Can't bind info socket!!!"
+msgstr "Не можам да се закачам на инфо сокетот."
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Не можам да го отворам сокетот."
+
+#: input/dvbclient/cddump.cpp:202
+#, fuzzy
+msgid "Can't set socket option!!!"
+msgstr "Не можам да ги поставам опциите на сокетот !!!"
+
+#: input/dvbclient/cddump.cpp:209
+#, fuzzy
+msgid "Can't bind socket!!!"
+msgstr "Не можам да се закачам на сокетот !!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+#, fuzzy
+msgid "All Sizes"
+msgstr "Сите датотеки"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+#, fuzzy
+msgid "Medium"
+msgstr "Медии"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+#, fuzzy
+msgid "Large"
+msgstr "Јазик :"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+#, fuzzy
+msgid "New Search"
+msgstr "Пребарај по :"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:263
+#, fuzzy
+msgid "Cover Downloader"
+msgstr "Симни"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Пушти"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Пушти следно/Додади во редот"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Селектирај &Се"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Направи листа од избраните"
+
+#: input/audiobrowser/urllistview.cpp:54
+#, fuzzy
+msgid "Add Sub&title..."
+msgstr "Додади &превод"
+
+#: input/audiobrowser/urllistview.cpp:56
+#, fuzzy
+msgid "&Edit Title"
+msgstr "&Промени го насловот"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Инфо"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Должина"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Изведувач"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Албум"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Година"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Жанр"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Преводи"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "во употреба"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Датотеки што содржат преводи\n"
+"*.*|Сите датотеки"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+#, fuzzy
+msgid "Select Subtitle File"
+msgstr "Одбери превод"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Филтер"
+
+#: input/audiobrowser/playlist.cpp:398
+#, fuzzy
+msgid "Playlist:"
+msgstr "Листа"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Избери ја активната листа. За да го промениш името на листата уреди го и "
+"потврди со притискање Ентер."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Пушти Листа"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "Повто&ри"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Повторувајте ја листата"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Изме&шај"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Пушти по случаен редослед"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "Отст&рани ја тековната листа"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Но&ва листа"
+
+#: input/audiobrowser/playlist.cpp:494
+#, fuzzy
+msgid "&Import Playlist..."
+msgstr "&Увези Листа"
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Зачувај ја тековната листа како..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Отст&рани ја тековната листа"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Листа на Кафеин"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Сите датотеки"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Отвори листа"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "М3U листи"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+#, fuzzy
+msgid "PLS Playlists"
+msgstr "Пушти Листа"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Зачувај листа"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Листа"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "НОВО"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Ги увезувам мултимедијалните ресурси..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(нема превод)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Друг превод..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "%1 ставки во редот, време на репродукција %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Ставки: %1, Време на репродукција: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Отстрани %1 од листата и од дискот?"
+
+#: input/audiobrowser/playlist.cpp:1888
+#, fuzzy
+msgid "Playlist Name Already Exists"
+msgstr "Оваа листа веќе постои "
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Внесете друго име за листата:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Одбери превод"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Мултимедијална датотека:"
+
+#: input/audiobrowser/playlist.cpp:2315
+#, fuzzy
+msgid "Select Movie"
+msgstr "Одбери го филмот"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Датотека со преводи:"
+
+#: systemtray.cpp:60
+#, fuzzy
+msgid "Play / Pause"
+msgstr "Пушти Листа"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Занеми"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Прикажувач Кафеин"
+
+#: startwindow.cpp:85
+#, fuzzy
+msgid "[Kaffeine Player]"
+msgstr "Прикажувач Кафеин"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Игор Стаматовски"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "igor.stamatovski@gmail.com"
+
+#: main.cpp:73
+#, fuzzy
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Прикажувач на медии за KDE 3. Може да ползува повеќе заднински задвижувачи, "
+"предефиниран е xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Авторите на Кафеине"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr ""
+
+#: main.cpp:78
+#, fuzzy
+msgid "Original author"
+msgstr "Оригинална големина"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr ""
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Анимација на логото за Кафеин 0.6"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Алтернативен енкодинг за мета опашки. Многу закрпи."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Плагин на xine за понатамошно ракување. Многу закрпи."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Увези датотека со преводи."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Увоз на M3U. Тестирам."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Уредувач на pid-от на преводите"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Преводи"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Нова ставка"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, fuzzy, no-c-format
+msgid "Move Up"
+msgstr "Оди горе"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, fuzzy, no-c-format
+msgid "Move Down"
+msgstr "Оди долу"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, fuzzy, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Ажурирај ја селекцијата"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Ново"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, fuzzy, no-c-format
+msgid "Pid:"
+msgstr "Пид :"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, fuzzy, no-c-format
+msgid "Page:"
+msgstr "Страница :"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, fuzzy, no-c-format
+msgid "Sub page:"
+msgstr "Подстраница :"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, fuzzy, no-c-format
+msgid "Lang:"
+msgstr "Јазик :"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, fuzzy, no-c-format
+msgid "Repeated Timer"
+msgstr "Тајмер што се повторува"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, fuzzy, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Уредувач за аудио pids "
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, fuzzy, no-c-format
+msgid "Audio PIDs"
+msgstr "Аудио :"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "АЦ3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, fuzzy, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Уредувач на радиодифузија"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, fuzzy, no-c-format
+msgid "Available channels:"
+msgstr "Расположливи канали :"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, fuzzy, no-c-format
+msgid "Broadcasting list:"
+msgstr "Листа за радиодифузија :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Десно кликнување за уредување/бришење)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, fuzzy, no-c-format
+msgid "New..."
+msgstr "Ново ...7"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, fuzzy, no-c-format
+msgid "Search On"
+msgstr "Пребарај по :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, fuzzy, no-c-format
+msgid "Filters"
+msgstr "Филтер"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Слободно за етер"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, fuzzy, no-c-format
+msgid "Provider:"
+msgstr "Обезбедувач :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, fuzzy, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Додади ги избраните"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, fuzzy, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Додади ги филтрираните"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Најдов"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "SNR"
+msgstr "СНР :"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Готово"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, fuzzy, no-c-format
+msgid "Channel Editor"
+msgstr "Уредувач за канали"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, fuzzy, no-c-format
+msgid "Nr:"
+msgstr "Бр :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Поларитет"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, fuzzy, no-c-format
+msgid "Frequency:"
+msgstr "Фреквенција :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, fuzzy, no-c-format
+msgid "Symbol rate:"
+msgstr "Рата на симболи :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Кодиран"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, fuzzy, no-c-format
+msgid "Teletext PID:"
+msgstr "Pid на телетекстот :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, fuzzy, no-c-format
+msgid "Service ID:"
+msgstr "Идентификација на сервисот :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, fuzzy, no-c-format
+msgid "Video PID:"
+msgstr "Pid на видеото :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, fuzzy, no-c-format
+msgid "Transport stream ID:"
+msgstr "Идентификација на потокот за транспорт :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Pid на преводите ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, fuzzy, no-c-format
+msgid "Audio PIDs..."
+msgstr "Аудио pid-ови ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Bandwidth:"
+msgstr "Пропусен опсег :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, fuzzy, no-c-format
+msgid "FEC high:"
+msgstr "FEC Високо"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "Transmission:"
+msgstr "Пренос :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, fuzzy, no-c-format
+msgid "FEC low:"
+msgstr "FEC Низок"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, fuzzy, no-c-format
+msgid "Guard interval:"
+msgstr "Интерал за чуварот :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, fuzzy, no-c-format
+msgid "Hierarchy:"
+msgstr "Хиерархија :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, fuzzy, no-c-format
+msgid "Modulation:"
+msgstr "Модулација :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Inversion:"
+msgstr "Инверзија :"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, fuzzy, no-c-format
+msgid "Encoder:"
+msgstr "Уреди ..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Base directory:"
+msgstr "Директориум за записи :"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "..."
+msgstr "Ново ...7"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr ""
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid "CD Toolbar"
+msgstr "Алатник за канали"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, fuzzy, no-c-format
+msgid "VBR"
+msgstr "DVB"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, fuzzy, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis датотеки"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr ""
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Листа"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Опции за напуштање"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Прикажувач"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Овозможи автоматско манипулирање со &Големината"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Мрежен пренос"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Навигација"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, fuzzy, no-c-format
+msgid "&DVD"
+msgstr "&DVB"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD менија"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Аудио"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Видео"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "Размер на &аспектот"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Алатник за сликите од екранот"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Алатник за контроли "
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Алатник за звукот"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Алатник за позиција"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Подесување на Кафеин "
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Однесување"
+
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "Паузирај го видеото кога сум скриен"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Вметни во системската лента "
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " сек"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "исклучи"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Времетраење на најавувањето на насловот во системската лента"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Овозможи го DVB клиентот"
+
+#: pref.cpp:130
+#, fuzzy
+msgid "Miscellaneous Options"
+msgstr "Разни опции"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Користи алтернативен (не Уникод) енкодинг за мета опашките"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Одбери алтернативно име на енкодингот за мета опашките\n"
+"(за да може да се претворат во Уникод)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Исчисти ја листата на скоро употребувани датотеки"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Почни веднаш со прикажување"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Почни во мод за прикажување на цел екран"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Постави го драјверот за аудио"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Постави го драјверот за видео"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Намести ја патеката на Audio-CD/VCD/DVD уредот."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Извади ги пораките за дебагирање од xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Изврши го волшебникот за инсталација"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Датотека(и) за прикажување . Може да биде локална датотека, URL, директориум "
+"или 'DVD', 'VCD', 'AudioCD'."
+
+#: kaffeine.cpp:175
+#, fuzzy
+msgid "Start"
+msgstr "&Дел"
+
+#: kaffeine.cpp:179
+#, fuzzy
+msgid "Player Window"
+msgstr "Закачи го прозорецот за листата"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Поддржани формати на мултимедија"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG датотеки за аудио"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG датотеки за видео"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis датотеки"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI датотеки"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime датотеки"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media датотеки"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska датотеки"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC датотеки"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media датотеки"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV датотеки"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Вчитувањето на делот %1 од прикажувачот не успеа."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 не е пронајден на патеката по која се пребаруваше."
+
+#: kaffeine.cpp:698
+#, fuzzy
+msgid "Open &URL..."
+msgstr "Отвори го &URL-то"
+
+#: kaffeine.cpp:699
+#, fuzzy
+msgid "Open D&irectory..."
+msgstr "Отвори д&иректориум"
+
+#: kaffeine.cpp:701
+#, fuzzy
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Напушти и исклучи го мониторот по оваа нумера"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Напушти по оваа нумера"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Напушти по оваа листа"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Минимален мод"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Чепни ја &листата/Прикажувачот"
+
+#: kaffeine.cpp:710
+#, fuzzy
+msgid "Keep &Original Aspect"
+msgstr "Зачувај го &оригиналниот аспект"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Оригинална големина"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Двапапати во големина"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Трипати во големина"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Придвижувач на прикажувачот"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+#, fuzzy
+msgid "DVB client"
+msgstr "DVB клиент"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Прикажувач"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Главен прозорец"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS екстензијата за Xserver-то не беше најдена."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Исклучи го Кафеин и исклучи го мониторот откако датотеката/листата ќе заврши. "
+"Опцијата \"dpms\" мора да се наоѓа во датотеката X config за мониторот да се "
+"исклучи."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Отвори датотека"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Отвори URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Внеси URL:"
+
+#: kaffeine.cpp:1466
+#, fuzzy
+msgid "Open Folder"
+msgstr "Отвори датотеки"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Нема %1 во драјвот, или погрешен пат до уредот."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Те молам избери го точниот уред:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Кафеин %1 волшебник за инсталација"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Провери инсталација"
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "Подесување на Кафеин "
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Добро."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Делот не беше најден. Те молам провери ја инсталацијата!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Најдов верзија"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "На Кафеин му е потребна верзија на KDE >=%1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Кодеци од WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Во /usr/lib/win32 не беа пронајдени WIN32 кодеци. Не сте во можност да ги "
+"репродуцирате датотеките со формат Windows Media 9, поновите Real Media и некои "
+"помалки познати формати. Овде можете да ги симнете кодеците:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss не беше најдена. Не сте во можност да ги репродуцирате датотеките со "
+"кои се заштитени (повеќето комерцијални) DVD-а. Библиотеките може да се симнат "
+"овде (но со нивна употреба може дасе наруши регулативата од областа на "
+"авторското право во вашата земја!): "
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD драјв"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Исклучен е DMA режимот!. За непрекината репродукција на DVD-то изврши како "
+"root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Не може да се провери DMA режимот. Пристапот не е дозволен или не постои таков "
+"уред."
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB уред "
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "Не се пронајдени DVB уреди. Сите опции за DVB ќе бидат скриени."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Дистрибуција"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"На библиотеката xine-lib која се испорачува со SUSE „ може да и недостасуваат "
+"некои можности бидејчи не ги исполнувале законските побарување (потенцијално "
+"кршење на патентните права)“. Потребно е да се користат пакетите од :"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "РЕЗУЛТАТ"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+"Беа пронајдени некои проблеми , но без разлика на тоа Кафеин може да "
+"функционира."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Се е в ред!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Користи го Кафеин како апликација помошник за mms:// (Microsoft Media) потоци"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Користи го Кафеин како апликација помошник за rtsp:// (Real Media и други) "
+"потоци"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Постави икона за Кафеин на работната површина"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Опции за инсталација"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Квалитет на Deinterlace"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Со многу мала употреба на процесорот , се добива најлош квалитет.</b>"
+"<br>Половина од вертикалната резолуција се губи. За некои системи (со PCI видео "
+"картички) ова може да го намали користењето на процесорот споредено со обична "
+"видео репродукција (без deinterlacing)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Со намалено користење напроцесорот , се добива слаб квалитет.</b>"
+"<br>Сликата е заматена по вертикала, ефектите за interlacing се отстранети."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Умерена употреба на процесорот , просечен квалитет.</b>"
+"<br>Сликата се анализира и областите каде што иам interlacing се поправаат ( се "
+"врши интерполација)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Со интензивно користење на процесорот , се добива добар квалитет.</b>"
+"<br>Претворање на формат на сликата како на оној за DVD и го подобрува "
+"квалитетот и ги поправа грешки при семплирање на бојата."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Со многу интензина употреба на процесорот ,се добива одличен квалитет.</b>"
+"<br>Покрај употребата на алгоритми за smart deinterlacing ќе ја зголеми ратата "
+"на рамки (30->60 рамки во секунда) за да се изедначи со онаа кај телевизиската "
+"слика. Го открива и враќа назад 3-2 pulldown. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Со многу интензина употреба на процесорот ,се добива одличен квалитет со "
+"(експериментални) подобрувања.</b>"
+"<br>Овозможува judder корекција (ги репродуцира филмовите со оригиналната "
+"брзина од 24 рамки во секунда) и вертикално израмнување на бојата (ги поправа "
+"лентите со боја што се јавуваат при репродукција кај некои dvd-а). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+#, fuzzy
+msgid "User defined"
+msgstr "Дефинирано од корисникот..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+#, fuzzy
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Конфигурирај го плагинот за deinterlace на ТВ времето "
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Можеби изискува закрпен кернел 2.4 (како оној на RedHat ) или кернел 2.6 "
+".</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Конфигурирај го плагинот за deinterlace на ТВ времето "
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Плагин за ефекти"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Аудио"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Филтри за аудио"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+#, fuzzy
+msgid "Enable audio filters"
+msgstr "Овозможи филтри за аудио"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Додади филтер"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Отстрани ги сите филтри"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Видео"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Филтри за видео"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+#, fuzzy
+msgid "Enable video filters"
+msgstr "Овозможи видео филтри"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Параметри за xine придвижувачот"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Опции за %1 "
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Опции за почетници"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Опции за експерти"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "Кафеин дел"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Кaffeine дел за прикажување за базиран за xine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+#, fuzzy
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Постои рудиментирана поддршка за SMIL (Synchronized Multimedia Integration "
+"Language) !\n"
+"КафеинPart може да се обиде да го репродуцира изворот на видеото без негово "
+"распоредување. Продложи?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+#, fuzzy
+msgid "Save Stream As"
+msgstr "Зачувај го потокот како"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Превод"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Аудио канал"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 од %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|датотека-PNG \n"
+"*.bmp|датотека-BMP\n"
+"*.xbm|датотека-XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+#, fuzzy
+msgid "Save Screenshot As"
+msgstr "&Зачувај ја фотографијата од филмот"
+
+#: player-parts/xine-part/xine_part.cpp:879
+#, fuzzy
+msgid "Broadcasting port:"
+msgstr "Порта за пренос"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Конфигурирај го приемот на радиодифузниот поток"
+
+#: player-parts/xine-part/xine_part.cpp:903
+#, fuzzy
+msgid "Sender address:"
+msgstr "Адреса на испраќачот"
+
+#: player-parts/xine-part/xine_part.cpp:905
+#, fuzzy
+msgid "Port:"
+msgstr "Порта"
+
+#: player-parts/xine-part/xine_part.cpp:928
+#, fuzzy
+msgid "Jump to position:"
+msgstr "Скокни на позиција:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Грешка од xine "
+
+#: player-parts/xine-part/xine_part.cpp:1008
+#, fuzzy
+msgid "xine Message"
+msgstr "Порака од xine:"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Подготвено."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Репродуцирам"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Датотека со преводи"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Зачувај го потокот како"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "&Информации за нумерата"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Копирај го URL-то во Clipboard"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+#, fuzzy
+msgid "Play in Kaffeine Externally"
+msgstr "Прикажувај во Кафеин однадвор "
+
+#: player-parts/xine-part/xine_part.cpp:1269
+#, fuzzy
+msgid "&Send Broadcast Stream..."
+msgstr "&Испрати го преносот како поток"
+
+#: player-parts/xine-part/xine_part.cpp:1270
+#, fuzzy
+msgid "&Receive Broadcast Stream..."
+msgstr "&Прими го преносот како поток"
+
+#: player-parts/xine-part/xine_part.cpp:1271
+#, fuzzy
+msgid "&Save Screenshot..."
+msgstr "&Зачувај ја фотографијата од филмот"
+
+#: player-parts/xine-part/xine_part.cpp:1272
+#, fuzzy
+msgid "Save Stream..."
+msgstr "Зачувај го потокот како..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Ги снима тековните потоци на тврдиот дсик. Оваа особина за некои формати (на "
+"пр. Real Media) беше оневозможена за да се избегнат правни проблеми."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "&Минимален мод"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Паузирај"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Напред"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Забавено &движење"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+#, fuzzy
+msgid "Skip Forward (20s)"
+msgstr "Скокни напред (10s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+#, fuzzy
+msgid "Skip Backward (20s)"
+msgstr "Скокни назад (10s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+#, fuzzy
+msgid "Skip Forward (1m)"
+msgstr "Скокни напред (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+#, fuzzy
+msgid "Skip Backward (1m)"
+msgstr "Скокни назад (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+#, fuzzy
+msgid "Skip Forward (10m)"
+msgstr "Скокни напред (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+#, fuzzy
+msgid "Skip Backward (10m)"
+msgstr "Скокни назад (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+#, fuzzy
+msgid "Jump to Position..."
+msgstr "Скокни на позиција..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Мени за DVD на лево"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Мени за DVD на десно"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Мени за DVD горе"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Мени за DVD долу"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Селектирајго менито за DVD "
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Канал за аудио"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Одбери канал за аудио"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Звук &визуелизација"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+#, fuzzy
+msgid "Volume Up"
+msgstr "Звук нагоре"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+#, fuzzy
+msgid "Volume Down"
+msgstr "Намалување на звукот"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Deinterlace"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Активирај го за потоци кои се interlaced, како некои DVD-а на пример. "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Автоматски"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "А&наморфно"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Квадрат"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Квалитет на Deinterlace"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Подесувања за &Видео"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Еквилајзер"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Чепни го &Менито"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Наслов"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Root "
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Подслика"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "А&гол"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Дел"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+#, fuzzy
+msgid "Titles"
+msgstr "Наслов"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+#, fuzzy
+msgid "Chapters"
+msgstr "Канали"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+#, fuzzy
+msgid "Angles"
+msgstr "А&гол"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Информации за нумерата"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Плагини за ефекти"
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Параметри за придвижувачот на &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Звук"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Позиција"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Напред ПНЕ\n"
+"(Прикажи на екранот)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Време на приказ"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Барам CDDB ставки ..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, fuzzy, c-format
+msgid "AudioCD Track %1"
+msgstr "Нумера"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, fuzzy, c-format
+msgid "VCD Track %1"
+msgstr "Нумера"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Подесување за видео"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Hue"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Заситување"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Контраст"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Осветленост"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Офсет за аудио/видео"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Поместување на превод"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "автоматски"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Општо предупредување. \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Нема информации."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Безбедносно предупредување: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Домаќинот на кој што се обидуваш да се поврзеш е непознат .\n"
+"Провери ја веродостојноста на домаќинот за кој што станува збор. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Името на уредот кој го специфициравте се чини дека е невалидно. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Изгледа дека мрежата не е достапна\n"
+"Провери ги мрежните подесувања и серверското име. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Нема аудио излез. Уредот е зафатен. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Поврзувањето беше одбиено.\n"
+"Провери го името на домаќинот. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Дадената датотека или урл не беа пронајдени. Те молам провери ги. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Пристапот до овој извор не беше дозволен. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Не може да се чита од изворот.\n"
+"Можеби немаш право за читање, или изворот не содржи податоци. (на пр. стави "
+"диск во оптичкиот уред). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Се појави проблем при вчитување на библиотеката или декодерот. "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Изгледа изворот е заштитен, и од него не може да се чита. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Изгледа дека DVD дискот е заштитен. Според законите на твојата земјата, можеш "
+"или не да ја користиш libdvdcss за да можеш да го прочиташ дискот. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Непозната грешка. \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Грешка: Не можам да го иницијализирам новиот %1 драјвер за видеото - го "
+"користам %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, fuzzy, c-format
+msgid "Using Video Driver: %1"
+msgstr "Го користам драјверот за видео: "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Грешка: Со помош на %2 - не можам да го иницијализирам новиот %1 драјвер за "
+"аудио!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, fuzzy, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Го користам следниов драјвер за аудио: "
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Иницијализирај го xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Не можам да го иницијализирам енџинот на xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Драјвер за аудио што ќе се користи (преддефиниран:автоматски)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Драјвер за видео што ќе се користи (преддефиниран:автоматски)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Користи софтверски миксер за аудио"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr ""
+"ПНЕ\n"
+"(Прикажи на екранот)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Гоелмина на текстот за ПНЕ"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr ""
+"ПНЕ\n"
+"(Приказ на екранот)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"Неможам да го иницијализирам драјверот за видео '%1' - се обидувам со "
+"„автоматски“..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Сите драјвери за видео не успеаа да се иницијализираат!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"Неможам да го иницијализирам драјверот за аудио '%1' - се обидувам со "
+"„автоматски“..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Сите драјвери за аудио не успеаа да се иницијализираат!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Не можам да создадам нов xine поток!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+#, fuzzy
+msgid "DVB: opening..."
+msgstr "DVB : отворам ..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Отворам..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Кодек за аудио"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Кодек за видео"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Не беше пронајден плагинот за ракување со овој ресурс"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Овој ресурс се чини дека е расипан"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Бараниот ресурс не постои"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Ресурсот не може да биде отворен"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Општа грешка"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+#, fuzzy
+msgid "Mute Off"
+msgstr "Занеми"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+#, fuzzy
+msgid "Mute On"
+msgstr "Занеми"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Напред %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Забавено движење %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+#, fuzzy
+msgid "Deinterlace: on"
+msgstr "Deinterlace : вклучено"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+#, fuzzy
+msgid "Deinterlace: off"
+msgstr "Deinterlace : исклучено"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Аспект на размерот"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Автоматски"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Подесување за еквилајзерот"
+
+#: player-parts/xine-part/equalizer.cpp:43
+#, fuzzy
+msgid "Volume gain"
+msgstr "Зголемување на звукот"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Зголемување на звукот за еквилајзерот - Ако звукот добие многу шум оневозможете "
+"ја оваа опција"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Избриши филтер"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Барам до %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Инизијализацијата на GStreamer беше неуспешна!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "Дел GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Занеми"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Коментар"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Параметри за придвижувачот на &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer не може да се иницијализира!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Недостасува GStreamer-registry! Да не заборавивте да го извршите <b>"
+"gst-register</b> (како root) по инсталацијата?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"Неможам да го иницијализирам драјверот за аудио '%1' - се обидувам со друг "
+"драјвер..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Не беше пронајден употреблив драјвер за аудио!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"Неможам да го иницијализирам драјверот за видео '%1' - се обидувам со друг "
+"драјвер..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Не беше пронајден употреблив драјвер за видео!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Параметри за GStreamer придвижувачот"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Опции за аудио"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Претпочитан драјверот за аудио"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Опции за видео"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Претпочитан драјвер за видео"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Потребен е рестартирање на компјутерот!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Медии"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Медиумски Опции "
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD уред"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "ГлупДел"
+
+#, fuzzy
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Овие канали веќе постојат и не беа додадени :"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Поврзувањето кон X-Server-от не беше успешно!"
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "Откако ќе го затвориш главниот прозорец Кафеин ќе продолжи да функционира во системската лента. Употреби Напушти од менито Датотека за да ја напуштиш апликацијата."
+
+#~ msgid "No player"
+#~ msgstr "Нема прикажувач"
+
+#, fuzzy
+#~ msgid "No layer"
+#~ msgstr "Нема прикажувач"
+
+#, fuzzy
+#~ msgid "Ch %1"
+#~ msgstr "Канал "
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "Дел на Кафеин"
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-Kабелски"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-Земјен"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-Сателитски"
+
+#~ msgid "Developer"
+#~ msgstr "Програмер"
+
+#~ msgid "DVB Support"
+#~ msgstr "Поддршка за DVB"
+
+#, fuzzy
+#~ msgid "DVD"
+#~ msgstr "&DVB"
+
+#~ msgid " min"
+#~ msgstr " мин"
+
+#~ msgid ""
+#~ "Interval to fake keypresses\n"
+#~ "(prevent screensaver from activating)"
+#~ msgstr ""
+#~ "Интервал за да глумам притискање на копче од тастатурата\n"
+#~ "(со ова ќе спречам да се случи затишје)"
+
+#~ msgid "Open Files"
+#~ msgstr "Отвори датотеки"
+
+#~ msgid "Open Directory"
+#~ msgstr "Отвори директориум"
+
+#~ msgid "Open DVD"
+#~ msgstr "Отвори DVD"
+
+#~ msgid "Open VCD"
+#~ msgstr "Отвори VCD"
+
+#, fuzzy
+#~ msgid "This player doesn't support DVD playback."
+#~ msgstr "Овој прикажувач не поддржува приказ на %1 ."
+
+#, fuzzy
+#~ msgid "This player doesn't support VCD playback."
+#~ msgstr "Овој прикажувач не поддржува приказ на %1 ."
+
+#, fuzzy
+#~ msgid "This player doesn't support Audio CD playback."
+#~ msgstr "Овој прикажувач не поддржува приказ на %1 ."
+
+#~ msgid "Create Go!-Tab"
+#~ msgstr "Направи Акција! - Таб"
+
+#, fuzzy
+#~ msgid "Audio Browser"
+#~ msgstr "Кодек за аудио"
+
+#, fuzzy
+#~ msgid "Name must not start with ( > )!"
+#~ msgstr "Името не смее да почнува со ( > ) !"
+
+#, fuzzy
+#~ msgid "Audio:"
+#~ msgstr "Аудио :"
+
+#~ msgid "Playlist Toolbar"
+#~ msgstr "Алатник за листата "
+
+#~ msgid "Select Playlist"
+#~ msgstr "Избери листа"
+
+#, fuzzy
+#~ msgid "&Next in Playlist/Queue"
+#~ msgstr "&Следен во листата/Редот"
+
+#, fuzzy
+#~ msgid "Pre&vious in Playlist"
+#~ msgstr "Прет&ходен во листата"
+
+#, fuzzy
+#~ msgid "Next Channel"
+#~ msgstr "Следен канал"
+
+#, fuzzy
+#~ msgid "Previous Channel"
+#~ msgstr "Претходен канал"
+
+#~ msgid "Go!"
+#~ msgstr "Акција!"
+
+#, fuzzy
+#~ msgid "Kaffeine Playlist"
+#~ msgstr "Листа на Кафеин"
+
+#~ msgid "Undock"
+#~ msgstr "Откачи"
+
+#~ msgid "Undock Playlist Window"
+#~ msgstr "Откачи го прозорецот за листата"
+
+#~ msgid "Dock"
+#~ msgstr "Закачи"
+
+#, fuzzy
+#~ msgid "Browse Forward"
+#~ msgstr "&Напред"
+
+#~ msgid "Select a subtitle file"
+#~ msgstr "Одбери датотека со превод "
+
+#, fuzzy
+#~ msgid "Subtitle pids:"
+#~ msgstr "Pid на преводите :"
+
+#, fuzzy
+#~ msgid "Properties:"
+#~ msgstr "Својства :"
+
+#, fuzzy
+#~ msgid "Audio pids:"
+#~ msgstr "Аудио pids :"
+
+#, fuzzy
+#~ msgid "Channels:"
+#~ msgstr "Канали :"
+
+#~ msgid "Delete all"
+#~ msgstr "Избриши ги сите"
+
+#~ msgid "Filters :"
+#~ msgstr "Филтри :"
+
+#, fuzzy
+#~ msgid "Found:"
+#~ msgstr "Најдов :"
+
+#~ msgid "Info port :"
+#~ msgstr "Инфо порта :"
+
+#~ msgid "Select a subtitle"
+#~ msgstr "Одбери превод"
+
+#~ msgid "Save screenshot as..."
+#~ msgstr "Зачувај ја сликата на екранот како..."
+
+#~ msgid "Save Stream"
+#~ msgstr "Зачувај го потокот"
+
+#~ msgid "Developer version."
+#~ msgstr "Програмерска верзија."
+
+#~ msgid "Kaffeine requires xine-lib >= %1. Download the latest version here:"
+#~ msgstr "Кафеин има портеба од xine-lib >= %1. Симни ја најновата верзија од овде:"
+
+#~ msgid "Next Entry/Chapter"
+#~ msgstr "Следната Ставка/ Поглавје"
+
+#~ msgid "Playback failed. Reason unknown."
+#~ msgstr "Од непознати причини, репродукцијата беше неуспешна."
diff --git a/po/nb.po b/po/nb.po
new file mode 100644
index 0000000..3328960
--- /dev/null
+++ b/po/nb.po
@@ -0,0 +1,3192 @@
+# translation of nb.po to
+# Alexander N. Sørnes <alex@thehandofagony.com>, 2005.
+# Alexander Nicolaysen Sørnes <alex@thehandofagony.com>, 2005, 2006.
+# Nils Kristian Tomren <project@nilsk.net>, 2006.
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of nb.po to
+# translation of kaffeine.po to
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-09-11 20:14+0200\n"
+"Last-Translator: Alexander Nicolaysen Sørnes <alex@thehandofagony.com>\n"
+"Language-Team: <nb@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Programoversikt"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Oppdater"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Planlagt"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Gjeldende/Neste"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Begynn"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Varighet"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Tittel"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Vis alle programmer"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Legg til tidtakere"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Navn:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Begynn:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Varighet:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Slutt:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Ta opp som:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Ingen"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Daglig"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Ukentlig"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Månedlig"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Selvvalgt"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Gjenta . . ."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Tidtakerredigerer"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Den må gis et navn."
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Varigheten må være minst ett minutt."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Navnet må ikke inneholde noen av følgende tegn: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Første svarerinnstillinger"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Dette navnet er ikke unikt."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Manglende lyd-PID('er)."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "PID'en må ikke være null."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Noen dager må velges."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanaler"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Tidtakere"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronisk programveiledning"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "Visning på skjermen"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB-innstillinger"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Nummer"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Navn"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Lydkanaler"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Øyeblikkelig opptak"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Kringkast"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Spoling"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Tar opp"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Kringkaster"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Velg ikon . . ."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Velg kanalikon"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digital-TV"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Direkte digital-TV virker bare med xine-motoren."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Visning på skjermen: neste kanal"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Visning på skjermen: forrige kanal"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Visning på skjermen: bla"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Visning på skjermen: neste hendelse"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Visning på skjermen: forrige hendelse"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Vis meldinger på skjermen"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "Programoversikt . . ."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Tidtakere . . ."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Kringkaster . . ."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanaler . . ."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Oppsett av DVB . . ."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Alle"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Ny kategori . . ."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Endre ikon . . ."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Slett kategori . . ."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Ny kategori"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Skriv inn et navn for denne kategorien:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Virkelig slette denne kategorien?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Klarte ikke hente DVB-data fra http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t \t\tKontroller internettforbindelsen, og velg «Ja» for å prøve på nytt."
+"<br>\t\t\tEller, hvis du har lyst, kan du velge «Nei» for å avbryte."
+"<br>\t\t\tHar du arkivet et annet sted, så kopier det til "
+"«~/.kde/share/apps/kaffeine/dvbdata.tar.gz» og velg «Ja»."
+"<br>"
+"<br>Skal det prøves på nytt?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Kringkasting feilet."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Klarte ikke starte kringkasting."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Tidtaker opprettet og startet."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Det er en god idé å oppgi noen kanaler først."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Tidtaker opprettet."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Opptak pågår ennå."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Kringkaster fortsatt."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Klarte ikke se på DVB."
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Klarte ikke angi PID('er)"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Ingen CAM ledig"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Opptak pågår fortsatt. Virkelig avslutte?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Tidtakere er i kø. Virkelig avslutte?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Lås:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Rediger . . ."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Skal virkelig alle kanaler slettes?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Start søk"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Stopp søk"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Stopper . . ."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Fant %1 TV-stasjoner og %2 radiostasjoner"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Klarte ikke åpne DVB-informasjonssokkel."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Tidtakerliste:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Ny"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Stopp/Slett"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Denne tidtakeren er gjentatt. Avbryte gjeldende jobb, eller slette tidtakeren?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Hopp over nåverende"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Slette den valgte tidtakeren?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Laster ned . . . "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Kopierer datafiler . . ."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB-innstillinger"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB-enhet"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Enhetsinnstillinger"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Navn:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Type:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kabel"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Bakkesending"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satelitt"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "ATSC"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Antall LNB'er:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "Første satelitt:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB-innstillinger . . ."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "Andre satelitt:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "Tredje satelitt:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "Fjerde satelitt:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB-innstillinger . . ."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Kilde:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Det ser ut til at denne enheten støtter <b><i>autosøking</i></b>"
+". Du kan velge <b>AUTO</b> i kildelisten for å la Kaffeine søke etter en "
+"frekvensrekke."
+"<br>Velg en ekte kilde fra listen hvis <b><i>autosøk</i></b> feiler.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Hvis du ikke finner nettverket/plasseringen din i listen, må du lage en. "
+"Se i «$HOME/.kde/share/apps/kaffeine/dvb-x/» og bruk en eksisterende fil som "
+"mal. Fyll ut med verdiene for ditt nettverk/plassering og gi den et fornuftig "
+"navm (følg navnereglene). Send den til «kaffeine-user(A)lists.sf.net» hvis du "
+"tror den kan være nyttig for andre.</qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB-opptaksinnstillinger"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Opptakskatalog:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Spolekatalog:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Begynnelsesmargin:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minutter)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Sluttmargin:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Varighet for øyeblikkelige opptak:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Foretrukket format:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB-kringkasting"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Kringkastingsadresse:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Kringkastingsport:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Informasjonsport:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Diverse"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Standard tegnkoding (trenger omstart):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Oppdater søkedata:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Last ned"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Dump programoversikt-hendelser til\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Dump"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB-moduler"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Klarte ikke hente DVB-data fra http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t \t\tSjekk internettforbindelsen, og velg «Ja» for å prøve på nytt."
+"<br>\t\t\tEller, hvis du har lyst, velg «Nei» for å avslutte."
+"<br>Prøve på nytt?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Ugyldig opptakskatalog."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Ugyldig spolekatalog."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Kringkastings- og informasjonsporten må være forskjellige."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Ugyldig kringkastingsadresse."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB-innstillinger"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Universell LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Dobbel LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Enkel LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Byttefrekvens for dobbel LO:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Lavfåndsfrekvens:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Høybåndsfrekvens:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Enkel LO-frekvens:"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "Enkel LO-frekvens:"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "Enkel LO-frekvens:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Tilbakestill"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Klarte ikke åpne DVB-kringkastingssokkel."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Klarte ikke initialisere DVB-kringkastingssokkel."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Fant ingen lydkodere."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+#, fuzzy
+msgid "Loading of encoder '%1' failed."
+msgstr "Klarte ikke laste koderen «%2»."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Klarte ikke opprette katalog: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Byte"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Lyd-CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Spill CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Ripp CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artist:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Spor"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "Velg sporene du ønsker å rippe og trykk på <b>Kod</b>-knappen."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Koder . . ."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Lyd-CD-koding"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Spill lyd-CD"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Spill DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Spill VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Åpne &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Åpne &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Åpne lyd-CD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Du må velge sporene som skal rippes."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Fant flere lyd-CD'er; velg én:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Fant ingen lyd-CD'er."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD-video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Fant flere DVD-videoer; velg én:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Fant felre (S)VCD'er; velg én:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Ingen tittel"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Spor %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Søker lokal CDDB-oppføring . . ."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Søker ekstern CDDB-oppføring . . ."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Fant eksakt treffende CDDB-oppføring . . ."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Fant nær lik CDDB-oppføring . . ."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Fant flere DVD-videoer; velg én:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "Kaffeine MP3 LAME"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "En tilleggsmodul for Kaffeine som koder LAME MP3."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "Kaffeine OGG Vorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "En tilleggsmodul for Kaffeie som koder OGG Vorbis."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB-klient"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Klarte ikke åpne informasjonssokkel."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Klarte ikke binde informasjonssokkel."
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Klarte ikke åpne sokkel."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Klarte ikke velge søkkelinnstilling."
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Klarte ikke binde sokkel."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Alle størrelser"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Veldig liten"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Liten"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Middels"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Stor"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Veldig stor"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nytt søk"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Omslaget du valgte er utilgjengelig; velg et annet."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Omslaget er utilgjengelig"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Omslagnedlaster"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Fant ingen passende bilder; velg et nytt søkeuttrykk:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Skriv inn nytt søkeuttrykk:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Spill av"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Spill som neste/Legg til i kø"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Velg &alle"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Lag spilleliste av merkede"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Legg til under&tekst . . ."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "R&ediger tittel"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Informasjon"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Lengde"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artist"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "År"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Sjanger"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Undertekster"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "i bruk"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi, *.srt, *.sub, *.txt, *.ssa, *.asc|Undertekstfiler\n"
+"*.*|Alle filer"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Velg undertekstfil"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Velg et omslag . . ."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galleri . . ."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filter"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Spilleliste:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Velg den aktive spillelisten. For å endre spillelistenavnet, rediger det og "
+"trykk linjeskift."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Spill spilleliste"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "Gjenta"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Gjenta spilleliste"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Stokk"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Spill i tilfeldig rekkefølge"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Hent omslag automatisk"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Automatisk nedlasting av omslag"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Tøm gjeldende spilleliste"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Ny spilleliste"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importer spilleliste . . ."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "Lagre gjeldende &spilleliste som . . ."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Fjern gjeldende spilleliste"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine-spillelister"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Alle filer"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Åpne spilleliste"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U-spillelister"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS-spillelister"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Lagre spilleliste"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Spilleliste"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NY"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importerer medieressurser . . ."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(ingen undertekster)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Annen undertekst . . ."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galleri"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Kø: %1 oppføringer Spilletid: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Oppføringer: %1 Spilletid: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Fjerne «%1» fra listen og maskinen?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Spillelistenavnet finnes fra før"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Skriv inn et annet spillelistenavn:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Velg undertekst"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Mediefil:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Velg film"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Undertekstfil:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Spill av/Pause"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Neste"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "Stillhet"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Alexander N. Sørnes"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "alex@thehandofagony.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"En mediespiller for KDE 3. Den kan bruke flere programmer for avspiling, "
+"standard (og anbefalt) er xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "Opphavsrett 2003-2005 tilhører Kaffeine-forfatterne"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Nåværende opprettholder"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Opprinnelig forfatter"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM-støtte."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Diverse verdifulle kodebidrag."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Lapp for DVB OSD-blaing."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Lapper for DVB-katagorier."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logo for Kaffeine 0.8 og annen grafikk."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Logoanimering for Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Alternativ koding for meta-merkelapper, samt mange feilrettelser"
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Forhånndsbehandlingsmodul for xine, samt mange feilrettelser"
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Import av undertekstfiler"
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U-import og testing"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Undertekst-PID-redigerer"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Undertekst-PID'er"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Nytt element"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Flytt opp"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Flytt ned"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Oppdatering valgt"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Ny"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Side:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Underside:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Språk:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Gjentatt tidtaker "
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Redigerer for lyd-PID'er"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Lyd-PID'er:"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Kringkastingsredigerer"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Tilgjengelige kanaler:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Kringkastingsliste:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Høyreklikk for å redigere/slette)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Ny . . ."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Søk på"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Forskyving (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Start søk"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtre"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Fri til luft"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Leverandør:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Legg til merkete"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Legg til filtrert"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Funnet"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Ferdig"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Kanalredigerer"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nummer:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaritet"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frekvens:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Symbolhstighet:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Rotet"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Tekst-TV-PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Tjeneste-ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Video-PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Transportstrøm-ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Undertekst-PID'er . . ."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Lyd-PID'er . . ."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Båndbredde:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC høy:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Sending:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC lav:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Vaktintervall:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hirarki:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulering:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversjon:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Kodingsinnstillinger"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Koder:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Basiskatalog:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr ". . ."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoid-nivå:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Deaktiver all kontrollering"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Normal modus"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoid modus"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normaliser"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD-verktøylinje"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Innstillinger for LAME MP3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bithastighet:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "KB/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Innstillinger for OGG Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Kvalitet:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Spi&lleliste"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Avsluttingsalternativer"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "S&piller"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Automatisk stø&rrelsesendring"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Nettverkskringkasting"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigering"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD-menyer"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "Lyd"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Aspektforhold"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Skjermbilde-verktøylinje"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Kontrollere"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Volum"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Posisjon"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Oppsett av Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Oppførsel"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Sett video på pause når vinduet minimeres"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Legg til i systemkurv"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sekunder"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "Av"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Varighet av tittelannonsering i systemkurv"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Slå på DVB-klient"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Diverse innstillinger"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Bruk alternativ (ikke-Unicode) koding for meta-merkelapper"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Velg alternativ kodingnavn for meta-merkelapper\n"
+"(for å konvertere til Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Tøm listen over nylige filer"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Start avspilling øyeblikkelig"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Start i fullskjermmodus"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Velg lyddriver"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Velg videodriver"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Angi sti til CD/VCD/DVD-enhet"
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Vis feilsøkingsmeldinger fra xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Kjør installasjonsveiviser"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Filer som skal spilles. Det kan være en lokal fil, en URL, en katalog, DVD, VCD "
+"eller en lyd-CD."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Start"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Spillervindu"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Støttede medieformater"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG-lydfiler"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG-videofiler"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis-filer"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI-filer"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "QuickTime-filer"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media-filer"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska-filer"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC-filer"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media-filer"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV-filer"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Klarte ikke laste spillermodulen «%1»."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 ble ikke funnet i søkestien."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Åpne &URL . . ."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Åpne &katalog . . ."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Avslutt &og slå av skjermen etter dette sporet"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Avslutt etter dette sporet"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Avslutt etter spilleliste"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimal modus"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Bytt mellom avs&spiller og spilleliste"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Beh&old høyde/bredde-forhold"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Opprinnelig størrelse"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Dobbel størrelse"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Tredobbel størrelse"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Avs&pillermotor"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB-klient"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Spiller"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Hovedvindu"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS Xserver-modulen ble ikke funnet."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Dette vil avslutte Kaffeine og slå av skjermen når fila/spillelisten er "
+"avspilt. «Option \"dpms\"» må være i X-oppsettsfila for at dette skal virke."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Åpne fil(er)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Åpne URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Skriv inn en URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Åpne mappe"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Ingen %1 i stasjonen, eller feil sti til enhet."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Velg riktig stasjon:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Installasjonsveiviser for Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Installasjonssjekk"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "OK."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Del ble ikke funnet; vennligst kontroller installasjonen."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Fant versjon"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine krever KDE versjon %1 eller høyere."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32-kodeker"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Ingen WIN32-kodeker ble funnet i /usr/lib/win32. Du vil ikke kunne spille av "
+"Windows Media 9-filer, nyere Real Media-filer og noen mindre vanlige formater. "
+"Last ned kodekene her:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss ble ikke funnet. Du vil ikke kunne spille av krypterte (flest "
+"kommersielle) DVD'er. Biblioteket kan lastes ned her:"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD-stasjon"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"DMA-modus er av. For glatt DVD-avspilling, kjør følgende kommando som «root»:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Klarte ikke kontrollere DMA-modus. Ingen tilgang eller ingen slik enhet:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-enhet"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Ingen DVB-enheter ble funnet; de DVB-relaterte funksjonene vil derfor skjules."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribusjon"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"Versjonen av xine-lib som følger med SuSE kan mangle noen funksjoner på grunn "
+"av rettslige krav. Du kan finne en bedre versjon her:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "RESULTAT"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Fant noen problemer, men det er mulig Kaffeine virker."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Alt OK."
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "Bruk Kaffeine som hjelpeprogram for mms:// (Microsoft Media)-strømmer"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Bruk Kaffeine som hjelpeprogram for rtsp:// (Real Media og andre)-strømmer"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Lag en snarvei på skrivebordet"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Installasjonsalternativer"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Avflettingskvalitet"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Veldig lav prosessorbruk, dårligst kvalitet</b>"
+"<br>Halvparten av den vertikale oppløsningen går tapt. For noen systemer (med "
+"PCI-videokort) kan dette senke prosessorbruken sammenliknet med vanlig "
+"videoavspilling (ingen avfletting)"
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Lav prosessorbruk, dårlig kvalitet</b>"
+"<br>Bildet blir dimmet vertikalt slik at flettingseffekter blir fjernet."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Middels prosessorbruk, middels kvalitet</b>"
+"<br>Bildet blir analysert og områder som har flettingseffekter blir ordnet."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Høy prosessorbruk, god kvalitet</b>"
+"<br>Konvertering av DVD-bildeformat forbedrer kvaliteten og fikser "
+"gulningsfeil."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Veldig høy prosessorbruk, strålende kvalitet</b>"
+"<br>I tillegg til å bruke smarte avflettingsalgoritmer vil også bildefrekvensen "
+"dobles, slik at den er i samsvar med feltraten på TV-apparater. Finner og "
+"retter opp 3-2-nedtrekking."
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Ekstremt høy prosessorbruk, fantastisk kvalitet med (eksperimentelle) "
+"forbedringer</b>"
+"<br>Hindrer at bilde rister ved å spille slike filmer med sin originale "
+"bildehastighet, og utjevner farger vertikalt for å fjerne striper ved "
+"avspilling av noen DVD'er. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Selvvalgt"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Oppsettt av tvtime-avflettingstillegg . . ."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr "* <i>Kan kreve en oppdatert 2.4-kjerne eller en 2.6-kjerne.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Oppsett av tvtime-avflettingstillegg"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Effekttillegg"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Lyd"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Lydfiltre"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Slå på lydfiltre"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Legg til filter"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Fjern alle filtre"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Videofiltre"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Slå på videofiltre"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Parametere for xine-motoren"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Innstillinger for %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Nybegynnervalg"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Ekspertinnstillinger"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "Xine-modul"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "En xine-basert avspillingsdel for Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL (synkronisert multimedieintegrasjonsspråk)-støtte er under utvikling.\n"
+"Xine-modulen kan nå prøve å spille av begrensede videokilder uten utforming. "
+"Vil du fortsette?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Lagre strøm som"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Undertekst"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Lydkanal"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 av %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-fil\n"
+"*.bmp|BMP-fil\n"
+"*.xbm|XBM-fil"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Lagre skjermbilde som"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Kringkastingsport:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Oppsett av motta kringkastingsstrøm"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Senderadresse:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Hopp til posisjon:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine-feil"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine-beskjed"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Klar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Spiller av"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Undertekstfil"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Lagre strøm som"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Sporinfo"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Kopier URL til utklippstavlen"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Spill i Kaffeine eksternt"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Send kringkastingsstrøm . . ."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "Motta k&ringkastingsstrøm . . ."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Ta bilde . . ."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Lagre strøm . . ."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Lagrer gjeldende strøm på maskinen. Denne funksjonen ble tatt vekk for noen "
+"formater (for eksempel Real Media) for å forhindre mulige rettslige problemer."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Minimal modus av/på"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pause"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "Raskt &framover"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Sakte bevegelse"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Spol framover (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Spol bakover (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Spol framover (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Spol bakover (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Spol framover (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Spol bakover (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Hopp til posisjon . . ."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD-meny: venstre"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD-meny: høyre"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD-meny: opp"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD-meny: ned"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD-meny: velg"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Lydkanal"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Velg lydkanal"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Lyd&visualisering"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Volum opp"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Volum ned"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "Avflett"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Slå på dette for flettede strømmer, som for eksempel noen DVD'er."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Automatisk"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "Bredform&at"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "Kvadrat"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Forstørr vannrett"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Forminsk vannrett"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Forstørr loddrett"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Forminsk loddrett"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Avflettings&kvalitet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Videoinnstillinger"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "Lydutj&evner"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Meny på/av"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Tittel"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Rot"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Underbilde"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "Syns&vinkel"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Del"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Titler"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Kapitler"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Synsvinkler"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Spor&informasjon"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Effekttillegg . . ."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Parametere for &xine-motoren"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volum"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Posisjon"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Kort klikk: Bytte mellom å vise gjenstående/tilbakelagt tid\n"
+"Langt klikk: Skru visning av tid på skjermen av/på"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Spilletid"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Ser etter CDDB-oppføringer . . ."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Lyd-CD-spor %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD-spor %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Videoinnstillinger"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Nyanse"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Metning"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Lysstyrke"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Lyd-/Videobalanse"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Undertittelbalanse"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "Automatisk"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Generell advarsel: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Ingen tilgjengelig informasjon."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Sikkerhetsadvarsel: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Verten du prøver å koble til, er ukjent.\n"
+"Kontroller om det oppgitte vertsnavnet er riktig skrevet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Enhetsnavnet du oppgav ser ut til å være ugyldig. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Nettverket kan ikke nåes.\n"
+"Kontroller nettverksoppsettet og tjenernavnet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Lydavspilling er ikke tilgjengelig; enheten er opptatt. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Forbindelsen ble ikke godtatt.\n"
+"Kontroller vertsnavnet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Den oppgitte fila eller URL-en ble ikke funnet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Tillatelse for denne kilden ble nektet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Klarte ikke lese fra kilden.\n"
+"Det er mulig du ikke har tillatelse til det, eller at kilden ikke inneholder "
+"data (f.eks. intet medium i stasjonen). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+"Det oppstod et problem under lastingen av et bibliotek eller en dekoder. "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Kilden ser ut til å være kryptert, og kan ikke leses. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"DVD-en er antakelig kryptert. Du må installere libdvdcss for å lese den. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Ukjent feil: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Feil: klarte ikke initialisere den nye videodriveren %1, bruker %2 i stedet."
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Bruker videodriver: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Feil: klarte ikke initialisere den nye lyddriveren %1, bruker %2 i stedet."
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Bruker lyddriver: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Initialiserer xine . . ."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Klarte ikke initialisere xine-motoren."
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Lyddriver som skal brukes (standard: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Videodriver som skal brukes (standard: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Bruker programvarelydmikser"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Vis meldinger på skjermen"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Størrelse på skjermmeldinger"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Skripttype for OSD-meldinger"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Klarte ikke initialisere videodriveren «%1», prøver «auto» . . ."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Klarte ikke initialisere en eneste videodriver."
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Klarte ikke initialisere lyddriveren «%1», prøver «auto» . . ."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Klarte ikke initialisere en eneste lyddriver."
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Klarte ikke opprette en nye xine-strøm."
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: åpner . . ."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Åpner . . ."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Lydkodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Videokodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Fant ikke et tillegg for å håndtere denne ressursen"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Ressursen ser ut til å være skadet"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Den forespurte ressursen finnes ikke"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Ressursen kan ikke åpnes"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Generisk feil"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Stillhet av"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Stillhet på"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Raskt framover %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Sakte bevegelse %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Avfletting: på"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Avfletting: av"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Aspektforhold"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Automatisk"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Forstørr X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Forstørr Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msec"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Lydutjevnerinnstillinger"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Volumforsterkning"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Lydforsterker for lydutjevneren. Slå den av hvis lydkvaliteten blir dårlig."
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Slett filter"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Søker til %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Initaliseringen av GStreamer feilet."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamer-del"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Stillhet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Kommentar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parametere for &GStreamer-motoren"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "Klarte ikke initialisere GStreamer."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Manglende GStreamer-register. Ble <b>gst-register</b> "
+"kjørt (som superbruker) etter installasjonen?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Klarte ikke initialisere lyddriveren «%1», prøver en annen . . ."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Ingen brukbar lyddriver ble funnet."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Klarte ikke initialisere videodriveren «%1», prøver en annen . . ."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Ingen brukbar videodriver ble funnet."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parametere for GStreamer-motoren"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Alternativer for lyd"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Foretrukket lyddriver"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Videoinnstillinger"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Foretrukket videodriver"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Krever omstart."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Medieinnstillinger"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD-/DVD-stasjon"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Tulledel"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Disse kanalene finnes fra før, og blir ikke lagt til:"
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "Når hovedvinduet lukkes vil Kaffeine fortsatt kjøre i systemkurven. Bruk «Avslutt» i «FIl»-menyen for å avslutte fullstendig."
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Klarte ikke å koble til X-tjener."
diff --git a/po/nl.po b/po/nl.po
new file mode 100644
index 0000000..406cf47
--- /dev/null
+++ b/po/nl.po
@@ -0,0 +1,3192 @@
+# translation of kaffeine.po to Dutch
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Wilbert Berendsen <wbsoft@xs4all.nl>, 2004, 2005.
+# Rinse de Vries <rinsedevries@kde.nl>, 2005, 2006.
+# Bram Schoenmakers <bramschoenmakers@kde.nl>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-11-26 21:53+0100\n"
+"Last-Translator: Rinse de Vries <rinsedevries@kde.nl>\n"
+"Language-Team: Dutch <kde-i18n-nl@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Verversen"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Gepland"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Huidige/Volgende"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanaal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Begin"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Tijdsduur"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Titel"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Alle programma's weergeven"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Aan timers toevoegen"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Naam:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanaal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Begin:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Duur:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Einde:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Opnemen als: "
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Geen"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Dagelijks"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Wekelijks"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Maandelijks"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Aangepast"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Herhalen..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Timer bewerken"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Geef een naam op."
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "De tijdsduur dient minimaal 1 minuut te zijn."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "De naam mag de volgende lettertekens niet bevatten: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Basisinstellingen transponder"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Deze naam is niet uniek."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Ontbrekende audio pid('s)."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Pid mag niet gelijk aan nul zijn."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Selecteer enkele dagen."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanalen"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Timers"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronische programmagids"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB-instellingen"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Nummer"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Naam"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Audiokanalen"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Direct opnemen"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Uitzenden"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Tijd verschuiven"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Opnemen"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Uitzending"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Pictogram selecteren..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Kanaalpictogram bewerken"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digitale tv"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Live digitale tv werkt alleen met de xine-engine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD volgend kanaal"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD vorig kanaal"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD zap"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD volgende gebeurtenis"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD vorige gebeurtenis"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "OSD weergeven"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Timers..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Uitzenden..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanalen..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "DVB instellen..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Alles"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Nieuwe categorie..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Pictogram wijzigen..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Categorie verwijderen"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nieuwe categorie"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Voer een naam in voor deze categorie:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Wilt u deze categorie verwijderen?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Kan DVB-gegevens niet downloaden van "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t\t\tControleer uw internetverbinding en klik op Ja om het opnieuw te "
+"proberen. "
+"<br>\t\t\tOf klik op Nee om te annuleren."
+"<br>\t\t\tAls u dit bestand reeds heeft, kopieer het dan naar "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz en klik op Ja."
+"<br>"
+"<br>Wilt u het opnieuw proberen?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Uitzenden mislukt."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "De uitzending kon niet worden gestart."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Timer succesvol aangemaakt en gestart."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Wellicht wilt u eerst een kanaal definiëren."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Timer succesvol aangemaakt."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Opname is nog bezig."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Uitzending is nog bezig."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Kan dvb niet afstemmen."
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Kan pid('s) niet instellen."
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Geen CAM vrij"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine is nog aan het opnemen. Wilt u toch afsluiten?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine heeft nog timers in de wachtrij staan. Wilt u toch afsluiten?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signaal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Vergrendelen:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Bewerken..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Wilt u alle kanalen verwijderen?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Scan starten"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Scan stoppen"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Stopt..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Gevonden: %1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Kan DVB-infosocket niet openen."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Lijst van timers:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Nieuw"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Stoppen/verwijderen"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Deze timer is herhaald. Wilt u de huidige taak overslaan of de timer "
+"verwijderen?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Huidige overslaan"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "De geselecteerde timer verwijderen?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Bezig met downloaden... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Gegevensbestanden worden gekopieerd..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB-instellingen"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB-apparaat"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Apparaatinstellingen"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Naam:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Type:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kabel"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Antenne"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satteliet"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Aantal LNB's:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "Eerste sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB-instellingen..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "Tweede sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "Derde sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "Vierde sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB-instellingen..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Bron:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Dit apparaat lijkt de <b><i>autoscan</i></b>functie te ondersteunen. U kunt "
+"<b>AUTO</b> kiezen in de bronlijst om Kaffeine te laten zoeken naar een "
+"frequentiebereik. "
+"<br>Als <b><i>autoscan</i></b> uw kanalen niet kan vinden, kies dan een echte "
+"bron in de lijst.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Als u uw netwerk/locatie niet in de lijst kunt vinden, dan dient u er "
+"een aan te maken. Kijk in de map $HOME/.kde/share/apps/kaffeine/dvb-x/ en neem "
+"een bestaand bestand als beginpunt. Vul de waarden voor uw netwerk/locatie in "
+"en geef het bestand een bruikbare naam (volg de naamconventie). Als u denkt dat "
+"uw nieuwe bestand bruikbaar is voor anderen, stuur het dan naar "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB-opname-instellingen"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Opnamemap:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Tijdverschuivenmap:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Beginmarge:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minuten)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Eindmarge:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Tijdsduur directe opname:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Voorkeursformaat:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB-uitzending"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Uitzendadres:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Poort voor uitzenden:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Infopoort:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Overig"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Standaardtekenset (herstart nodig):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Scangebied bijwerken:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Downloaden"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"epg's gebeurtenissen dumpen in\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Dumpen"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB-plugins"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Kan DVB-gegevens niet downloaden van "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz !"
+"<br>\t\t\tControleer uw internetverbinding en klik op Ja om het opnieuw te "
+"proberen. "
+"<br>\t\t\tOf klik op Nee om te annuleren."
+"<br>Wilt u het opnieuw proberen?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Ongeldige opnamenmap."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Ongeldige tijdverschuivenmap."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "De poorten voor uitzending en info dienen verschillend te zijn."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Ongeldig uitzendadres."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB-instellingen"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Universeel LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Dual LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Enkelvoudige LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Dual LO-switch frequentie:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Lo-band frequentie:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Hi-band frequentie:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Enkelvoudige LO-frequentie:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Verticale pol. LO-frequentie:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Horizontale pol. LO frequentie:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Herstellen"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Kan de DVD-uitzendsocket niet openen."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Kan de DVB-uitzendsocket niet initialiseren."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Er zijn geen audiocoderingen gevonden."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Het laden van de codering '%1' is mislukt."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Kon deze map niet aanmaken:"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bytes"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Audio-cd"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "CD afspelen"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "CD rippen"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artiest:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Track"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Selecteer de tracks die u wilt rippen en klik op de knop <b>Coderen</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Coderen..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Audio-cd codering"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Audio-CD afspelen"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "DVD afspelen"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "VCD afspelen"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "&DVD openen"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "&VCD openen"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "&Audio-CD openen"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Selecteer eerst de tracks die u wilt rippen."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Meerdere audio-cd's gevonden. Selecteer er een:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Geen audio-cd gevonden."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD-video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Meerdere dvd-video's gevonden. Selecteer er een:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Meerdere (s)vcd's gevonden. Selecteer er een:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Geen titel"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Track %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Zoekt naar item in lokale CDDB..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Zoekt naar item in externe CDDB..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Vond een exacte overeenkomst in CDDB..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Vond een bijna-overeenkomst in CDDB..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB-overeenkomsten"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Meerdere geschikte CDDB-items gevonden. Selecteer er een:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Een Lame-gebaseerde mp3-codeerplugin voor Kaffeine"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Een Ogg Vorbis-gebaseerde codeerplugin voor Kaffeine"
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB-client"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Kan infosocket niet openen."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Kan infosocket niet binden."
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Kan socket niet openen."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Kan geen socketoptie instellen."
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Kan socket niet binden."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Alle groottes"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Zeer klein"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Klein"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Middel"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Goot"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Zeer groot"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nieuwe zoekopdracht"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+"De hoes die u hebt geselecteerd is niet beschikbaar. Selecteer een andere."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Hoes niet beschikbaar"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Hoesdownloader"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Geen overeenkomende afbeeldingen gevonden. Voer nieuwe zoektermen in:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Nieuwe zoektermen invoeren:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Afspelen"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Volgende afspelen/aan wachtrij toevoegen"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "&Alles selecteren"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Afspeellijst maken uit geselecteerde items"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Ondertiteling &toevoegen..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "Titel b&ewerken"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Info"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Lengte"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artiest"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Jaar"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Genre"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Ondertitels"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "in gebruik"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Ondertitelbestanden\n"
+"*.*|Alle bestanden"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Ondertitelingsbestand selecteren"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Kies een hoesafbeelding uit..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galerij..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filter"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Afspeellijst:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Selecteer de actieve afspeellijst. Om de naam te wijzigen: bewerk de naam en "
+"bevestig met 'Enter'."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Afspeellijst afspelen"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "He&rhalen"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Afspeellijst herhalen"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Willeke&urig"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Items in willekeurige volgorde afspelen"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Hoesafbeeldingen automatisch downloaden"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Hoesafbeeldingen automatisch downloaden"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "Huidige afspeellijst &wissen"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Nieu&we afspeellijst"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "Afspeellijst &importeren..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "Huidige afspeellijst op&slaan als..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Huidige afspeellijst ver&wijderen"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine-afspeellijsten"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Alle bestanden"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Afspeellijst openen"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U-afspeellijsten"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS-afspeellijsten"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Afspeellijst opslaan"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Afspeellijst"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NIEUW"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Mediabronnen worden geïmporteerd..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(geen ondertitels)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Andere ondertitel..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galerij"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Wachtrij: %1 items, speeltijd: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Items: %1, Speeltijd: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Wilt u werkelijk '%1' uit de lijst en van de schijf verwijderen?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Naam van afspeellijst bestaat reeds"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Voer andere naam voor afspeellijst in:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Ondertitel selecteren"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Mediabestand:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Film selecteren"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Ondertitelbestand:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Afspelen / pauzeren"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "V&olgende"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "De&mpen"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine Mediaspeler"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine Mediaspeler]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Wilbert Berendsen,Rinse de Vries"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "wilbert@kde.nl,rinsedevries@kde.nl"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Een mediaspeler voor KDE 3. Kan gebruik maken van verschillende backends voor "
+"het afspelen, standaard (en aanbevolen) is Xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, de auteurs van Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Huidige onderhouder"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Oorspronkelijke onderhouder"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM-ondersteuning"
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Diverse zeer gewaardeerde patches."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Patch voor DVB OSD-bladeren."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Patches voor DVB-categorieën."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logo voor Kaffeine 0.8 en ander grafisch werk."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Logo-animatie voor Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Alternatieve codering voor metatags. Vele patches."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Post-plugin afhandeling voor xine. Vele patches."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Importeren van ondertitels."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U import. Testen."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Ondertitelings-pid's bewerken"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Pid's van ondertiteling"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Nieuw item"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Omhoog"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Omlaag"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Geselectie bijwerken"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Nieuw"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Pagina:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Subpagina:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Taal:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Herhaalde timer"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Audio-pid's bewerken"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Audio-pid's"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Uitzending bewerken"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Beschikbare kanalen:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Lijst met uitzendingen:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Rechts klikken om te bewerken of verwijderen)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Nieuw..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Zoeken op"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Offset (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Scan starten"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filters"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Vrij in de lucht"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Provider:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Selectie toevoegen"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Gefilterde toevoegen"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Gevonden"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Klaar"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Kanaal bewerken"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polariteit"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frequentie:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Symboolsnelheid:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Gecodeerd"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Teletext-pid:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Dienst-pid:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Video-pid:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Transportstroom-id:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Ondertitelings-pid:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Audio-pid's..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Bandbreedte:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC hoog:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Transmissie:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC Laag:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Guardinterval:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hiërarchie:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulatie:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversie:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Codeervoorkeuren"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Codering:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Basismap:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Alle controles uitschakelen"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Normale modus"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoiamodus"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normaliseren"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD-balk"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Opties voor Lame-mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bitrate:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Opties voor Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Kwaliteit: "
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Afspeel&lijst"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Opties verlaten"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "S&peler"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "G&rootte automatisch instellen"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Uitzenden over &netwerk"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigatie"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD-menus"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Audio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Beeldverhouding"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Schermafdrukbalk"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Bedieningsbalk"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Volumebalk"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Positiebalk"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Instellingen voor Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Gedrag"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Video pauzeren indien geminimaliseerd"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Pictogram in systeemvak plaatsen"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sec"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "uit"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Tijdsduur waarmee titels in het systeemvak worden aangekondigd"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "DVB-client activeren"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Diverse instellingen"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Alternatieve codering (niet-Unicode) gebruiken voor metatags"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Kies een alternatieve codering voor metatags\n"
+"(om naar Unicode om te kunnen zetten)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Lijst \"recent geopend\" wissen"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Afspelen direct starten"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "In volledig scherm opstarten"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Audiostuurprogramma instellen"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Videostuurprogramma instellen"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Pad voor Audio-CD/VCD/DVD instellen."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Xine debugmeldingen weergeven"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Installatie-assistent uitvoeren"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Af te spelen bestand(en). Dit kunnen lokale mappen of bestanden zijn, "
+"URL-adressen of 'DVD', 'VCD', 'AudioCD'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Starten"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Afspelervenster"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Ondersteunde mediaformaten"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG-audiobestanden"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG-videobestanden"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis-bestanden"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI-bestanden"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime-bestanden"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media-bestanden"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska-bestanden"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC-bestanden"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media-bestanden"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV-bestanden"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Het laden van de afspeelcomponent '%1' is mislukt."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 niet gevonden in zoekpad."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "&URL-adres openen..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "&Map openen..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Afsluiten && monitor uitschakelen na deze track"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Afsluiten na dit nummer"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Afsluiten na afspeellijst"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimale modus"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Wissel afs&peellijst/speler"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Oorspronkelijke beeldverhouding beh&ouden"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Oorspronkelijke grootte"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Dubbele grootte"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Driedubbele grootte"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Afs&peelprogramma"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB-client"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Speler"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Hoofdvenster"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "De DPMS X-Server-extensie is niet gevonden."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Hiermee kunt u Kaffeine laten afsluiten en de monitor uitschakelen nadat het "
+"bestand of de afspeellijst afgespeeld is. De optie \"dpms\" moet zich in het "
+"X-configuratiebestand bevinden om de monitor uit te laten schakelen."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Bestand(en) openen"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "URL openen"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Voer een URL in:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Map openen"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Geen %1 in drive, of onjuist pad naar apparaat."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Selecteer de correcte drive:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 installatie-assistent"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Installatiecontrole"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ok."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Part niet gevonden. Controleer uw installatie!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Versie gevonden"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine heeft KDE >= %1 nodig."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 Codecs"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Geen WIN32 codecs gevonden in /usr/lib/win32. U kunt geen Windows Media "
+"9-bestanden, nieuwere Real Media-bestanden en sommige minder gebruikelijke "
+"formaten afspelen. Download de codecs hier:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss is niet gevonden. Hierdoor kunt u geen versleutelde (de meeste "
+"commerciële) DVD's afspelen. U kunt de bibliotheek hier downloaden (maar in "
+"sommige landen is het gebruik ervan niet legaal!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD-drive"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "DMA modus uit! Voor vloeiend afspelen van DVD's start als root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "Kan de DMA-modus niet vaststellen. Geen toegang of onbekend apparaat:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-apparaat"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Geen DVB-apparaten gevonden. De DVB-gerelateerde functies zullen worden "
+"verborgen."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distributie"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"De xine-lib van SUSE ondersteunt bepaalde mogelijkheden niet vanwege mogelijke "
+"softwarepatenten. Gebruik de plaketten hiervandaan:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "RESULTAAT"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+"Enkele problemen gevonden, maar Kaffeine zal waarschijnlijk wel werken."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Alles in orde!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Kaffeine als hulpprogramma gebruiken voor mms:// (Microsoft Media) streams"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Kaffeine als hulpprogramma gebruiken voor rtsp:// (Real Media en andere) "
+"streams"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Kaffeinepictogram op bureaublad plaatsen"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Installatieopties"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "De-interlace kwaliteit"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Zeer laag CPU-gebruik, slechtste kwaliteit.</b>"
+"<br/>De helft van de verticale resolutie gaat verloren. Bij systemen met PCI "
+"videokaarten kan dit het CPU-gebruik terugbrengen in vergelijking met normaal "
+"afspelen (zonder de-interlacing)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Laag CPU-gebruik, matige kwaliteit.</b>"
+"<br/>Het beeld wordt in verticale richting waziger gemaakt zodat de "
+"interlace-effecten niet optreden."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Gemiddeld CPU-gebruik, gemiddelde kwaliteit.</b>"
+"<br/>Het beeld wordt geanalyseerd en gebieden die interlacing-artefacten "
+"vertonen worden geïnterpoleerd."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Hoog CPU-gebruik, goede kwaliteit.</b>"
+"<br/>De conversie van het DVD-beeldformaat vergroot de kwaliteit en voorkomt "
+"het optreden van kleurfouten (chroma unsampling bug)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Zeer hoog CPU-gebruik en hoge kwaliteit.</b>"
+"<br/>Naast het gebruiken van intelligente deïnterlacingalgoritmes wordt de "
+"framesnelheid verdubbeld van 30 naar 60fps. Eventuele \"3-2 pulldown\"-bugs "
+"worden gedetecteerd en verholpen. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Uiterst hoog CPU-gebruik, hoge kwaliteit met (experimentele) "
+"verbeteringen.</b>"
+"<br/>Schakelt juddercorrectie in (speelt films af met de originele 24fps "
+"snelheid) en de kleuren worden in verticale richting vloeiender gemaakt "
+"(waardoor smalle kleurstrepen in sommige DVD's worden onderdrukt). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Gebruikergedefinieerd"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Tvtime-deïnterlaceplugin instellen..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Vereist mogelijk een gepatchte 2.4 kernel (zoals die van RedHat) of een "
+"2.6 kernel.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Tvtime de-interlace plugin instellen"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Effectplugins"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Audio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Audiofilters"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Audiofilters inschakelen"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Filter toevoegen"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Alle filters verwijderen"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Videofilters"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Videofilters inschakelen"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Instellingen xine-engine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 opties"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Beginnersinstellingen"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Geavanceerde instellingen"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Een xine-gebaseerde afspeelmodule voor Kaffeine"
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL (Synchronized Multimedia Integration Language)-ondersteuning is "
+"rudimentair!\n"
+"XinePart kan proberen de inliggende videobronnen af te spelen zonder verdere "
+"opmaak. Wilt u doorgaan?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Stream opslaan als"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Ondertitel"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Audiokanaal"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 van %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-bestand\n"
+"*.bmp|BMP-bestand\n"
+"*.xbm|XBM-bestand"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Schermafdruk opslaan als"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Poort voor uitzenden:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Ontvangen van uitzendingsstream instellen"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Afzenderadres:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Poort:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Springen naar positie:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine Fout"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine-melding"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Klaar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Afspelen"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Ondertitelbestand"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Stream opslaan als"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Trackinfo"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "URL naar klembord kopiëren"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Afspelen in externe Kaffeine"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Uitzendingsstream verzenden..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "Uitzendingsst&ream ontvangen..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Schermafdruk opslaan..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Stream opslaan..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Slaat de huidige stream op naar schijf. Deze functie is voor sommige formaten "
+"uitgeschakeld (zoals Real Media) om potentiele legale problemen te voorkomen."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Minimale modus aan/uit"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pauzeren"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "Snel &vooruit"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Slow&motion"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Vooruit spoelen (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Terug spoelen (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Vooruit spoelen (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Terug spoelen (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Vooruit spoelen (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Terug spoelen (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Naar positie springen..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "(DVD-menu) Links"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "(DVD-menu) Rechts"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "(DVD-menu) Omhoog"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "(DVD-menu) Omlaag"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "(DVD-menu) Selecteren"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Audiokanaal"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Audiokanaal selecteren"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Audio-&visualisatie"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Volume omhoog"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Volume omlaag"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&De-interlace"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+"Schakel dit in voor mediastream die interlaced zijn, zoals sommige DVD's."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Automatisch"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorph"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "V&ierkant"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Horizontaal inzoomen"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Horizontaal uitzoomen"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Verticaal inzoomen"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Verticaal uitzoomen"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "De-interlace &kwaliteit"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Video-instellingen"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Equalizer"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Menu omschakelen"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Titel"
+
+# FIXME??
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Hoofd"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Subafbeelding"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Hoek"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Deel"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Titels"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Hoofdstukken"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Hoeken"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Info over nummer"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Effect&plugins..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Instellingen voor &xine-engine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volume"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Positie"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Korte klik: Wissel timer vooruit/achteruit\n"
+"Lange klik: Wissel timer OSD"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Speeltijd"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Bezig CDDB-ingangen te zoeken..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Audio-cd-track %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD-track %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Video-instellingen"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Tint"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Verzadiging"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Contrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Helderheid"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Tijdsverschil audio/video"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Tijdsverschil ondertitels"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "automatisch"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Waarschuwing: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Geen informatie beschikbaar."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Veiligheidswaarschuwing: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Kan de computer waarmee u wilt verbinden niet vinden.\n"
+"Controleer de opgegeven hostnaam. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Ongeldige apparaatnaam opgegeven. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Het netwerk is onbereikbaar.\n"
+"Controleer de instellingen en de servernaam. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Audio uitvoer is niet beschikbaar. Het audioapparaat is in gebruik. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"De verbinding werd geweigerd.\n"
+"Controleer de hostnaam. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"Kan het gevraagde bestand of de URL niet vinden. Controleer of u het correct "
+"hebt opgegeven. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Kan geen toegang tot deze bron verkrijgen. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Kan deze bron niet lezen.\n"
+"Mogelijk hebt u niet voldoende toegangsrechten, of de bron is leeg "
+"(bijvoorbeeld: DVD vergeten te plaatsen). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Er trad een fout op bij het laden van een bibliotheek of decoder: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "De bron is versleuteld en kan niet worden gelezen. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Deze DVD is waarschijnlijk versleuteld. Afhankelijk van wettelijke bepalingen "
+"in uw land is het wel of niet toegestaan libdvdcss te gebruiken voor het "
+"ontcijferen."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Onbekende fout: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Fout: kan nieuw videostuurprogramma %1 niet initialiseren, %2 wordt gebruikt!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Gebruikt videostuurprogramma: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Fout: kan nieuw audiostuurprogramma %1 niet initialiseren, %2 wordt gebruikt!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Gebruikt audiostuurprogramma: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Initialiseren van xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Kan de xine-engine niet initialiseren!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Te gebruiken audiostuurprogramma (standaard: automatisch)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Te gebruiken videostuurprogramma (standaard: automatisch)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Software audiomixer gebruiken"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "OSD-berichten weergeven"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Grootte van OSD-tekst"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Lettertype van OSD-tekst"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"Kan videostuurprogramma '%1' niet initialiseren - probeer nu 'automatisch'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Geen enkel videostuurprogramma kon worden geïnitialiseerd!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"Kan audiostuurprogramma '%1' niet initialiseren - probeer nu 'automatisch'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Geen enkel audiostuurprogramma kon worden geïnitialiseerd!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Kan geen nieuwe xinestream aanmaken!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: bezig te openen..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Bezig te openen..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Audiocodec"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Videocodec"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Geen plugin gevonden voor deze bron"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Bron lijkt beschadigd"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Gevraagde bron bestaat niet"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Bron kan niet worden geopend"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Algemene fout"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Niet gedempt"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Gedempt"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Snel verder %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Slowmotion %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Deïnterlace: aan"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Deïnterlace: uit"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Beeldverhouding"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Automatisch"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "X zoomen"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Y zoomen"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msec"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Equalizerinstellingen"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Volumeversterking"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Volumeversterking voor de equalizer - als er ruis optreedt kunt u dit "
+"uitschakelen"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Filter verwijderen"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Zoekend naar %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Initialiseren van GStreamer is mislukt."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Dempen"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Toelichting"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parameters voor &GStreamerengine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer kon niet worden geïnitialiseerd"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"GStreamerregister ontbreekt. Hebt u het commando <b>gst-register</b> "
+"(als root) uitgevoerd na de installatie?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"Kan geluidsstuurprogramma '%1' niet initialiseren - probeert een andere..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Geen bruikbaar geluidsstuurprogramma gevonden"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"Kan videostuurprogramma '%1' niet initialiseren - probeert nu een andere..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Geen bruikbaar videostuurprogramma gevonden"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parameters voor GStreamerengine"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Geluidsopties"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Geprefereerd geluidsstuurprogramma"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Video-opties"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Geprefereerd videostuurprogramma"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* herstart vereist"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Mediaopties"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD-station"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
diff --git a/po/nn.po b/po/nn.po
new file mode 100644
index 0000000..3595d6a
--- /dev/null
+++ b/po/nn.po
@@ -0,0 +1,3316 @@
+# Translation of kaffeine to Norwegian Nynorsk
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Karl Ove Hufthammer <karl@huftis.org>, 2004, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-06-17 19:29+0200\n"
+"Last-Translator: Karl Ove Hufthammer <karl@huftis.org>\n"
+"Language-Team: Norwegian Nynorsk <i18n-nn@lister.ping.uio.no>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Oppdater"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Planlagd"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "No og neste"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Start"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Lengd"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Tittel"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Sjå alle program"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Legg til opptaksplanar"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Namn:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Start:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Lengd:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Slutt:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Ta opp som:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Ingen"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Dagleg"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Vekentleg"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Månadleg"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Sjølvvald"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Gjenta …"
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Opptaksplanar"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Du må gje det eit namn."
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Opptaket må vara minst eitt minutt."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"Namnet kan ikkje innehelda teikna «>», «<», «\\», «/», «:», «\"» eller «|»."
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Standard transponderval"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Namnet er ikkje unikt."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Manglar lyd-PID(ar)."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "PID-en kan ikkje vera null."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Du må velja nokre dagar."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanalar"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Opptaksplanar"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronisk programgaid"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "Skjermmeldingar"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB-oppsett"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Nummer"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Namn"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Lydkanalar"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Direkteopptak"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Kringkasting"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Tidsskifte"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Tek opp"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Kringkasting"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Vel ikon …"
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Vel kanalikon"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digitalfjernsyn"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Direkte digital-TV fungerer berre med xine-motoren."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD Neste kanal"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD Førre kanal"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Zapp"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD Neste hending"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD Førre hending"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Vis skjermmeldingar"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG …"
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Opptaksplanar …"
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Kringkasting …"
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanalar …"
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Set opp DVB …"
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Alt"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "Fjernsyn"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Ny kategori …"
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Endra ikon …"
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Slett kategori …"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Ny kategori"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Skriv inn namnet på kategorien:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Er du sikker på at du vil sletta denne kategorien?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Klarte ikkje henta DVB-data frå http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t\t\tSjå til at Internett-sambandet fungerer og prøv på nytt."
+"<br>\t\t\tViss du allereie har dette arkivet, kan du kopiera det til "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz og så svara «Ja»."
+"<br>"
+"<br>Vil du prøva på nytt?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Feil ved kringkasting."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Kan ikkje starta kringkasting."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Opptaksplanen er lagt til og starta."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Du bør definera nokre kanalar først."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Opptaksplanen er lagt til."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Tek framleis opp."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Kringkastar framleis."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Klarte ikkje stilla inn DVB."
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Klarte ikkje setja PID-ar."
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Ingen ledig CAM."
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr ""
+"Kaffeine held framleis på å ta opp. Er du sikker på at du vil avslutta?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Kaffeine har gjenståande opptaksplanar. Er du sikker på at du vil avslutta?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Lås:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Rediger …"
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Er du sikker på at du vil sletta alle kanalane?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Start søk"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Stopp søk"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Stoppar …"
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Fann: %1 fjernsyn – %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Klarte ikkje opna DVB-infosokkel."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Opptaksplanar:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Ny"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Stopp/slett"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Opptaksplanen vert gjenteken. Vil du hoppa over gjeldande jobb eller sletta "
+"opptaksplanen?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Hopp over"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Vil du sletta opptaksplanen?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Lastar ned …"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Kopierer datafiler …"
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB-oppsett"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB-eining"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Einingsoppsett"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Namn:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Type:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kabel"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Bakkesendt"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Parabol"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr ""
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Ukjend"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Talet på LNB-ar:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1. sat.:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB-oppsett …"
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2. sat.:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3. sat.:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4. sat.:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB-oppsett …"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Kjelde:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Denne eininga ser ut til å støtta <b><i>autosøk</i></b>"
+"-funksjonen. Du kan velja <b>AUTO</b> i kjeldelista for å la Kaffeine søkja "
+"gjennom frekvensområda."
+"<br>Viss <b><i>autosøket</i></b> ikkje finn kanalane dine, må du velja ei anna "
+"kjelde.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Viss du ikkje finn nettverket eller plasseringa di i lista, må du laga "
+"ei ny liste sjølv. Sjå i <b>$HOME/.kde/share/apps/kaffeine/dvb-x/</b> "
+"og bruk éi av filene der som utgangspunkt. Fyll inn verdiane for "
+"nettverket/plasseringa di, og gje fila eit fornuftig namn (bruk same namneform "
+"som for dei andre filene). Viss fila di vil vera nyttig for andre òg, kan du "
+"senda ho til <b>kaffeine-user@lists.sf.net</b>.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB-opptaksval"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Opptaksmappe:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Tidsskiftemappe:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Startslingringsmonn:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minutt)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Sluttslingringsmonn:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Lengd på direkteopptak:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Føretrekt format:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB-kringkasting"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Kringkastingsadresse:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Kringkastingsport:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Infoport:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Ymse"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Standardteiknkoding (treng omstart):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Oppdater skannedata:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Last ned"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Loggfør EPG-hendingar til\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Loggfør"
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "DVB-klient"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Klarte ikkje henta DVB-data frå http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t\t\tSjå til at Internett-sambandet fungerer og prøv på nytt."
+"<br>Vil du prøva på nytt?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Ugyldig opptaksmappe."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Ugyldig tidsskiftemappe."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Kringskastings- og infoportane må vera forskjellige."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Ugyldig kringkastingsadresse."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB-oppsett"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Universell LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Dobbel-LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Enkel-LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Svitsjfrekvens for dobbel-LO:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Lågbandsfrekvens:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Høgbandsfrekvens:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Svitsjfrekvens for enkel-LO:"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "Svitsjfrekvens for enkel-LO:"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "Svitsjfrekvens for enkel-LO:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Nullstill"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Klarte ikkje opna DVB-kringkastingssokkel."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Klarte ikkje starta DVB-kringkastingssokkel."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Fann ingen lydkodarar."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Klarte ikkje henta lydkodaren «%1»."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Klarte ikkje oppretta mappa: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "byte"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Lyd-CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Spel CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Ta opp frå CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artist:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Spor"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "Merk spora du ønskjer å ta opp, og trykk så på <b>Ta opp</b>-knappen."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Ta opp …"
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Lyd-CD-opptak"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Spel lyd-CD"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Spel DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Spel VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Opna &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Opna &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Opna &lyd-CD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Du må merkja spora du ønskjer å ta opp."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Fann fleire lyd-CD-ar. Vel éin av dei:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Fann ingen lyd-CD."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD-film"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Fann fleire DVD-filmar. Vel éin av dei:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Fann fleire (S)VCD-ar. Vel éin av dei:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Utan tittel"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Spor %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Søker gjennom lokal CDDB-database …"
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Søker gjennom CDDB-database på nettet …"
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Fann korrekt CDDB-oppføring …"
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Fann liknande CDDB-oppføring …"
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Fann fleire DVD-filmar. Vel éin av dei:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Eit LAME-basert MP3-lydkodartillegg for Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Eit Ogg Vorbis-lydkodartillegg for Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB-klient"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Klarte ikkje opna infosokkel."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Klarte ikkje binda til infosokkel."
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Klarte ikkje opna sokkel."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Klarte ikkje setja sokkelval."
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Klarte ikkje binda til sokkel."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Alle storleikar"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Veldig liten"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Liten"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Mellomstor"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Stor"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Veldig stor"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nytt søk"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Omslaget du har valt er ikkje tilgjengeleg. Vel eit anna."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Omslag ikkje tilgjengeleg"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Last ned omslag"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Fann ingen bilete. Prøv med andre søkeord:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Skriv inn nye søkeord:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Spel"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Spel etterpå"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Merk &alle"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Lag speleliste frå utval"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Legg til &undertekst …"
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Rediger tittel"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Informasjon"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Lengd"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "Nettadresse"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artist"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "År"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Sjanger"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Teksting"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "i bruk"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Tekstefil\n"
+"*.*|Alle filer"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Vel undertekstfil"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Vel omslag …"
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galleri …"
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filter"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Speleliste:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Vel aktiv speleliste. Du kan så endra namnet på spelelista og avslutta med "
+"«Enter»."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Spel speleliste"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Gjenta"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Gjenta speleliste"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Tilfeldig rekkjefølgje"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Spel elementa i tilfeldig rekkjefølgje"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "&Fjern speleliste"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "N&y speleliste"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importer speleliste …"
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Lagra speleliste som …"
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "&Fjern speleliste"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine-spelelister"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Alle filer"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Opna speleliste"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U-spelelister"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS-speleliste"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Lagra speleliste"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Speleliste"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NY"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importerer medieressursar …"
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(ingen teksting)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Anna teksting …"
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galleri"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Kø: %1 oppføringar. Speletid: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Oppføringar: %1. Speletid: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Vil du fjerna «%1» frå lista og frå disken?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Det finst allereie ei speleliste med dette namnet."
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Skriv inn namnet på den nye spelelista:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Vel undertekst"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Mediefil:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Vel film"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Tekstfil:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Spel / pause"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Neste"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Demp"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine mediespelar"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine mediespelar]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Karl Ove Hufthammer"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "karl@huftis.org"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Ein mediespelar for KDE 3. Kan bruka fleire avspelingsmotorar (standard og "
+"tilrådd er xine)."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "© 2003–2005 Kaffeine-utviklarane"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Noverande vedlikehaldar."
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Opphavleg forfattar."
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM-støtte."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Fleire verdfulle rettingar."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "DVB OSD-lesingsretting."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "DVB-kategorirettingar."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logo for Kaffeine 0.8, samt andre bilete."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Logoanimasjon for Kaffeine 0.5."
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Alternativ teiknkoding for metainformasjon. Mange rettingar."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Handtering av etterbehandlingsfilter til xine. Mange rettingar."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Importering av tekstfiler."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U-importering. Testing."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Undertekst-PID-redigering"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Undertekst-PID-ar"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Nytt element"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Flytt opp"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Flytt ned"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Oppdater valde"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Ny"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Side:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Underside:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Språk:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Gjenteken opptaksplan"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Lyd-PID-redigering"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Lyd-PID-ar:"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Kringkastingsredigering"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Tilgjengelege kanalar:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Kringkastingsliste:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Høgreklikk for å redigera eller sletta)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Ny …"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Søk på:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Forskyving (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Start søk"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filter"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Gratiskanal"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Leverandør:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Legg til valde"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Legg til filtrerte"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Fann"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "SNR"
+msgstr "SNR:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Ferdig"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Kanalredigering"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr.:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaritet"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frekvens:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Datafart:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Kryptert"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Tekst-TV-PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Teneste-ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Video-PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Transportstraum-ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Undertekst-PID-ar …"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Lyd-PID-ar …"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Bandbreidd:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC høg:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Sending:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC låg:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Tryggingsmargin:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarki:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulering:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversjon:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Kodingsinnstillingar"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Kodar:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Grunnmappe:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr " …"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Slå av alle kontrollar"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Normalmodus"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoia-modus"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normaliser"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD-verktøylinje"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "LAME-baserte MP3-val"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bitrate:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis-val"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Kvalitet:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Spele&liste"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Avsl&uttingsval"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "S&pelar"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Bruk &autoskalering"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Nettverks&kringkasting"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigering"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD-menyar"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Lyd"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Film"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Høgd- og breiddforhold"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Skjermbileteverktøylinje"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Kontrollverktøylinje"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Volumverktøylinje"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Posisjonsverktøylinje"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Oppsett "
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Åtferd"
+
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "Stopp filmavspeling mellombels ved minimering"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "&Legg i systemtrauet"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " s"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "Av"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Kor lenge tittelvarslinga skal visast i systemtrauet"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Bruk DVB-klient"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Ymse val"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "B&ruk alternativ teiknkoding (ikkje Unicode) for metainformasjon"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Vel alternativ teiknkoding\n"
+"(for konvertering til Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Tøm liste over nyleg brukte filer"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Spel av med ein gong"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Start i fullskjermsmodus"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Bruk som lyddrivar"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Bruk som filmdrivar"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Vel adresse til lyd-CD, VCD og DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Skriv feilsøkjingsinformasjon frå xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Køyr oppsettvegvisar"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Fil(er) å spela. Dette kan vera ei lokal fil, ei nettadresse, ei mappe eller "
+"«DVD», «VCD» eller «AudioCD»."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Start"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Spelarvindauge"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Støtta medieformat"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG-lydfiler"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG-filmfiler"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis-filer"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI-filer"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "QuickTime-filer"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media-filer"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska-filer"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC-filer"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media-filer"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV-filer"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Klarte ikkje henta spelardelen «%1»."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "Fann ikkje «%1» i søkjestigen."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Opna &nettadresse …"
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Opna &mappe …"
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "&Avslutt og slå av skjermen etter dette sporet"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "A&vslutt etter dette sporet"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Av&slutt etter speleliste"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimalmodus"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "&Byt mellom speleliste og spelar"
+
+#: kaffeine.cpp:710
+#, fuzzy
+msgid "Keep &Original Aspect"
+msgstr "Behald &høgd/breidd-forhold"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Opphavleg storleik"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Dobbel storleik"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Trippel storleik"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Avspelingsmotor"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB-klient"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Spelar"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Hovudvindauge"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS-utviding i X-tenar ikkje støtta."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Dette vil avslutta Kaffeine og slå av skjermen etter at fila/spelelista er "
+"ferdigspelt. Du må ha valet «dpms» i oppsettfila for X for at dette skal "
+"fungera."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Opna fil(er)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Opna nettadresse"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Skriv inn nettadressa:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Opna mappe"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr ""
+"Anten har du ingen %1 i stasjonen, eller så er adressa til stasjonen feil."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Vel rett stasjon:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1-oppsettvegvisar"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Oppsettkontroll"
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "Oppsett "
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "OK"
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Fann ikkje delen. Kontroller at installeringa er rett."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Fann versjon"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine treng KDE ≥ %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Win32-kodekar"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Fann ingen Win32-kodekar i /usr/lib/win32. Du kan ikkje spela av Windows Media "
+"9-filer, nyare Real Media-filer og visse sjeldan brukte format. Du kan lasta "
+"ned dei aktuelle kodekane her:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"Fann ikkje libdvdcss. Du kan ikkje spela av krypterte DVD-ar (dei fleste "
+"kommersielle DVD-ane er det). Du finn biblioteket her (men det kan vera ulovleg "
+"der du er):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD-stasjon"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"DMA-modus er avslått. For jamn DVD-avspeling bør du køyra følgjande kommando "
+"som «root»:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Klarte ikkje sjekka DMA-modus. Anten har du ikkje løyve til dette, eller så "
+"finst ikkje eininga:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-eining"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "Fann ingen DVB-einingar. DVB-funksjonane vert ikkje vist."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Fordeling"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"Det kan henda xine-lib-biblioteket som følgjer med SuSE manglar visse "
+"funksjonar grunna juridiske patentproblem. Du bør heller bruka pakkane her:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "RESULTAT"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Fann nokre problem, men Kaffeine vil gjerne fungera fint likevel."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Alt er OK."
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Bruk Kaffeine som hjelpeprogram for «mms://»-straumar (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Bruk Kaffeine som hjelpeprogram for «rtsp://»-straumar (Real Media og andre)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Legg Kaffeine-ikon på skrivebordet"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Installeringsval"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Flettekvalitet"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Veldig låg ressursbruk – lågast kvalitet</b>"
+"<br>Halvparten av den loddrette oppløysinga går tapt. På nokre maskiner (med "
+"PCI-baserte skjermkort) kan dette redusera prosessorbruken i forhold til "
+"avspeling utan linjefletting."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Låg ressursbruk – låg kvalitet</b>"
+"<br>Biletet vert glatta ut loddrett for å fjerna eventuell "
+"linjeflettingseffekt."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Middels ressursbruk – middels kvalitet</b>"
+"<br>Biletet vert analysert, og eventuelle område med synleg "
+"linjeflettingseffekt vert fiksa (interpolert)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Høg ressursbruk – høg kvalitet</b>"
+"<br>Omforming av DVD-biletformatet forbetrar kvaliteten og løyser "
+"fargemetningsproblem."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Veldig høg ressursbruk – veldig høg kvalitet</b>"
+"<br>I tillegg til avanserte linjeflettingsalgoritmar vert òg biletfrekvensen "
+"dobla (frå 30 til 60 bilete i sekundet) for å samsvara med feltfrekvensen til "
+"fjernsynsapparat. Oppdagar og gjer om «3:2 pulldown». *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Ekstra høg ressursbruk – ekstra høg kvalitet (eksperimentell)</b>"
+"<br>Utbetrar risting (spelar filmar i originalfarten på nøyaktig 24 bilete i "
+"sekundet), og glattar ut fargar loddrett (dette fiksar små fargestripar ein kan "
+"sjå på nokre DVD-ar). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Sjølvvalt"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Set opp tvtime-flettetillegg …"
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Krev kanskje endra 2.4-kjerne (som den til Red Hat) eller 2.6-kjerne.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Set opp tvtime-tillegget"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Effekttillegg"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Lyd"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Lydfilter"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Bruk lydfilter"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Legg til filter"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Fjern alle filtra"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Film"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Filmfilter"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Bruk filmfilter"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Set opp xine-motoren"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1-val"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Enkle val"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Ekspertval"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "Kaffeine-del"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Ein xine-basert avspelardel for Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+#, fuzzy
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Støtta for SMIL (Synchronized Multimedia Integration Language) er langt frå "
+"ferdigutvikla.\n"
+"Kaffeinepart kan prøva å spela av filmkjelder utan noko oppsett. Vil du halda "
+"fram?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Lagra straum som"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Teksting"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Lydkanal"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 av %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-fil\n"
+"*.bmp|BMP-fil\n"
+"*.xbm|XBM-fil"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Lagra skjermbilete som"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Kringkastingsport:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Set opp mottak av kringkastingsstraum"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Avsendaradresse:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Hopp til posisjon:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine-feil"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine-melding:"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Klar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Spelar"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME-type"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Tekstfil"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Lagra straum som"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "Spor&info"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Kopier adresse til utklippstavla"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Spel av i Kaffeine eksternt"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Send kringkastingsstraum …"
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Motta kringkastingsstraum …"
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "Lagra &skjermbilete …"
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Lagra straum …"
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Lagrar straumen til harddisken. Denne funksjonen er slått av for nokre format "
+"(som Real Media) grunna potensielle juridiske vanskar."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "&Minimalmodus"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pause"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Spol fram"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Sakte &kino"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Spol fram (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Spol bakover (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Spol fram (1 m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Spol bakover (1 m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Spol fram (10 m) "
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Spol bakover (10 m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Hopp til posisjon …"
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD-meny: venstre"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD-meny: høgre"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD-meny: opp"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD-meny: ned"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD-meny: vel"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Lydkanal"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Vel lydkanal"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Lyd&bilete"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Høgare lyd"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Lågare lyd"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Linjefletting"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Slå på dette for linjefletta medium, som nokre DVD-ar."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Automatisk"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorft"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Kvadratisk"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Forstørr vassrett"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Forminsk vassrett"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Forstørr loddrett"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Forminsk loddrett"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Flette&kvalitet"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Film&oppsett"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "Lydb&alanse"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Slå av/på &meny"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Tittel"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Rot"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "Del&bilete"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Vinkel"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Del"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Titlar"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Kapittel"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Vinklar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Spor&info"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Effekttillegg …"
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Set opp &xine-motoren"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volum"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Posisjon"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Kort klikk: Byt mellom gjenståande og gått tid.\n"
+"Langt klikk: Vis/skjul skjermmeldingar."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Speletid"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Ser etter CDDB-oppføringar …"
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Lyd-CD-spor %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD-spor %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Filmoppsett"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Fargetone"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Metning"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Lysstyrke"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Lyd/bilet-forskyving"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Forskyving av undertekst"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "Automatisk"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Generell åtvaring: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Ingen informasjon tilgjengeleg."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Tryggleiksåtvaring: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Du prøver å nå ein ukjend vert.\n"
+"Kontroller at vertsnamnet er gyldig. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Du oppgav eit ugyldig einingsnamn. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Nettverket er utilgjengeleg.\n"
+"Kontroller nettverksoppsettet og namnet på tenaren. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Lydavspeling er utilgjengeleg. Eininga er oppteken. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Tilkoplinga vart avvist.\n"
+"Kontroller vertsnamnet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Fann ikkje valt fil- eller nettadresse. Kontroller at ho er rett. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Nekta tilgang til kjelda. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Klarte ikkje lesa frå kjelda.\n"
+"Dette kan vera fordi du ikkje har løyve til å lesa frå kjelda, eller at ho "
+"ikkje inneheld data (til dømes inga plate i stasjonen). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Det oppstod ein feil ved lasting av bibliotek eller dekodar: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Kjelda er kryptert, og kan derfor ikkje lesast. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"DVD-en er truleg kryptert, men om lovverket i landet ditt tillèt det, kan du "
+"bruka libdvdcss til å lesa han. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Ukjend feil: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Feil: Klarte ikkje starta filmdrivaren «%1». Brukar heller «%2»."
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Brukar filmdrivar: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Feil: Klarte ikkje starta lyddrivaren «%1». Brukar heller «%2»."
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Brukar lyddrivar: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Startar xine …"
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Klarte ikkje starta xine-motoren."
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Bruk lyddrivaren (standard: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Bruk filmdrivaren (standard: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Bruk programbasert lydmiksar"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Vis skjermmeldingar"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Skriftstorleik for skjermmeldingar"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Skrift for skjermmeldingar"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Feil: Klarte ikkje starta filmdrivaren «%1». Prøver med «auto» …"
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Klarte ikkje starta nokon filmdrivar."
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Feil: Klarte ikkje starta lyddrivaren «%1». Prøver med «auto» …"
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Klarte ikkje starta nokon lyddrivar."
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Klarte ikkje laga xine-straum."
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: opnar …"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Opnar …"
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Lydkodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Filmkoding"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Fann ikkje programtillegg for denne medietypen"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Ressursen er øydelagd"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Ressursen finst ikkje"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Klarte ikkje opna ressursen"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Genrell feil"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Lyd på"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Lyd av"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Spol fram %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Sakte kino %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Linjefletting: på"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Linjefletting: av"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Høgd- og breiddforhold"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Automatisk"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Forstørr X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Forstørr Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Lydbalanse"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Lydforsterking"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "Slå av lydforsterkinga viss lyden vert uklar med forsterkinga på."
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Slett filter"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Søkjer til %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Klarte ikkje starta GStreamer."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamer-del"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Demp"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Merknad"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parametrar for &GStreamer-motoren"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "Klarte ikkje starta GStreamer."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Manglar GStreamer-register. Har du gløymt å køyra <b>gst-register</b> "
+"(som rot) etter installering?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Klarte ikkje starta lyddrivaren «%1». Prøver ein annan …"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Fann ingen brukbar lyddrivar."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Klarte ikkje starta filmdrivaren «%1». Prøver ein annan …"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Fann ingen brukbar filmdrivar."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parametrar for GStreamer-motoren"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Lydval"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Føretrekt lyddrivar"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Filmval"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Føretrekt filmdrivar"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Treng omstart."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Medium"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Medieval"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD-/VCD-/DVD-stasjon"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Eksempel-del"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Desse kanalane finst allereie, og vart ikkje lagt til:"
+
+#~ msgid "No player"
+#~ msgstr "Ingen spelar"
+
+#~ msgid "No layer"
+#~ msgstr "Ingen lag"
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "Viss du lukkar hovudvindauget, vil Kaffeine halda fram i systemtrauet. Vel «Avslutt» frå «Fil»-menyen for å avslutta programmet."
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Klarte ikkje kopla til X-tenaren."
+
+#~ msgid "Alternate Layout"
+#~ msgstr "Alternativ utsjånad"
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "Kaffeine-del"
+
+#~ msgid "Ch %1"
+#~ msgstr "Kanal %1"
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-C"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-T"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-S"
+
+#~ msgid "Open Files"
+#~ msgstr "Opna filer"
+
+#~ msgid "Open Directory"
+#~ msgstr "Opna mappe"
+
+#~ msgid "Open DVD"
+#~ msgstr "Opna DVD"
+
+#~ msgid "Open VCD"
+#~ msgstr "Opna VCD"
+
+#~ msgid "Developer"
+#~ msgstr "Utviklar."
+
+#~ msgid "DVB Support"
+#~ msgstr "DVB-støtte."
+
+#~ msgid " min"
+#~ msgstr " min"
+
+#~ msgid ""
+#~ "Interval to fake keypresses\n"
+#~ "(prevent screensaver from activating)"
+#~ msgstr ""
+#~ "Intervall mellom automatiske «tastetrykk»\n"
+#~ "(for å hindra skjermspararen å starta)"
+
+#~ msgid "Create Go!-Tab"
+#~ msgstr "La&g «Start»-fane"
+
+#~ msgid "This player doesn't support DVD playback."
+#~ msgstr "Denne spelaren støttar ikkje DVD-avspeling."
+
+#~ msgid "This player doesn't support VCD playback."
+#~ msgstr "Denne spelaren støttar ikkje VCD-avspeling."
+
+#~ msgid "This player doesn't support Audio CD playback."
+#~ msgstr "Denne spelaren støttar ikkje lyd-CD-avspeling."
+
+#~ msgid "Name must not start with ( > )!"
+#~ msgstr "Namnet kan ikkje starta med ein «>»."
+
+#~ msgid "Audio:"
+#~ msgstr "Lyd:"
+
+#~ msgid "Playlist Toolbar"
+#~ msgstr "Spelelisteverktøylinje"
+
+#~ msgid "Channels Toolbar"
+#~ msgstr "Kanalverktøylinje"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Vel speleliste"
+
+#~ msgid "&Next in Playlist/Queue"
+#~ msgstr "&Neste i speleliste/kø"
+
+#~ msgid "Pre&vious in Playlist"
+#~ msgstr "&Førre i speleliste"
+
+#~ msgid "Next Channel"
+#~ msgstr "Neste kanal"
+
+#~ msgid "Previous Channel"
+#~ msgstr "Førre kanal"
+
+#~ msgid "Go!"
+#~ msgstr "Start"
+
+#~ msgid "Kaffeine Playlist"
+#~ msgstr "Kaffeine-speleliste"
+
+#~ msgid "Undock"
+#~ msgstr "Losna"
+
+#~ msgid "Undock Playlist Window"
+#~ msgstr "Losna spelelistevindauge."
+
+#~ msgid "Dock"
+#~ msgstr "Fest"
+
+#~ msgid "Dock Playlist Window"
+#~ msgstr "Fest spelelistevindauge"
+
+#~ msgid "Browse Next"
+#~ msgstr "Bla gjennom neste"
+
+#~ msgid "Browse Previous"
+#~ msgstr "Bla gjennom førre"
+
+#~ msgid "Browse Zap"
+#~ msgstr "Gå til"
+
+#~ msgid "Browse Forward"
+#~ msgstr "Bla framover"
+
+#~ msgid "Browse Backward"
+#~ msgstr "Bla bakover"
diff --git a/po/pa.po b/po/pa.po
new file mode 100644
index 0000000..d6779e3
--- /dev/null
+++ b/po/pa.po
@@ -0,0 +1,3103 @@
+# translation of kaffeine.po to Panjabi
+#
+# Amanpreet Singh Alam <aalam@redhat.com>, 2005.
+# Amanpreet Singh Brar <aalam@redhat.com>, 2005.
+# A S Alam <aalam@redhat.com>, 2006.
+# A S Alam <apbrar@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-12-11 22:11+0530\n"
+"Last-Translator: A S Alam <apbrar@gmail.com>\n"
+"Language-Team: Panjabi <pa@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "ਤਾਜ਼ਾ"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "ਤਹਿ-ਸਮਾਂ"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "ਮੌਜੂਦਾ/ਅੱਗੇ"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "ਚੈਨਲ"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "ਸ਼ੁਰੂ"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "ਅੰਤਰਾਲ"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "ਸਿਰਲੇਖ"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "ਸਭ ਪਰੋਗਰਾਮ ਵੇਖਾਓ"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "ਟਾਇਮਰ ਵਿੱਚ ਸ਼ਾਮਲ"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "ਨਾਂ :"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "ਚੈਨਲ :"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "ਸ਼ੁਰੂ :"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "ਅੰਤਰਾਲ:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "ਅੰਤ: "
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "ਰਿਕਾਰਡ:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "ਕੋਈ ਨਹੀਂ"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "ਨਿੱਤ"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "ਹਫ਼ਤਾਵਾਰ"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "ਮਹੀਨੇਵਾਰ"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "ਪਸੰਦੀਦਾ"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "ਦੁਹਰਾਓ ..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "ਟਾਇਮਰ ਸੰਪਾਦਕ"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "ਤੁਹਾਨੂੰ ਇਸ ਨੂੰ ਨਾਂ ਦੇਣਾ ਚਾਹੀਦਾ ਹੈ!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "ਅੰਤਰਾਲ 1 ਮਿੰਟ ਤੋਂ ਘੱਟ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "ਨਾਂ ਵਿੱਚ ਅੱਗੇ ਦਿੱਤਾ ਕੋਈ ਅੱਖਰ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ> < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "ਸ਼ੁਰੂਆਤੀ ਟਰਾਂਸਪੋਡਰ ਸਥਾਪਨ"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "ਇਹ ਨਾਂ ਵਿਲੱਖਣ ਨਹੀਂ ਹੈ।"
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "ਆਡੀਓ pid ਗੁੰਮ ਹੈ!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "pid ਜ਼ੀਰੋ ਨਹੀਂ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "ਤੁਹਾਨੂੰ ਕੁਝ ਦਿਨਾਂ ਦੀ ਚੋਣ ਕਰਨੀ ਚਾਹੀਦੀ ਹੈ।"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "ਚੈਨਲ"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "ਟਾਇਮਰ"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "ਇਲੈਕਟਰੋ ਪਰੋਗਰਾਮ ਗਾਇਡ"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB ਸਥਾਪਨ"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "ਅੰਕ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "ਨਾਂ"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "ਆਡੀਓ ਚੈਨਲ"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "ਤਰੁੰਤ ਰਿਕਾਰਡ"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "ਪਰਸਾਰਤ"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "ਸਮਾਂ ਸਿਫ਼ਟ"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "ਰਿਕਾਰਡਿੰਗ"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "ਪਰਸਾਰਨ(ਬਰਾਂਡਕਾਸਟ)"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "ਆਈਕਾਨ ਚੁਣੋ..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "ਚੈਨਲ ਆਈਕਾਨ ਚੁਣੋ"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "ਡਿਜ਼ੀਟਲ TV"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD ਅੱਗੇ ਚੈਨਲ"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD ਪਿੱਛੇ ਚੈਨਲ"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Zap"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD ਅਗਲੀ ਕਾਰਵਾਈ"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD ਪਿਛਲੀ ਘਟਨਾ"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "OSD ਵੇਖਾਓ"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "ਟਾਇਮਰ.."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "ਪਰਸਾਰਨ (ਬਰਾਂਡਕਾਸਟ)..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "ਚੈਨਲ..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "DVB ਸੰਰਚਨਾ..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "ਸਭ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "ਰੇਡੀਓ"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "ਨਵਾਂ ਵਰਗ..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "ਆਈਕਾਨ ਤਬਦੀਲ..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "ਵਰਗ ਹਟਾਓ..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "ਨਵਾਂ ਵਰਗ"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "ਇਸ ਵਰਗ ਲਈ ਇੱਕ ਨਾਂ ਦਿਓ:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "ਕੀ ਤੁਸੀਂ ਇਹ ਵਰਗ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>http://hftom.free.fr/kaxtv/dvbdata.tar.gz ਤੋਂ DVB ਡਾਟਾ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ "
+"ਸਕਦਾ ਹੈ!"
+"<br>\t\t\t ਆਪਣੇ ਇੰਟਰਨੈਟ ਕੁਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰੋ ਅਤੇ ਮੁੜ ਹਾਂ ਨੂੰ ਦਬਾਉ।"
+"<br>\t\t\tਜਾਂ ਰੱਦ ਕਰਨ ਲਈ ਨਹੀਂ ਨੂੰ ਦਬਾਉ। "
+"<br>"
+"<br> ਕੀ ਮੈਂ ਮੁੜ ਕੋਸ਼ਿਸ ਕਰਾਂ?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "ਪਰਸਾਰਣ ਅਸਫ਼ਲ ਹੈ।"
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "ਬਰਾਂਡਕਾਸਟ ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ"
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "ਟਾਇਮਰ ਸਫਲਤਾਪੂਰਕ ਬਣਾਇਆ ਅਤੇ ਸ਼ੁਰੂ ਕੀਤਾ ਗਿਆ।"
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "ਤੁਸੀਂ ਪਹਿਲਾਂ ਕੁਝ ਚੈਨਲ ਦੱਸਣੇ ਚਾਹੋਗੇ!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "ਟਾਇਮਰ ਸਫਲਤਾਪੂਰਕ ਬਣਾਇਆ ਗਿਆ।"
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "ਰਿਕਾਰਡਿੰਗ ਜਾਰੀ ਹੈ।"
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "ਹਾਲੇ ਵੀ ਬਰਾਂਡਕਾਸਟ ਜਾਰੀ ਹੈ।"
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "pid ਦਿੱਤਾ ਨਹੀਂ ਜਾ ਸਕਿਆ"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "ਕੋਈ CAM ਖਾਲੀ ਨਹੀਂ"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine ਹਾਲੇ ਰਿਕਾਰਡ ਕਰ ਰਿਹਾ ਹੈ। ਕੀ ਤੁਸੀਂ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine ਹਾਲੇ ਰਿਕਾਰਡ ਕਰ ਰਿਹਾ ਹੈ। ਕੀ ਤੁਸੀਂ ਬੰਦ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "ਸੰਕੇਤ:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "ਤਾਲਾ:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "ਸੋਧ..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "ਕੀ ਤੁਸੀਂ ਸਭ ਚੈਨਲਾਂ ਨੂੰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "ਜਾਂਚ ਸ਼ੁਰੂ"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "ਜਾਂਚ ਰੋਕੋ"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "ਰੋਕਿਆ ਜਾ ਰਿਹਾ ਹੈ ..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "ਖੋਜ: %1 TV - %2 ਰੇਡੀਓ"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "DVB ਜਾਣਕਾਰੀ ਸਾਕਟ ਖੋਲ੍ਹੀ ਨਹੀਂ ਸਕਦੀ ਹੈ।"
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "ਟਾਇਮਰ ਸੂਚੀ:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "ਨਵਾਂ"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "ਰੋਕੋ/ਹਟਾਓ"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"ਇਹ ਟਾਇਮਰ ਮੁੜ ਦੁਹਰਾਇਆ ਗਿਆ ਹੈ। ਕੀ ਤੁਸੀਂ ਮੌਜੂਦਾ ਕੰਮ ਛੱਡਣਾ ਚਾਹੁੰਦੇ ਹੋ ਜਾਂ ਟਾਇਮਰ "
+"ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "ਮੌਜੂਦਾ ਛੱਡੋ"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "ਕੀ ਤੁਸੀਂ ਚੁਣਿਆ ਟਾਇਮਰ ਹਟਾਉਣਾ ਚਾਹੁੰਦੇ ਹੋ?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "ਡਾਟਾ ਫਾਇਲਾਂ ਨਕਲ ਕੀਤੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB ਸਥਾਪਨ"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB ਜੰਤਰ"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "ਜੰਤਰ ਸਥਾਪਨ"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>ਨਾਂ:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>ਕਿਸਮ:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "ਕੇਬਲ"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "ਸੈਟੇਲਾਇਟ"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "ਅਣਜਾਣ"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "LNB ਦੀ ਗਿਣਤੀ:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1ਲਾਂ ਸਟੇਸ਼ਨ:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB ਸਥਾਪਨ..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2ਜਾ ਸਟੇਸ਼ਨ:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3ਜਾ ਸਟੇਸ਼ਨ"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4ਥਾ ਸਟੇਸ਼ਨ:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB ਸਥਾਪਨ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "ਸਰੋਤ:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB ਰਿਕਾਰਡਿੰਗ ਚੋਣ"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "ਰਿਕਾਰਡ ਡਾਇਰੈਕਟਰੀ:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "ਸਮਾਂ ਸਿਫਟ ਡਾਇਰੈਕਟਰੀ:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "ਸ਼ੁਰੂਆਤੀ ਅੰਤਰਾਲ:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(ਮਿੰਟ)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "ਅੰਤ ਅੰਤਰਾਲ:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "ਤਰੁੰਤ ਰਿਕਾਰਡ ਅੰਤਰਾਲ:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "ਪਸੰਦੀਦਾ ਫਾਰਮਿਟ :"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB ਪਰਸਾਰਨ"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "ਪਰਸਾਰਨ ਸਿਰਨਾਵਾਂ:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "ਪਰਸਾਰਨ ਪੋਰਟ:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "ਜਾਣਕਾਰੀ ਪੋਰਟ:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "ਫੁਟਕਲ"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "ਮੂਲ ਅੱਖਰ-ਸਮੂਹ (ਮੁੜ-ਚਾਲੂ ਕਰਨਾ ਪਵੇਗਾ):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "ਸਕੈਨ ਡਾਟਾ ਅੱਪਡੇਟ:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "ਡਾਊਨਲੋਡ"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "ਡੰਪ"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB ਪਲੱਗਇਨ"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>http://hftom.free.fr/kaxtv/dvbdata.tar.gz ਤੋਂ DVB ਡਾਟਾ ਪ੍ਰਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ "
+"ਸਕਦਾ ਹੈ!"
+"<br>\t\t\t ਆਪਣੇ ਇੰਟਰਨੈਟ ਕੁਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰੋ ਅਤੇ ਮੁੜ ਹਾਂ ਨੂੰ ਦਬਾਉ। "
+"<br>\t\t\tਜਾਂ ਰੱਦ ਕਰਨ ਲਈ ਨਹੀਂ ਨੂੰ ਦਬਾਉ।"
+"<br> ਕੀ ਮੈਂ ਮੁੜ ਕੋਸ਼ਿਸ ਕਰਾਂ?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "ਗਲਤ ਰਿਕਾਰਡ ਡਾਇਰੈਕਟਰੀ ਹੈ।"
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "ਗਲਤ ਸਮਾਂ ਸਿਫਟ ਡਾਇਰੈਕਟਰੀ ਹੈ।"
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "ਪਰਸਾਰਨ ਅਤੇ ਜਾਣਕਾਰੀ ਪੋਰਟਾਂ ਵੱਖ ਵੱਖ ਹੋਣੀਆਂ ਚਾਹੀਦੀਆਂ ਹਨ।"
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "ਗਲਤ ਬਰਾਂਡਕਾਸਟ ਸਿਰਨਾਵਾਂ ਹੈ।"
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB ਸਥਾਪਨ"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "ਵਿਆਪਕ LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "ਦੁਹਰੀ LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "ਇਕੇਹਰੀ LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "ਲੋ-ਬੈਂਡ ਫਰੀਕਿਊਨਸੀ :"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "ਹਾਈ ਬੈਂਡ ਫਰੀਕਿਊਨਸੀ :"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "ਮੁੜ-ਨਿਰਧਾਰਨ"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr ""
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr ""
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "ਕੋਈ ਆਡੀਓ ਇਕੋਡਰ ਨਹੀਂ ਲੱਭੇ ਜਾ ਸਕੇ ਹਨ।"
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "ਇੰਕੋਡਰ %1' ਲੋਡ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ।"
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "ਫੋਲਡਰ ਬਣਾਉਣ ਲਈ ਅਸਫ਼ਲ: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "ਮੈਬਾ"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "ਕਿਬਾ"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "ਬਾਈਟ"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "ਆਡੀਓ CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "CD ਚਲਾਓ"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "ਰਿਪ CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "ਕਲਾਕਾਰ:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "ਐਲਬਮ:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "ਟਰੈਕ"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "ਇੰਕੋਡ..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "ਆਡੀਓ CD ਇੰਕੋਡਿੰਗ"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "ਆਡੀਓ CD ਚਲਾਓ"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "DVD ਚਲਾਓ"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "VCD ਚਲਾਓ"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "&DVD ਖੋਲੋ"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "&VCD ਖੋਲੋ"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "ਆਡੀਓ CD ਖੋਲੋ(&A)"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "ਤੁਹਾਨੂੰ ਰਿਪ ਕਰਨ ਲਈ ਟਰੈਕ ਚੁਣਨੇ ਚਾਹੀਦੇ ਹਨ।"
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "ਕਈ ਆਡੀਓ CD ਮਿਲੀਆਂ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਚੁਣੋ:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "ਕੋਈ ਆਡੀਓ CD ਨਹੀਂ ਮਿਲੀ ਹੈ।"
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD ਵੀਡਿਓ"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "ਕਈ DVD ਵੀਡਿਓ ਮਿਲੀਆਂ ਹਨ। ਕਿਰਪਾ ਕਰਕੇ ਇੱਕ ਚੁਣੋ:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "ਕਈ (S)VCD ਮਿਲੀਆਂ ਹਨ। ਇੱਕ ਚੁਣੋ:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "ਕੋਈ ਸਿਰਲੇਖ ਨਹੀਂ"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "ਟਰੈਕ %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB ਮਿਲਿਆ"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "ਕੋਈ ਬੰਦ CDDB ਇੰਦਰਾਜ਼ ਮਿਲੇ। ਇੱਕ ਚੁਣੋ:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "ਕੈਫ਼ੀਨ ਲਈ ਇੱਕ ਲੇਮ mp3 ਇੰਕੋਡਰ ਪਲੱਗਇਨ ਹੈ।"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "ਕੈਫ਼ੀਨ ਲਈ ਇੱਕ ਓਜੀਜੀ ਵਰਬਿਸ ਇੰਕੋਡਰ ਪਲੱਗਇਨ ਹੈ।"
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB ਕਲਾਂਇਟ"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "ਜਾਣਕਾਰੀ ਸਾਕਟ ਖੋਲ੍ਹੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।"
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "ਸਾਕਟ ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "ਸਾਕਟ ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ।"
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "ਸਾਕਟ ਖੋਲੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "ਸਾਕਟ ਜੋੜੀ ਨਹੀਂ ਜਾ ਸਕਦੀ ਹੈ!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "ਸਭ ਅਕਾਰ"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "ਬਹੁਤ ਛੋਟਾ"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "ਛੋਟਾ"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "ਮੱਧਮ"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "ਵੱਡਾ"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "ਬਹੁਤ ਵੱਡਾ"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "ਨਵੀਂ ਖੋਜ"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "ਕਵਰ ਉਪਲੱਬਧ ਨਹੀਂ"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "ਢੱਕਣ ਡਾਊਨਲੋਡਰ"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "ਨਵੀਂ ਖੋਜ ਇਕਾਈ ਦਿਓ:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "ਚਲਾਓ"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "ਕਤਾਰ ਵਿੱਚ ਅੱਗੇ/ਸ਼ਾਮਿਲ ਚਲਾਓ"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "ਸਭ ਚੁਣੋ(&A)"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "ਚੋਣ ਤੋਂ ਸੰਗੀਤ-ਸੂਚੀ ਬਣਾਓ"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "ਸਬ-ਟਾਇਟਲ ਸ਼ਾਮਲ(&t)..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "ਟਾਇਟਲ ਸੋਧ(&E)"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "ਜਾਣਕਾਰੀ(&I)"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "ਲੰਬਾਈ"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "ਕਲਾਕਾਰ"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "ਐਲਬਮ"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "ਸਾਲ"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "ਧੁਨ"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "ਸਬ-ਟਾਇਟਲ"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "ਵਰਤੋਂ ਵਿੱਚ"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|ਸਬ-ਟਾਇਟਲ ਫਾਇਲਾਂ\n"
+"*.*|ਸਭ ਫਾਇਲਾਂ"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "ਸਬ-ਟਾਇਟਲ ਫਾਇਲ ਚੁਣੋ"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "ਇੱਕ ਕਵਰ ਚੁਣੋ..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "ਗੈਲਰੀ..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "ਫਿਲਟਰ"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ ਚਲਾਓ"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "ਵਾਪਸ(&R)"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ ਚੱਕਰ"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "ਰਲਵੇਂ(&u)"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "ਗਾਣੇ ਰਲਵੇਂ ਢੰਗ ਨਾਲ ਚਲਾਓ"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "ਕਵਰ ਆਟੋ-ਡਾਊਨਲੋਡ"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "ਮੌਜੂਦਾ ਸੰਗੀਤ-ਸੂਚੀ ਸਾਫ਼ ਕਰੋ(&C)"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "ਨਵੀਂ ਸੰਗੀਤ-ਸੂਚੀ(&w)"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ ਆਯਾਤ(&I)..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "ਮੌਜੂਦਾ ਸੰਗੀਤ-ਸੂਚੀ ਏਦਾਂ ਸੰਭਾਲੋ(&S)..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "ਮੌਜੂਦਾ ਸੰਗੀਤ-ਸੂਚੀ ਹਟਾਓ(&m)"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "ਕੈਫੀਨ ਸੰਗੀਤ-ਸੂਚੀ"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "ਸਭ ਫਾਇਲਾਂ"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ ਖੋਲੋ"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U ਸੰਗੀਤ-ਸੂਚੀ"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS ਸੰਗੀਤ-ਸੂਚੀਆਂ"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ ਸੰਭਾਲੋ"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "ਨਵਾਂ"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "ਮੀਡਿਆ ਸਰੋਤ ਆਯਾਤ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(ਕੋਈ ਸਬ-ਟਾਇਟਲ ਨਹੀਂ)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "ਹੋਰ ਸਬ-ਟਾਇਟਲ..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "ਗੈਲਰੀ"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "ਕਤਾਰ: %1 ਇੰਦਰਾਜ਼, ਚੱਲਣ ਸਮਾਂ: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "ਇੰਦਰਾਜ਼: %1 ਚੱਲਣ ਸਮਾਂ: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "'%1' ਨੂੰ ਸੂਚੀ ਅਤੇ ਡਿਸਕ ਤੋਂ ਹਟਾਉਣਾ ਹੈ?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ ਨਾਂ ਪਹਿਲਾਂ ਹੀ ਮੌਜੂਦ ਹੈ"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "ਵੱਖਰਾ ਸੰਗੀਤ-ਸੂਚੀ ਨਾਂ ਦਿਓ:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "ਸਬ-ਟਾਇਟਲ ਚੁਣੋ"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "ਮੀਡਿਆ ਫਾਇਲ:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "ਮੂਵੀ ਚੁਣੋ"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "ਸਬ-ਟਾਇਟਲ ਫਾਇਲ:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "ਚਲਾਓ / ਵਿਰਾਮ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "ਅੱਗੇ(&N)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "ਚੁੱਪ(&M)"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "ਕੈਫ਼ੀਨ ਪਲੇਅਰ"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[ਕੈਫ਼ੀਨ ਪਲੇਅਰ]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "ਅਮਨਪਰੀਤ ਸਿੰਘ ਬਰਾੜ"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "apbrar@gmail.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"KDE 3 ਲਈ ਇੱਕ ਮੀਡਿਆ ਪਲੇਅਰ ਹੈ। ਗਾਣੇ ਵਜਾਉਣ ਅਤੇ ਵੇਖਾਉਣ ਲਈ ਕਈ ਬੈਕਐਂਡ ਵਰਤ ਸਕਦਾ ਹੈ, "
+"ਮੂਲ (ਅਤੇ ਸਿਫ਼ਰਾਸ਼ੀ) ਜ਼ਾਇਨ (xine) ਹੈ।"
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, ਕੈਂਫੀਨ ਲੇਖਕ"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "ਮੌਜੂਦਾ ਪਰਬੰਧਕ"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "ਅਸਲੀ ਲੇਖਕ"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM ਸਹਿਯੋਗ ਹੈ।"
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "DVB OSD ਝਲਕ ਪੈਂਚ।"
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "DVB ਵਰਗੀਕਰਨ ਪੈਂਚ"
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "ਕੈਫੀਨ 0.8 ਲਈ ਲੋਗੋ ਅਤੇ ਹੋਰ ਚਿੱਤਰਕਾਰੀ"
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Kaffeine 0.5 ਲਈ ਲੋਗੋ ਸਜੀਵਤਾ"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "ਮੈਟਾ ਟੈਗ ਲਈ ਬਦਲਵੀਂ ਇਕੋਡਿੰਗ। ਕਈ ਪੈਂਚ"
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "ਸਬ-ਟਾਇਟਲ ਫਾਇਲ ਆਯਾਤ"
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "ਸਬ-ਟਾਇਟਲ PID ਸੰਪਾਦਕ"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "ਸਬ-ਟਾਇਟਲ PID"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "ਨਵੀਂ ਇਕਾਈ"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "ਉੱਪਰ ਭੇਜੋ"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "ਹੇਠਾਂ ਭੇਜੋ"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< ਚੁਣੇ ਅੱਪਡੇਟ"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< ਨਵਾਂ"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "ਸਫ਼ਾ:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "ਸਬ ਪੇਜ਼:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "ਭਾਸ਼ਾ:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "ਟਾਈਮਰ ਮੁੜ-ਚਾਲੂ ਕੀਤਾ"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "ਆਡੀਓ PID ਸੰਪਾਦਕ"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "ਆਡੀਓ PID"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "ਪਰਸਾਰਨ ਸੰਪਾਦਕ"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "ਉਪਲੱਬਧ ਚੈਨਲ:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "ਪਰਸਾਰਣ ਸੂਚੀ:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(ਸੋਧਣ/ਹਟਾਉਣ ਲਈ ਸੱਜਾ ਬਟਨ ਦਬਾਓ)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "ਨਵਾਂ..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "ਖੋਜ ਜਾਰੀ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "ਜਾਂਚ ਸ਼ੁਰੂ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "ਫਿਲਟਰ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "ਹਵਾ ਵਿੱਚ ਜਾਰੀ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "ਉਪਲੱਬਧਕਰਤਾ:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< ਚੋਣ ਵਿੱਚ ਸ਼ਾਮਲ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< ਫਿਲਟਰ ਸ਼ਾਮਲ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "ਖੋਜ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "ਸਮਾਪਤ"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "ਚੈਨਲ ਸੰਪਾਦਕ"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "ਪੋਰਲਰਟੀ"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "ਫਰੀਕਿਊਨਸੀ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "ਨਿਸ਼ਾਨ ਦਰ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "ਸੇਵਾ ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "ਵੀਡਿਓ PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "ਸੰਚਾਰ ਸਟਰੀਮ ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "ਸਬ-ਟਾਇਟ PID..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "ਆਡੀਓ PID..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "ਬੈਂਡਵਥਿਡ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC ਉੱਚ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "ਸੰਚਾਰ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC ਘੱਟ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "ਲੜੀ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "ਮੋਡੂਲੇਸ਼ਨ:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "ਉਲਟ:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "ਇੰਕੋਡਿੰਗ ਪਸੰਦ"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "ਇੰਕੋਡਰ:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "ਅਧਾਰ ਡਾਇਰੈਕਟਰੀ:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "ਸਭ ਜਾਂਚ ਆਯੋਗ ਹੈ"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "ਸਧਾਰਨ ਢੰਗ"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoia ਢੰਗ"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "ਸਧਾਰਨ"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD ਸੰਦ-ਪੱਟੀ"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame mp3 ਚੋਣਾਂ"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "ਬਿੱਟਰੇਟ:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis ਚੋਣਾਂ"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "ਕੁਆਲਟੀ:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ(&l)"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "ਬੰਦ ਚੋਣ"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "ਪਲੇਅਰ(&P)"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "ਆਡੀਓ ਮੁੜ-ਅਕਾਰ ਯੋਗ(&R)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "ਨੈੱਟਵਰਕ ਪਰਸਾਰਨ(&N)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "ਏਧਰ-ਓਧਰ(&N)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD ਮੇਨੂ"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "ਆਡੀਓ(&A)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "ਵੀਡਿਓ(&V)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "ਅਕਾਰ ਅਨੁਪਾਤ(&A)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "ਪਰਦਾ-ਤਸਵੀਰ ਸੰਦ-ਪੱਟੀ"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "ਕੰਟਰੋਲ ਸੰਦ-ਪੱਟੀ"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "ਆਵਾਜ਼ ਸੰਦਪੱਟੀ"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "ਸਥਿਤੀ ਸੰਦ-ਪੱਟੀ"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "ਕੈਫੀਨ ਸੈਟਅੱਪ"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "ਰਵੱਈਆ"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "ਜਦੋਂ ਝਰੋਖਾ ਘੱਟੋ-ਘੱਟ ਹੋਵੇ ਤਾਂ ਵੀਡਿਓ ਵਿਰਾਮ ਕਰੋ"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਵਿੱਚ ਸ਼ਾਮਿਲ"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " ਸਕਿੰਟ"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "ਬੰਦ"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "ਸਿਸਟਮ ਟਰੇ ਵਿੱਚ ਐਲਾਨ ਦਾ ਅੰਤਰਾਲ"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "DVB ਕਲਾਂਇਟ ਯੋਗ"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "ਫੁਟਕਲ਼ ਚੋਣਾਂ"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "ਮੈਟਾ ਟੈਗ ਲਈ ਬਦਲਵੀਂ (ਨਾ-ਯੂਨੀਕੋਡ) ਇੰਕੋਡਿੰਗ ਵਰਤੋਂ"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"ਮੈਟਾ ਟੈਗਾਂ ਲਈ ਬਦਲਵਾਂ ਇੰਕੋਡਿੰਗ ਨਾਂ ਚੁਣੋ\n"
+"(ਯੂਨੀਕੋਡ 'ਚ ਬਦਲਣ ਲਈ)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "ਮੌਜੂਦਾ ਫਾਇਲ ਸੂਚੀ ਸਾਫ਼"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "ਤੁਰੰਤ ਚਲਾਉਣਾ ਸ਼ੁਰੂ"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "ਪੂਰੇ ਪਰਦੇ ਦੇ ਮੋਡ ਨਾਲ ਆਰੰਭ ਕਰੋ"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "ਆਡੀਓ ਡਰਾਇਵਰ ਸੈਟ"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "ਵੀਡਿਓ ਡਰਾਇਵਰ ਸੈੱਟ"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "ਆਡੀਓ-CD/VCD/DVD ਜੰਤਰ ਮਾਰਗ ਦਿਓ।"
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "ਆਉਟਪੁੱਟ ਜ਼ਾਇਨ ਡੀਬੱਗ ਸੁਨੇਹੇ"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "ਇੰਸਟਾਲੇਸ਼ਨ ਸਹਾਇਕ ਚਲਾਓ"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "ਸ਼ੁਰੂ"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "ਪਲੇਅਰ ਝਰੋਖਾ"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "ਸਹਾਇਕ ਮੀਡਿਆ ਫਾਰਮਿਟ"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG ਆਡੀਓ ਫਾਇਲਾਂ"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG ਵੀਡਿਓ ਫਾਇਲਾਂ"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis ਫਾਇਲਾਂ"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI ਫਾਇਲਾਂ"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime ਫਾਇਲਾਂ"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media ਫਾਇਲਾਂ"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska ਫਾਇਲਾਂ"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC ਫਾਇਲਾਂ"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media ਫਾਇਲਾਂ"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV ਫਾਇਲਾਂ"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "ਪਲੇਅਰ ਭਾਗ '%1' ਨੂੰ ਚਲਾਉਣ ਲਈ ਅਸਫ਼ਲ ਹੈ।"
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "ਖੋਜ ਮਾਰਗ ਵਿੱਚ %1 ਨਹੀਂ ਮਿਲਿਆ ਹੈ।"
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "&URL ਖੋਲੋ..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "ਡਾਇਰੈਕਟਰੀ ਖੋਲੋ(&i)..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "ਇਸ ਗੀਤ ਦੇ ਬਾਅਦ ਬਾਹਰ ਨਿਕਲੋ ਅਤੇ ਮਾਨੀਟਰ ਬੰਦ"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "ਇਸ ਗੀਤ ਦੇ ਬਾਅਦ ਬੰਦ"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ ਬਾਅਦ ਬੰਦ ਕਰੋ"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "ਘੱਟੋ-ਘੱਟ ਢੰਗ(&M)"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "ਸੰਗੀਤ-ਸੂਚੀ/ਪਲੇਅਰ ਤਬਦੀਲ(&P)"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "ਅਸਲੀ ਅਨੁਪਾਤ ਰੱਖੋ(&O)"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "ਅਸਲੀ ਆਕਾਰ"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "ਦੂਹਰਾ ਅਕਾਰ"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "ਤੀਹਰਾ ਅਕਾਰ"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "ਪਲੇਅਰ ਇੰਜਣ(&P)"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB ਕਲਾਂਈਟ"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "ਪਲੇਅਰ"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "ਮੁੱਖ ਝਰੋਖਾ"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS Xserver ਐਕਸ਼ਟੈਨਸ਼ਨ ਨਹੀਂ ਲੱਭੀ ਹੈ।"
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "ਫਾਇਲਾਂ ਖੋਲ੍ਹੋ"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "URL ਖੋਲ੍ਹੋ"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "ਇੱਕ URL ਦਿਓ:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "ਫੋਲਡਰ ਖੋਲ੍ਹੋ"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "ਡਰਾਇਵ 'ਚ %1 ਨਹੀਂ ਹੈ ਜਾਂ ਜੰਤਰ ਲਈ ਮਾਰਗ ਗਲਤ ਹੈ।"
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "ਠੀਕ ਡਰਾਇਵ ਦੀ ਚੋਣ ਕਰੋ।"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "ਕੈਂਫੀਨ %1 ਇੰਸਟਾਲੇਸ਼ਨ ਸਹਾਇਕ"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "ਇੰਸਟਾਲੇਸ਼ਨ ਜਾਂਚ"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "ਠੀਕ ਹੈ"
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "ਭਾਗ ਨਹੀਂ ਲੱਭਿਆ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ ਆਪਣੀ ਇੰਸਟਾਲੇਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰੋ!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "ਖੋਜਿਆ ਵਰਜਨ"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "ਕੈਫ਼ੀਨ ਨੂੰ KDE >= %1 ਦੀ ਲੋੜ ਹੈ।"
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 Codecs"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"ਕੋਈ WIN32 codecs /usr/lib/win32 ਵਿੱਚ ਨਹੀਂ ਮਿਲੇ ਹਨ। ਤੁਸੀਂ Windows Media 9 "
+"ਫਾਇਲਾਂ, ਨਵੀਆਂ Real Media ਫਾਇਲਾਂ ਅਤੇ ਕੁਝ ਘੱਟ ਹਰਮਨਪਿਆਰੇ ਫਾਰਮੈਟ ਚਲਾ ਨਹੀਂ ਸਕਦੇ ਹੋ। "
+"codecs ਨੂੰ ਤੁਸੀਂ ਏਥੋਂ ਡਾਊਨਲੋਡ ਕਰ ਸਕਦੇ ਹੋ:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD ਡਰਾਇਵ"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "DMA ਢੰਗ ਬੰਦ ਹੈ! ਵਧੀਆ DVD ਚਲਾਉਣ ਲਈ ਰੂਟ (root) ਵਾਂਗ ਚਲਾਓ:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "DMA ਢੰਗ ਦੀ ਜਾਂਚ ਨਹੀਂ ਹੋ ਸਕਦੀ। ਅਧਿਕਾਰ ਨਹੀਂ ਹਨ ਜਾਂ ਜੰਤਰ ਹੀ ਨਹੀਂ ਹੈ:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-ਜੰਤਰ"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"ਕੋਈ DVB-ਜੰਤਰ ਨਹੀਂ ਮਿਲਿਆ ਹੈ। DVB ਨਾਲ ਸਬੰਧਤ ਸਹੂਲਤਾਂ ਨੂੰ ਓਹਲੇ ਕਰ ਦਿੱਤੀਆਂ ਜਾਣਗੀਆਂ।"
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "ਵੰਡ"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "ਨਤੀਜਾ"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "ਕੁਝ ਸਮੱਸਿਆਵਾਂ ਹਨ, ਪਰ ਕੈਫ਼ੀਨ ਫਿਰ ਵੀ ਕੰਮ ਕਰ ਸਕਦਾ ਹੈ।"
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "ਸਭ ਠੀਕ ਹੈ!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "ਕੈਫ਼ੀਨ ਨੂੰ ਸਹਾਇਕ ਕਾਰਜ ਦੇ ਤੌਰ 'ਤੇ ਵਰਤੋਂ mms:// (Microsoft Media) ਲਈ"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr "ਕੈਫ਼ੀਨ ਨੂੰ ਸਹਾਇਕ ਕਾਰਜ ਦੇ ਤੌਰ 'ਤੇ ਵਰਤੋਂ rtsp:// (Real Media ਅਤੇ ਹੋਰ) ਲਈ"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "ਵਿਹੜੇ ਵਿੱਚ ਕੈਫ਼ੀਨ ਆਈਕਾਨ ਬਣਾਉ"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "ਇੰਸਟਾਲੇਸ਼ਨ ਚੋਣ"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "ਉਪਭੋਗੀ ਪ੍ਰਭਾਸ਼ਿਤ"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "ਪਲੱਗਿੰਨ ਪਰਭਾਵ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "ਆਡੀਓ"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "ਆਡੀਓ ਫਿਲਟਰ"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "ਆਡੀਓ ਫਿਲਟਰ ਯੋਗ"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "ਫਿਲਟਰ ਸ਼ਾਮਿਲ"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "ਸਭ ਫਿਲਟਰ ਹਟਾਓ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "ਵੀਡਿਓ"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "ਵੀਡਿਓ ਫਿਲਟਰ"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "ਵੀਡਿਓ ਫਿਲਟਰ ਯੋਗ"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "xine ਇੰਜਣ ਪੈਰਾਮੀਟਰ"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 ਚੋਣ"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "ਸ਼ੁਰੂਆਤੀ ਚੋਣ"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "ਮਾਹਰ ਚੋਣ"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "ਕੈਫ਼ੀਨ xine ਅਧਾਰਿਤ ਪਲੇਅਰ ਹੈ।"
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "ਸਟਰੀਮ ਵਾਂਗ ਸੰਭਾਲੋ"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "ਅਧੀਨ-ਸਿਰਲੇਖ"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "ਆਡੀਓ ਚੈਨਲ"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%2 ਵਿੱਚੋਂ %1"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-ਫਾਇਲ\n"
+"*.bmp|BMP-ਫਾਇਲ\n"
+"*.xbm|XBM-ਫਾਇਲ"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "ਸਕਰੀਨ-ਸ਼ਾਟ ਸੰਭਾਲੋ"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "ਪਰਸਾਰਨ ਪੋਰਟ:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "ਭੇਜਣ ਸਿਰਨਾਵਾਂ:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "ਪੋਰਟ:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "ਸਥਿਤੀ 'ਤੇ ਜਾਓ:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine ਗਲਤੀ"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine ਸੁਨੇਹਾ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "ਤਿਆਰ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "ਵੱਜ ਰਿਹਾ ਹੈ"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "ਸਬ-ਟਾਇਟਲ ਫਾਇਲ"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "ਸਟਰੀਮ ਵਾਂਗ ਸੰਭਾਲੋ"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "ਟਰੈਕ ਜਾਣਕਾਰੀ"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "URL ਕਲਿੱਪਬੋਰਡ ਵਿੱਚ ਨਕਲ"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "ਕੈਫ਼ੀਨ ਬਾਹਰ ਵਿੱਚ ਚਲਾਓ"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "ਪਰਸਾਰਨ (ਬਰਾਂਡਕਾਸਟ) ਧਾਰਾ ਭੇਜੋ(&S)..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "ਸਕਰੀਨ-ਸ਼ਾਟ ਸੰਭਾਲੋ(&S)..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "ਸਟਰੀਮ ਨੂੰ ਸੰਭਾਲੋ..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "ਘੱਟੋ-ਘੱਟ ਢੰਗ ਤਬਦੀਲ"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "ਵਿਰਾਮ"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "ਤੇਜ਼ ਅੱਗੇ(&F)"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "ਹੌਲੀ ਚਲਾਓ(&M)"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "ਅੱਗੇ ਜਾਓ (20 ਸ)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "ਪਿੱਛੇ ਜਾਓ (20 ਸ)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "ਅੱਗੇ ਜਾਓ (1ਮਿੰਟ)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "ਪਿੱਛੇ ਜਾਓ (1ਮਿੰਟ)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "ਅੱਗੇ ਜਾਓ (10 ਮਿੰਟ)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "ਪਿੱਛੇ ਜਾਓ (10 ਮਿੰਟ)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "ਸਥਿਤੀ 'ਤੇ ਜਾਓ..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD ਮੇਨੂ ਖੱਬੇ"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD ਮੇਨੂ ਸੱਜੇ"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD ਮੇਨੂ ਉੱਪਰ"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD ਮੇਨੂ ਹੇਠਾਂ"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD ਮੇਨੂ ਚੋਣ"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "ਆਡੀਓ ਚੈਨਲ"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "ਆਡੀਓ ਚੈਨਲ ਚੁਣੋ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "ਆਡੀਓ ਦਿੱਖ(&V)"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "ਆਵਾਜ਼ ਵਧਾਓ"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "ਆਵਾਜ਼ ਘਟਾਓ"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "ਡੀਇੰਟਰਲੇਸ(&D)"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "ਆਟੋ(&A)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "ਵਰਗ(&S)"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "ਖਿਤਿਜੀ ਜ਼ੂਮ ਇਨ"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "ਖਿਤਿਜੀ ਜ਼ੂਮ ਆਉਟ"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "ਲੰਬਕਾਰੀ ਜ਼ੂਮ ਇਨ"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "ਲੰਬਕਾਰੀ ਜ਼ੂਮ ਆਉਟ"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "ਵੀਡਿਓ ਸਥਾਪਨ(&V)"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "ਸਮਤੋਲ(&E)"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "ਮੇਨੂ ਤਬਦੀਲ(&M)"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "ਸਿਰਲੇਖ(&T)"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Root"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "ਸਬ-ਤਸਵੀਰ(&S)"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "ਕੋਣ(&g)"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "ਭਾਗ(&P)"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "ਟਾਇਟਲ"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "ਕਾਂਡ"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "ਕੋਣ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "ਟਰੈਕ ਜਾਣਕਾਰੀ(&I)"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "ਪਲੱਗਿੰਨ ਪ੍ਰਭਾਵ(&P)..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&xine ਇੰਜਣ ਪੈਰਾਮੀਟਰ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "ਵਾਲੀਅਮ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "ਸਥਿਤੀ"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "ਚੱਲਣ ਸਮਾਂ"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "CDDB ਇੰਦਰਾਜ਼ ਲਈ ਖੋਜ..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "ਆਡੀਓ CD ਟਰੈਕ %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD ਟਰੈਕ %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "ਵੀਡਿਓ ਸਥਾਪਨ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "ਰੰਗਤ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "ਸੰਤਰਿਪਤ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "ਵੱਖਰੇਵਾਂ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "ਚਮਕ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "ਆਡੀਓ/ਵੀਡਿਓ ਆਫਸੈਟ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "ਸਬ-ਟਾਇਟਲ"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "ਸਵੈ"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"ਆਮ ਚੇਤਾਵਨੀ: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "ਕੋਈ ਜਾਣਕਾਰੀ ਨਹੀਂ ਹੈ।"
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"ਸੁਰੱਖਿਆ ਚੇਤਾਵਨੀ: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "ਤੁਹਾਡੇ ਵਲੋਂ ਦਿੱਤਾ ਜੰਤਰ ਨਾਂ ਠੀਕ ਨਹੀਂ ਹੈ। "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "ਆਡੀਓ ਆਉਟਪੁੱਟ ਜੰਤਰ ਉਪਲੱਬਧ ਨਹੀਂ ਹੈ। ਜੰਤਰ ਰੁੱਝਿਆ ਹੈ। "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"ਕੁਨੈਕਸ਼ਨ ਤੋਂ ਇਨਕਾਰ ਹੈ।\n"
+"ਮੇਜ਼ਬਾਨ ਨਾਂ ਦੀ ਜਾਂਚ ਕਰੋ। "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "ਦਿੱਤੀ ਫਾਇਲ ਜਾਂ url ਨਹੀਂ ਲੱਭਿਆ ਹੈ। ਜਾਂਚ ਕਰੋਗੇ। "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "ਇਸ ਸਰੋਤ ਲਈ ਪਹੁੰਚ ਸਵੀਕਾਰ ਨਹੀਂ ਹੈ। "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"ਸਰੋਤ ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ।\n"
+"ਇਸ ਲਈ ਤੁਹਾਨੂੰ ਠੀਕ ਅਧਿਕਾਰ ਨਹੀਂ ਹੋ ਸਕਦੇ ਹਨ ਜਾਂ ਸਰੋਤ 'ਚ ਡਾਟਾ ਹੋ ਨਹੀਂ ਸਕਦਾ। (ਜਿਵੇਂ "
+"ਕਿ ਡਰਾਇਵ 'ਚ ਡਿਸਕ ਨਾ ਹੋਵੇ)। "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "ਇੱਕ ਲਾਇਬਰੇਰੀ ਜਾਂ ਇੱਕ ਡੀਕੋਡਰ ਲੋਡ ਕਰਨ ਦੌਰਾਨ ਸਮੱਸਿਆ ਆਈ ਹੈ: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "ਸਰੋਤ ਇੰਕ੍ਰਿਪਟਿਡ ਜਾਪਦਾ ਹੈ, ਪੜ੍ਹਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ। "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"ਤੁਹਾਡੀ DVD ਨਿਕਾਰਾ ਹੋਈ ਜਾਪਦੀ ਹੈ। ਤੁਹਾਡੇ ਦੇਸ਼ ਦੇ ਨਿਯਮਾਂ ਮੁਤਾਬਕ ਤੁਸੀਂ ਇਸ ਡਿਸਕ ਨੂੰ "
+"ਪੜ੍ਹਨ ਲਈ libdvdcss ਵਰਤ ਸਕਦੇ ਹੋ ਜਾਂ ਨਹੀਂ।"
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"ਅਣਜਾਣੀ ਗਲਤੀ:\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "ਗਲਤੀ: ਨਵਾਂ ਵੀਡਿਓ ਡਰਾਇਵਰ %1 - %2 ਵਰਤ ਕੇ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "ਵੀਡਿਓ ਡਰਾਇਵਰ ਦੀ ਵਰਤੋਂ: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "ਗਲਤੀ: ਨਵਾਂ ਆਡੀਓ ਡਰਾਇਵਰ %1 - %2 ਵਰਤ ਕੇ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਅਸਫ਼ਲ ਹੈ!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "ਆਡੀਓ ਡਰਾਇਵਰ ਦੀ ਵਰਤੋਂ: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Init xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "xine ਇੰਜਣ ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "ਵਰਤਣ ਲਈ ਆਡੀਓ ਡਰਾਇਵਰ (ਮੂਲ: ਸਵੈ)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "ਵਰਤਣ ਲਈ ਵੀਡਿਓ ਡਰਾਇਵਰ (ਮੂਲ: ਸਵੈ)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "ਸਾਫਟਵੇਅਰ ਆਡੀਓ ਮਿਕਸਰ"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "OSD ਸੁਨੇਹੇ ਵੇਖਾਓ"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "OSD ਪਾਠ ਦਾ ਅਕਾਰ"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "OSD ਸੁਨੇਹਿਆਂ ਲਈ ਫੋਂਟ"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "ਵੀਡਿਓ ਡਰਾਇਵਰ '%1' ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ - 'auto' ਨਾਲ ਕੋਸ਼ਿਸ਼"
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "ਸ਼ੁਰੂ ਕਰਨ ਸਭ ਵੀਡਿਓ ਡਰਾਇਵਰ ਅਸਫ਼ਲ!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "ਆਡੀਓ ਡਰਾਇਵਰ '%1' ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ - 'auto' ਨਾਲ ਕੋਸ਼ਿਸ਼"
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "ਸਭ ਆਡੀਓ ਡਰਾਇਵਰ ਸ਼ੁਰੂ ਕਰਨ ਲਈ ਅਸਫ਼ਲ!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "ਨਵੀਂ xine ਸਟਰੀਮ ਬਣਾਈ ਨਹੀਂ ਜਾ ਸਕੀ!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB ਖੋਲੀ ਜਾ ਰਹੀ ਹੈ..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "ਖੋਲਿਆ ਜਾ ਰਿਹਾ ਹੈ..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "ਆਡੀਓ ਕੋਡ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "ਵੀਡਿਓ ਕੋਡ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "ਇਸ ਸਰੋਤ ਲਈ ਕੋਈ ਪਲੱਗਿੰਨ ਨਹੀਂ ਲੱਭੀ ਹੈ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "ਸਰੋਤ ਟੁੱਟਿਆ ਜਾਪਦਾ ਹੈ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "ਲੋੜੀਦਾ ਸਰੋਤ ਮੌਜੂਦ ਨਹੀਂ ਹੈ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "ਸਰੋਤ ਨੂੰ ਖੋਲਿਆ ਨਹੀਂ ਜਾ ਸਕਦਾ ਹੈ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "ਸਧਾਰਨ ਗਲਤੀ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "ਚੁੱਪ ਬੰਦ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "ਚੁੱਪ ਚਾਲੂ"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "ਤੇਜ਼ ਅੱਗੇ %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "ਹੌਲੀ ਗਤੀ %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "ਡੀਇੰਟਰਲੇਸ਼: ਚਾਲੂ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "ਡੀਇੰਟਰਲੇਸ਼: ਬੰਦ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "ਅਕਾਰ ਅਨੁਪਾਤ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "ਸਵੈ"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "ਜ਼ੂਮ X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "ਜ਼ੂਮ Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ਮਿਸਕਿੰਟ"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "ਸੰਤੁਲਨ ਸਥਾਪਨ"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "ਆਵਾਜ਼ ਵਾਧਾ"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "ਫਿਲਟਰ ਹਟਾਓ"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "%s ਲਈ ਪ੍ਰਾਪਤ ਜਾਰੀ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "ਜੀਸਟੀਮਰ ਸ਼ੁਰੂ ਕਰਨਾ ਅਸਫ਼ਲ ਹੈ!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "ਚੁੱਪ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "ਟਿੱਪਣੀ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "ਜੀਸਟੀਮਰ ਇੰਜਣ ਮੁੱਲ(&G)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "ਜੀਸਟੀਮਰ ਨੂੰ ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ ਹੈ!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "ਆਡੀਓ ਡਰਾਇਵਰ '%1' ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ - ਹੋਰ ਨਾਲ ਕੋਸ਼ਿਸ਼ ਜਾਰੀ..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "ਕੋਈ ਵਰਤਣਯੋਗ ਆਡੀਓ-ਡਰਾਇਵਰ ਮਿਲਿਆ ਹੈ!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "ਵੀਡਿਓ ਡਰਾਇਵਰ '%1' ਸ਼ੁਰੂ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ - ਹੋਰ ਨਾਲ ਕੋਸ਼ਿਸ਼ ਜਾਰੀ..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "ਕੋਈ ਵਰਤਣਯੋਗ ਵੀਡਿਓ-ਡਰਾਇਵਰ ਨਹੀਂ ਲੱਭਿਆ!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "ਜੀਸਟੀਮਰ ਇੰਜਣ ਮੁੱਲ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "ਆਡੀਓ ਚੋਣ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "ਪਸੰਦੀਦਾ ਆਡੀਓ ਡਰਾਇਵਰ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "ਵੀਡਿਓ ਚੋਣ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "ਪਸੰਦੀਦਾ ਵੀਡਿਓ ਡਰਾਇਵਰ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* ਮੁੜ-ਚਾਲੂ ਕਰਨਾ ਪਵੇਗਾ!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "ਮੀਡਿਆ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "ਮੀਡਿਆ ਚੋਣ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD ਡਰਾਇਵ"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
diff --git a/po/pl.po b/po/pl.po
new file mode 100644
index 0000000..f64fd20
--- /dev/null
+++ b/po/pl.po
@@ -0,0 +1,3208 @@
+# translation of pl.po to Polish
+# translation of pl.po to
+# translation of kaffeine.pot to
+# translation of pl.po
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Jacek Głogosz, 2005.
+# Jacek Glogosz, 2005.
+# Krzysztof Lichota <lichota@mimuw.edu.pl>, 2005, 2006, 2007.
+# Paweł Dąbek <pdabek@onet.pl>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: pl\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-05-15 15:38+0200\n"
+"Last-Translator: Paweł Dąbek <pdabek@onet.pl>\n"
+"Language-Team: Polish <pl@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Program telewizyjny (EPG)"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Odśwież"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Zaplanowane"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Bieżący/Następny"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanał"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Początek"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Czas trwania"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Tytuł"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Pokaż wszystkie programy"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Dodaj do zaprogramowanych"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Nazwa:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanał:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Początek:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Czas trwania:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Koniec:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Nagraj jako:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Brak"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Codziennie"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Co tydzień"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Co miesiąc"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Własne"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Powtórz..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Edycja programowania"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Należy nadać nazwę!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Czas trwania nie może być krótszy niż 1 minuta!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"Nazwa nie może zawierać żadnego z następujących znaków: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Początkowe ustawienia transpondera"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Ta nazwa już istnieje."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Brak PID-ów audio!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Wartość PID nie może być równa zero!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Należy wskazać dni."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanały"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Programowanie"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektroniczny program telewizyjny"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Ustawienia DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Liczba"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Nazwa"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Kanały audio"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Natychmiastowe nagrywanie"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Transmisja"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Oglądanie z przesunięciem czasowym"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Nagrywanie"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Transmisja"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Wybierz ikonę..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Wybierz ikonę kanału"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Cyfrowa telewizja"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Cyfrowa telewizja na żywo działa jedynie z silnikiem xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Następny kanał OSD"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Poprzedni kanał OSD"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Przełączanie OSD"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Następne wydarzenie OSD"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Poprzednie wydarzenie OSD"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Pokaż OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Zaprogramowane..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Transmisja..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanały..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Konfiguruj DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Wszystkie"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Nowa kategoria..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Zmiana ikony..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Usuń kategorię..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nowa kategoria"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Wprowadź nazwę tej kategorii:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Czy na pewno chcesz usunąć tę kategorię?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Nie można pobrać danych z http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tSprawdź połączenie z Internetem i wybierz Tak, aby spróbować "
+"ponownie. "
+"<br>\t\t\tLub wybierz Nie, aby anulować."
+"<br>\t\t\tJeśli posiadasz już to archiwum, skopiuj je do "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz i wybierz Tak."
+"<br>"
+"<br>Spróbować ponownie?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Nieudana transmisja."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Nie można rozpocząć transmisji."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Program ustawiony i uruchomiony."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Należy najpierw zdefiniować kanał!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Utworzenie programu zakończone powodzeniem."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Nagrywanie w toku."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Transmisja w toku."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Nie można ustawić kanału dvb!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Nie można ustawić PID-ów."
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Brak wolnej kamery"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine nadal nagrywa. Czy na pewno zakończyć?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine ma oczekujące programy. Czy na pewno zakończyć?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Sygnał:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Zablokuj:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Zmień..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Czy na pewno chcesz usunąć wszystkie kanały?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "ROZPOCZNIJ skanowanie"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "ZAKOŃCZ skanowanie"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Zatrzymywanie..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Znaleziono : %1 stacji TV - %2 stacji radiowych"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Nie można otworzyć gniazda informacji DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Lista zaprogramowanych:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Nowy"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Zatrzymaj/Usuń"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Powtórzono program. Czy chcesz pominąć bieżące zadanie, czy usunąć program?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Pomiń bieżący"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Usunąć zaznaczony program?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Pobieranie..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Kopiowanie plików z danymi..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Ustawienia DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Urządzenie DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Ustawienia urządzenia"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Nazwa:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Typ:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kablowy"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Naziemny"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satelita"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Nieznany"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Liczba LNB:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "Pierwszy satelita:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Ustawienia LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "Drugi satelita:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "Trzeci satelita:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "Czwarty satelita:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Ustawienia LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Źródło:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Wydaje się, że to urządzenie obsługuje funkcję <b><i>"
+"automatycznego skanowania</i></b>. Możesz wybrać <b>AUTO</b> "
+"na liście źródeł, aby umożliwić Kaffeine wyszukiwanie w danym zakresie "
+"częstotliwości."
+"<br>Jeśli funkcji <b><i>automatycznego skanowania</i></b> "
+"nie uda się odnaleźć kanałów, wybierz prawdziwe źródło na liście.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Jeśli nie możesz znaleźć swojej sieci/lokalizacji na liście, wówczas "
+"musisz ją utworzyć. Zajrzyj do $HOME/.kde/share/apps/kaffeine/dvb-x/ i wybierz "
+"istniejący plik jako punkt wyjścia. Wprowadź wartości dla Twojej "
+"sieci/lokalizacji i nadaj jej sensowną nazwę (według konwencji nazewnictwa). "
+"Jeśli uważasz, że Twój nowy plik może być użyteczny dla innych, wyślij go na "
+"adres kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Opcje nagrywania DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Katalog nagrań:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Katalog plików nagrywania z przesunięciem czasowym:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Margines czasu przy starcie:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minut)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Margines czasu przy zakończeniu:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Czas nagrywania natychmiastowego:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Preferowany format:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Transmisja DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Adres transmisji:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Port transmisji:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Port informacyjny:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Różne"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Domyślny zestaw znaków (konieczne ponowne uruchomienie):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Uaktualnij dane skanowania:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Pobierz"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Skopiuj wydarzenia EPG do \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Skopiuj"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Wtyczki DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Nie można pobrać danych DVB z http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tSprawdź połączenie z Internetem i wybierz Tak, aby spróbować "
+"ponownie."
+"<br>\t\t\tLub wybierz Nie, aby zakończyć."
+"<br> Spróbować ponownie?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Niepoprawny katalog nagrań."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Niepoprawny katalog nagrywania z przesunięciem czasowym."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Porty transmisji i informacyjny muszą być różne."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Niepoprawny adres transmisji."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Ustawienia LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Uniwersalne LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Podwójne LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Pojedyńcze LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Przełącznik częstotliwości z podwójnym LO:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Niska częstotliwość:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Wysoka częstotliwość:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Częstotliwość pojedyńczego LO:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Częstotliwość pionowej polaryzacji LO:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Częstotliwość poziomej polaryzacji LO:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Zresetuj"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Nie można otworzyć gniazda transmisji DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Nie można zainicjować gniazda transmisji DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Nie znaleziono programów kodujących dźwięk."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Wczytywanie programu kodującego '%1' zakończone niepowodzeniem."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Nie można utworzyć katalogu: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "bajtów"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD Audio"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Odtwarzaj CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Zgraj CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Wykonawca:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Utwór"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "Wybierz utwory, które chcesz zgrać i naciśnij przycisk <b>Koduj</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Koduj..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Kodowanie CD Audio"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Odtwórz CD Audio"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Odtwórz DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Odtwórz VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Otwórz &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Otwórz &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Otwórz CD &Audio"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Musisz wybrać utwory do zgrania."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Znaleziono wiele płyt CD Audio. Proszę wybrać jedną:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Nie znaleziono płyty CD Audio."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "Wideo DVD"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Znaleziono wiele płyt DVD wideo. Proszę wybrać jedną:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Znaleziono wiele płyt (S)VCD. Proszę wybrać jedną:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Bez tytułu"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Utwór %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Wyszukiwanie lokalnego wpisu CDDB..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Wyszukiwanie zdalnego wpisu CDDB..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Znaleziono pasujący wpis CDDB..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Znaleziono bliski wpis CDDB..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "Trafienia CDDB"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Znaleziono wiele wpisów CDDB. Proszę wybrać jeden:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Wtyczka dla Kaffeine: program Lame kodujący do formatu mp3."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Wtyczka dla Kaffeine: program kodujący do formatu Ogg Vorbis."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Klient DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Nie można otworzyć gniazda informacyjnego."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Nie można połączyć się z gniazdem informacyjnym!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Nie można otworzyć gniazda."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Nie można ustawić opcji gniazda!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Nie można związać gniazda z portem!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Wszystkie rozmiary"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Bardzo mały"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Mały"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Średni"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Duży"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Bardzo duży"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nowe wyszukiwanie"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Wybrana okładka jest niedostępna. Proszę wybrać inną."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Niedostępna okładka"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Pobieranie okładek"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+"Nie znaleziono pasujących obrazków, proszę podać inne kryteria wyszukiwania:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Podaj nowe kryteria wyszukiwania:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Odtwórz"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Odtwórz kolejny/Dodaj do kolejki"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Zaznacz &wszystko"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Utwórz listę odtwarzania z zaznaczonych"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Dodaj &napisy..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Zmień tytuł"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Informacje"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Długość"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Wykonawca"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Rok"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Gatunek"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Napisy"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "w użyciu"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Pliki napisów\n"
+"*.*|Wszystkie pliki"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Wybierz plik napisów"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Wybierz okładkę..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galeria..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtr"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Lista odtwarzania:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Wybierz aktywną listę odtwarzania. Aby zmienić nazwę listy, dokonaj edycji i "
+"potwierdź klawiszem 'Enter'."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Odtwórz listę odtwarzania"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "Powtó&rz"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Zapętl listę odtwarzania"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Losowo"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Odtwarzaj pliki w losowej kolejności"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Automatycznie pobierz okładki"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Automatyczne pobieranie okładek"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Wyczyść bieżącą listę"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "No&wa lista odtwarzania"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importowanie listy..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "Zapi&sz bieżącą listę jako..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "&Usuń bieżącą listę"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Listy odtwarzania Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Wszystkie pliki"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Otwórz listę odtwarzania"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Listy odtwarzania M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Listy odtwarzania PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Zapisz listę odtwarzania"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Lista odtwarzania"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NOWE"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importowanie źródeł multimediów..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(brak napisów)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Inne napisy..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galeria"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "W kolejce: %1 pozycji, czas odtwarzania: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Pozycje: %1, czas odtwarzania: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Usunąć '%1' z listy i z dysku?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Nazwa listy już istnieje"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Podaj inną nazwę listy:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Wybierz napisy"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Plik multimedialny:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Wybierz film"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Plik napisów:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Odtwórz/Pauzuj"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Następny"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Wycisz"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Odtwarzacz Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Odtwarzacz Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Paweł Dąbek (aktualny tłumacz), Jacek Glogosz"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "pdabek@onet.pl, wafelj@wp.pl, wafelj@pf.pl, jacekglogosz@aster.pl"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Odtwarzacz multimedialny dla KDE 3. Może on korzystać z różnych podprogramów do "
+"odtwarzania, domyślnym (i zalecanym) jest xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Twórcy Kaffeine "
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Obecny opiekun"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Pierwotny autor"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Obsługa CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Liczne cenne poprawki."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Poprawka dotycząca przeglądania OSD DVB."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Poprawki w kategoriach DVB."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logo dla Kaffeine 0.8 i inne elementy artystyczne."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animowane logo Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Alternatywne kodowanie dla znaczników meta. Wiele poprawek."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Obsługa wtyczek wyjściowych xine. Wiele poprawek."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Import pliku napisów."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Import M3U. Testowanie."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Edytor PID-ów napisów"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID-y napisów"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Nowy element"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Przesuń w górę"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Przesuń w dół"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Uaktualnij zaznaczone"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Nowy"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Strona:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Podstrona:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Język:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Powtórzony program"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Edytor PID-ów audio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "PID-y audio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Edytor transmisji"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Dostępne kanały:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Lista transmisji:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Edytuj/Usuń prawym kliknięciem)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Nowy..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Szukaj w"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Ofset (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Rozpocznij przeszukiwanie"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtry"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Programy niekodowane (FTA)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Nadawca:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Dodaj zaznaczone"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Dodaj odfiltrowane"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Znaleziono"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Skończone"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Edytor kanałów"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaryzacja"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Częstotliwość:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Szybkość transmisji (SR):"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Kodowane"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID teletekstu:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Identyfikator usługi:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID wideo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Identyfikator strumienia transportowego:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PID-y napisów..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "PID-y audio..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Pasmo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "Wysoka korekcja błędów:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Transmisja:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "Niska korekcja błędów:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Odstęp ochronny:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarchia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulacja:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inwersja:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Ustawienia kodowania"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Program kodujący:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Katalog bazowy:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Wyłącz wszystkie sprawdzenia"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Tryb normalny"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Tryb Paranoia"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalizuj"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Pasek narzędzi CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Opcje Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Szybkość transmisji:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Opcje Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Jakość:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Lista odtwarzania"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Opcje wyłączenia"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Odtwarzacz"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Włącz automatyczne dopasowanie &rozmiaru"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Transmisja &sieciowa"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Nawigacja"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Menu &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Dźwięk"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Wideo"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Współczynnik kształtu"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Pasek zrzutów ekranowych"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Pasek sterowania"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Pasek kontroli głośności"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Pasek kontroli pozycji"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Ustawienia Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Zachowanie"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Zatrzymaj odtwarzanie, kiedy okno ukryte"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Umieść w tacce systemowej"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " s"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "wyłącz"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Czas pojawienia się zapowiedzi tytułu w tacce systemowej"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Uruchom klienta DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Różne opcje"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Użyj alternatywnego (nie Unicode) kodowania dla znaczników meta"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Wybierz alternatywne kodowanie nazw dla znaczników meta\n"
+"(w celu konwersji na Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Wyczyść listę ostatnio otwieranych plików"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Natychmiast rozpocznij odtwarzanie"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Uruchom w trybie pełnoekranowym"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Ustaw sterownik dźwięku"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Ustaw sterownik obrazu"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Ustaw scieżkę do urządzenia VCD/DVD/CD Audio."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Komunikaty o błędach xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Uruchom asystenta instalacji"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Plik(i) do odtworzenia. Może to być plik lokalny, katalog, adres URL lub też "
+"DVD, VCD czy CD Audio."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Uruchom"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Okno odtwarzacza"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Obsługiwane formaty multimediów"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Pliki audio MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Pliki wideo MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Pliki Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Pliki AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Pliki Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Pliki Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Pliki Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Pliki FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Pliki Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Pliki WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Wczytywanie programu odtwarzacze '%1' zakończone niepowodzeniem."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 nie zostało znalezione w ścieżce wyszukiwania."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Otwórz &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Otwórz &katalog..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Zakończ i wyłącz monitor po tym utworze"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Zakończ po tym utworze"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Zakończ po tej liście odtwarzania"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "Tryb z&minimalizowany"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Przełącz &listę/odtwarzacz"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Zachowaj &oryginalne proporcje"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Oryginalny rozmiar"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Podwójny rozmiar"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Potrójny rozmiar"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Silnik &odtwarzacza"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Klient DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Odtwarzacz"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Główne okno"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "Rozszerzenie DPMS serwera X-ów nie zostało znalezione."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Powoduje zakończenie Kaffeine i wyłączenie monitora po zakończeniu pliku/listy "
+"odtwarzania. Aby nastąpiło wyłączenie monitora, opcja \"dpms\" musi być "
+"włączona w pliku konfiguracji X-serwera."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Otwórz plik(i)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Otwórz URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Podaj URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Otwórz katalog"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Brak %1 w napędzie lub zła ścieżka do urządzenia."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Proszę wybrać poprawny napęd:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Asystent instalacji Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Sprawdzenie instalacji"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "OK"
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Nie odnaleziono modułu. Proszę sprawdzić poprawność instalacji!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Znaleziono wersję"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine wymaga KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Kodeki WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Brak kodeków WIN32 w /usr/lib/win32. Odtwarzanie plików Windows Media 9, "
+"nowszych plików Real Media i innych rzadkich formatów, nie będzie możliwe. "
+"Możesz pobrać programy kodujące stąd:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"Nie znaleziono libdvdcss. Odtwarzanie zakodowanych (większości komercyjnych) "
+"DVD nie będzie możliwe. Możesz pobrać bibliotekę stąd (ale jej używanie może "
+"naruszać prawa autorskie w Twoim kraju!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Napęd DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Tryb DMA wyłączony! Aby płynnie odtwarzać DVD uruchom z prawami administratora:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "Nie można sprawdzić trybu DMA. Brak uprawnień lub urządzenia:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Urządzenie DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "Nie znaleziono urządzeń DVB. Funkcje związane z DVB zostaną ukryte."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Dystrybucja"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"Biblioreka Xine-lib dostarczona przez SuSE \"może z powodów prawnych nie "
+"posiadać niektórych funkcji (potencjalne łamanie praw patentowych)\". Należy "
+"użyć pakietów stąd:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "WYNIK"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Natrafiono na problemy, pomimo to Kaffeine może działać."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Wszystko OK!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Użyj Kaffeine jako programu pomocniczego dla strumieni mms:// (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Użyj Kaffeine jako programu pomocniczego dla strumieni rtsp:// (Real Media i "
+"inne)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Utwórz ikonę Kaffeine na pulpicie"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Opcje instalacji"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Jakość usuwania przeplotu"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Bardzo niskie zużycie procesora, najgorsza jakość.</b>"
+"<br>Połowa z pionowej rozdzielczości jest utracona. W niektórych komputerach (z "
+"kartami wideo PCI) może to obniżyć użycie procesora w porównaniu z odtwarzaniem "
+"czystego sygnału (brak usuwania przeplotu)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Niskie zużycie procesora, niska jakość.</b>"
+"<br>Obraz jest rozmyty pionowo, więc efekt przeplotu jest niewidoczny."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Średnie zużycie procesora, średnia jakość.</b>"
+"<br>Obraz jest analizowany i obszary zawierające pozostałości przeplotu są "
+"naprawiane (interpolowane)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Wysokie zużycie procesora, dobra jakość.</b>"
+"<br> Konwersja formatu obrazu DVD podnosi jakość i naprawia efekt "
+"wystrzępionych krawędzi."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Bardzo wysokie zużycie procesora, świetna jakość.</b>"
+"<br> Obok zastosowania inteligentnego algorytmu usuwania przeplotu, podwaja "
+"również liczbę klatek na sekundę (30->60 fps), aby dorównać częstotliwości "
+"odświeżania TV. Wykrywa i odwraca przeplot 3-2 (3-2 pulldown). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Niezwykle wysokie zużycie procesora, świetna jakość z (eksperymentalnymi) "
+"ulepszeniami. </b>"
+"<br>Włącza korekcję efektu judder (odtwarza film z oryginalną prędkością 24 "
+"fps) i wygładza kolory pionowo (naprawia małe kolorowe paski widziane w "
+"niektórych DVD). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Określone przez użytkownika"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Konfiguruj wtyczkę usuwania przeplotu tvtime..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr "* <i>Może wymagać jądra 2.4 z łatą (np.od RedHat) lub jądra 2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Konfiguruj wtyczkę usuwania przeplotu tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Wtyczki efektów"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Dźwięk"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Filtry dźwięku"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Włącz filtry dźwięku"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Dodaj filtr"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Usuń wszystkie filtry"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Wideo"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Filtry wideo"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Włącz filtry wideo"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Parametry silnika xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Opcje %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Podstawowe opcje"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Zaawansowane opcje"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Bazujący na xine moduł odtwarzacza dla Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Obsługa SMIL (Synchronized Multimedia Integration Language) jest rzeczą "
+"podstawową!\n"
+"XinePart może teraz próbować odtworzyć źródła wideo bez jakiejkolwiek "
+"struktury. Czy kontynuować?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Zapisz strumień jako"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Napisy"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Kanał dźwięku"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 z %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|Plik PNG\n"
+"*.bmp|Plik BMP\n"
+"*.xbm|Plik XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Zapisz zrzut ekranu jako"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Port transmisji:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Konfiguruj przyjmowany strumień transmisji"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Adres nadawcy:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Skocz do pozycji:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Błąd xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Komunikat xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Gotowy"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Odtwarzanie"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Plik napisów"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Zapisz strumień jako"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Informacja o utworze"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Kopiuj URL do schowka"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Odtwórz w Kaffeine zewnętrznie"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "Wyślij &strumień transmisji..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "Odbie&rz strumień transmisji..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Zapisz zrzut ekranu..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Zapisz strumień..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Zapisuje bieżący strumień na dysku. Ta funkcja została zablokowana dla "
+"niektórych formatów (np.: Real Media), aby zapobiec potencjalnym problemom "
+"prawnym."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Przełącz tryb zminimalizowany"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pauza"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Przewiń do przodu"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "&Wolno"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Przekocz do przodu (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Przeskocz do tyłu (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Przeskocz do przodu (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Przeskocz do tyłu (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Przeskocz do przodu (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Przeskocz do tyłu (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Przeskocz do pozycji..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Menu DVD po lewej"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Menu DVD po prawej"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Menu DVD u góry"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Menu DVD u dołu"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Wybór menu DVD"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Kanał dźwiękowy"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Wybierz kanał dźwiękowy"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Wizualizacje dźwięku"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Głośniej"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Ciszej"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Usuwanie przeplotu"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Włącz tę opcję dla strumieni z przeplotem, np. dla niektórych DVD."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Automatycznie"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorficzny"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Kwadratowy"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Powiększenie w poziomie"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Pomniejszenie w poziomie"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Powiększenie w pionie"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Pomniejszenie w pionie"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Jakość &usuwania przeplotu"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Ustawienia &wideo"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "Kor&ektor graficzny"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Przełącz &menu"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Tytuł"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Korzeń"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Podobraz"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Kąt"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Moduł"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Tytuły"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Rozdziały"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Kąty"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Informacje o utworze"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Wtyczki &efektów..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Parametry silnika &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Głośność"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Pozycja"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Krótkie kliknięcie: przełącza czas działania/pozostały\n"
+"Długie kliknięcie: przełącza wyświetlanie czasu na ekranie"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Czas odtwarzania"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Wyszukiwanie wpisów CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Utwór CD Audio %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Utwór VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Ustawienia wideo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Barwa"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Nasycenie"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Jasność"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Przesunięcie dźwięku/wideo"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Przesunięcie napisów"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Ogólne ostrzeżenie: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Brak dostępnych informacji."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Ostrzeżenie o bezpieczeństwie: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Serwer z którym się łączysz jest nieznany.\n"
+"Sprawdź poprawność nazwy tego serwera. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Podana nazwa urządzenia wydaje się być nieprawidłowa. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Wydaje się, że sieć jest niedostępna.\n"
+"Proszę sprawdzić ustawienia sieci i nazwę serwera. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Wyjście dźwiękowe jest niedostępne. Urządzenie jest zajęte. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Połączenie zostało odrzucone.\n"
+"Proszę sprawdzić nazwę serwera. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Wybrany plik lub adres nie został znaleziony. Proszę je sprawdzić."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Dostęp do tego źródła został odrzucony."
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Nie można odczytać źródła.\n"
+"Może to być spowodowane brakiem uprawnień, bądź źródło nie zawiera danych (np. "
+"brak płyty w napędzie). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+"Wystąpił problem w trakcie wczytywania biblioteki lub programu dekodującego: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Wydaje się, że źródło jest zaszyfrowane i nie moze być odczytane. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Twoja płyta DVD jest najprawdopodobniej zaszyfrowana. W zależności od prawa "
+"danego kraju, używanie libdvdcss do odczytu tego dysku jest dopuszczalne lub "
+"zabronione."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Nieznany błąd: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Błąd: nie można uruchomić nowego sterownika wideo %1 - używany będzie %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Użycie sterownika wideo: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Błąd: nie można zainicjować sterownika dźwięku %1 - używany będzie %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Użycie sterownika dźwięku: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Inicjalizacja xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Nie można uruchomić silnika xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Używany sterownik dźwiękowy (domyślnie: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Używany sterownik wideo (domyślnie: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Użyj programowego miksera dźwięku"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Pokaż komunikaty OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Rozmiar tekstu OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Czcionka dla komunikatów OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"Nie można uruchomić sterownika wideo '%1' - wypróbowany zostanie 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Żaden sterownik wideo nie zadziałał!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"Nie można uruchomić sterownika dźwięku '%1' - wypróbowany zostanie 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Żaden sterownik dźwięku nie zadziałał!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Nie można utworzyć nowego strumienia xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: otwieranie..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Otwieranie..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Kodek dźwiękowy"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Kodek wideo"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Nie znaleziono wtyczki do obsługi tego źródła"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Źródło wygląda na uszkodzone"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Wybrane źródło nie istnieje"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Źródło nie może być otworzone"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Błąd ogólny"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Wyłącz wyciszenie"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Włącz wyciszenie"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Przewiń do przodu %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Wolno %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Usuwanie przeplotu: włączone"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Usuwanie przeplotu: wyłączone"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Współczynnik kształtu"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Powiększenie X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Powiększenie Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Ustawienia korektora graficznego"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Wzmocnienie głośności"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Wzmocnienie głośności w korektorze graficznym - jeśli dźwięk staje się "
+"hałaśliwy należy wyłączyć tę funkcję."
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Usuń filtr"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Przewinięcie do %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Inicjalizacja GStreamer nieudana!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Wycisz"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Komentarz"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parametry silnika &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "Nie udało się uruchomić GStreamer!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Brak rejestru GStreamer! Czy nie zapomniano uruchomić <b>gst-register</b> "
+"(jako administrator) po instalacji?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Nie można uruchomić sterownika dźwięku '%1' - sprawdzanie innego..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Nie znaleziono odpowiedniego sterownika dźwięku!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Nie można uruchomić sterownika wideo %1 - sprawdzanie innego..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Nie znaleziono odpowiedniego sterownika wideo!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parametry silnika GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Opcje dźwięku"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Preferowany sterownik dźwięku"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Opcje wideo"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Preferowany sterownik wideo"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Konieczne ponowne uruchomienie!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Multimedia"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Opcje multimediów"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Napęd CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Te kanały już istnieją i nie zostały dodane:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Nieudane połączenie z serwerem X-ów!"
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "Zamknięcie głównego okna Kaffeine nie spowoduje zamknięcia programu, lecz przeniesienie go do tacki systemowej. Użyj Zakończ z menu Plik, aby zamknąć program."
+
+#~ msgid "No player"
+#~ msgstr "Brak odtwarzacza"
+
+#~ msgid "No layer"
+#~ msgstr "Brak warstwy"
+
+#~ msgid "Ch %1"
+#~ msgstr "K %1"
+
+#~ msgid "Alternate Layout"
+#~ msgstr "Alternatywny układ"
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "Moduł Kaffeine"
diff --git a/po/pt.po b/po/pt.po
new file mode 100644
index 0000000..71d3b77
--- /dev/null
+++ b/po/pt.po
@@ -0,0 +1,3213 @@
+# translation of pt_PT.po to Portuguese
+# translation of kaffeine.pot to Portuguese
+# Portuguese messages for Kaffeine.
+# This file is distributed under the same license as the kaffeine package.
+# Flávio Moringa <flavio.moringa@caixamagica.pt>, 2004.
+# Diogo Sousa <dsousa@6mil.pt>, 2005.
+msgid ""
+msgstr ""
+"Project-Id-Version: pt_PT\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-11-08 14:22+0000\n"
+"Last-Translator: Diogo Sousa <dsousa@6mil.pt>\n"
+"Language-Team: Portuguese\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-POFile-IgnoreConsistency: Signal:\n"
+"Plural-Forms: nplurals=2; plural=n>1\n"
+"X-Generator: KBabel 1.10\n"
+"X-POFile-SpellExtra: stream win pid Integration TVs DVB XBM judder\n"
+"X-POFile-SpellExtra: KaffeinePart Low Multimedia EPG pids sat xbm lib\n"
+"X-POFile-SpellExtra: chroma pulldown usr fps SMIL streams tvtime OSD Nº\n"
+"X-POFile-SpellExtra: AC LNBs VCD FEC Language dvds libdvdcss kaffeine Ch\n"
+"X-POFile-SpellExtra: Stream Synchronized WIN Pid dvb High upsampling SNR\n"
+"X-POFile-SpellExtra: Kaffeine ms Sat ParteFalsa Pids transponder smi tags\n"
+"X-POFile-SpellExtra: asc srt txt ssa Moringa gst tx GStreamerPart register\n"
+"X-POFile-IgnoreConsistency: Timers\n"
+"X-POFile-IgnoreConsistency: &Player\n"
+"X-POFile-SpellExtra: kaffeinedvbevents epg LNB PIDs Transponder PLS Return\n"
+"X-POFile-IgnoreConsistency: New Item\n"
+"X-POFile-SpellExtra: KaffeineOggVorbis KaffeineMp MP Lame SVCD Can CICAM\n"
+"X-POFile-IgnoreConsistency: Medium\n"
+"X-POFile-IgnoreConsistency: Reset\n"
+"X-POFile-SpellExtra: Atsc XinePart LNC Multiponto\n"
+"X-POFile-IgnoreConsistency: Subtitle\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Actualizar"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Agendado"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Actual/Próximo"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Canal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Início"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Duração"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Título"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Ver Todos os Programas"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Adicionar aos Temporizadores"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Nome:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Canal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Início:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Duração:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Fim:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Gravar como:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Nenhum"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Diário"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Semanal"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Mensal"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Personalizado"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Repetir..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Editor do Temporizador"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Tem que dar um nome!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "A duração tem que ser pelo menos de 1 minuto!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"O nome não pode conter nenhum dos seguintes caracteres: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Configurações Iniciais do 'Transponder'"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Este nome não é único."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Falta o(s) pid(s) de áudio!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "O Pid não pode ser zero!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Tem de escolher alguns dias."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Canais"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Temporizadores"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Guia Electrónico da Programação"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Configurações DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Número"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Nome"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Canais de Áudio"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Gravação Instantânea"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Difusão"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Desfasamento temporal"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "A gravar"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Transmissão"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Seleccione o ícone..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Escolha o ícone do canal"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "TV Digital"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "A TV digital em directo só funciona com o motor do Xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Canal Seguinte do OSD"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Canal Anterior do OSD"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Navegação no OSD"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Evento Seguinte do OSD"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Evento Anterior do OSD"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Mostrar o OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Temporizadores..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Transmissão..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Canais..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Configurar o DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Tudo"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Rádio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Nova Categoria..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Modificar o Ícone..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Apagar a Categoria..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nova Categoria"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Indique um nome para esta categoria:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Tem a certeza que quer apagar esta categoria?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Não é possível obter a informação DVB a partir de "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t \t\tVerifique a sua conectividade à internet e escolha Sim para tentar "
+"outra vez."
+"<br>\t\t\t Ou escolha Não para cancelar."
+"<br>\t\t\tSe já tem este arquivo, copie-o para "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz e escolha Sim,"
+"<br>"
+"<br>Devo tentar outra vez?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Transmissão falhou."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Não foi possível iniciar transmissão."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Temporizador criado e iniciado com sucesso."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "É recomendado definir um canal primeiro!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Temporizador criado com sucesso."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Ainda a gravar."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Ainda a transmitir."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Não é possível sintonizar dvb!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Não é possível definir pid(s)"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Não está nenhum CAM livre"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "O Kaffeine ainda está a gravar. De certeza que quer sair?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "O Kaffeine ainda tem temporizadores em fila. De certeza que quer sair?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Sinal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Trancar:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Editar..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "De certeza que quer apagar todos os canais?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "INICIAR varrimento"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "PARAR varrimento"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "A parar..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Encontrados: %1 TV - %2 rádio(s)"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Não é possível abrir socket de informação DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Lista de temporizadores:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Nova"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Parar/Remover"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Este temporizador está repetido. Deseja saltar a tarefa actual ou remover o "
+"temporizador?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Saltar o Actual"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Apagar o temporizador seleccionado?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "A transferir... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "A copiar os ficheiros de dados..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Configuração do DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Dispositivo de DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Configuração do Dispositivo"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Nome:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tipo:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Cabo"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Terrestre"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satélite"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Número de LNBs:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1º sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Configuração do LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2º sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3º sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4º sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Configuração do LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Origem:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Este dispositivo parece suportar a funcionalidade de <b><i>"
+"pesquisa automática</i></b>. Poderá escolher o <b>AUTO</b> "
+"na lista de Fontes para deixar o Kaffeine procurar numa gama de frequências."
+"<br>Se a <b><i>pesquisa automática</i></b> não conseguir encontrar os seus "
+"canais, escolha uma Fonte real na lista.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Se não conseguir encontrar a sua rede/localização na lista, terá de "
+"criar uma. Procure em $HOME/.kde/share/apps/kaffeine/dvb-x/ e use um ficheiro "
+"existente como ponto de partida. Preencha os valores da sua rede/localização e "
+"dê-lhe um nome adequado (de acordo com a nomenclatura). Se achar que o seu "
+"ficheiro pode ser útil para os outros, envie-o para o "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Opções de Gravação DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Pasta de gravações:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Pasta de desfasamento temporal:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Margem do início:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minutos)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Margem do fim:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Duração da gravação instantânea:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Formato preferido:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Difusão DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Endereço de difusão:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Porto de difusão:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Porto de informação:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Diversos"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Codificação predefinida (necessário reiniciar):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Actualizar informação de varrimento:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Obter"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Colocar os eventos do 'epg' em\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Resultado"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "'Plugins' de DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Não é possível obter informação DVB a partir de "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tVerifique a sua conectividade à internet e seleccione Sim para tentar "
+"outra vez."
+"<br>\t\t\tOu seleccione Não para cancelar."
+"<br> Devo tentar outra vez?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Directoria de gravações inválida."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Directoria de desfasamento temporal inválida."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "As portas de informação e difusão têm que ser diferentes."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Endereço de difusão inválido."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Configuração do LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "LNB Universal"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "LNC Banda-C"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "LNC Banda-C Multiponto"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "LO Duplo"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "LO Simples"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Frequência de mudança do LO duplo:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Frequência de banda baixa:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Frequência de banda alta:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Frequência do LO simples:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Frequência do LO da polaridade vertical:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Frequência do LO da polaridade horizontal:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Reiniciar"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Não é possível abrir socket de difusão DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Não é possível iniciar socket de difusão DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Não foi encontrado nenhum codificador de áudio."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Falhou o carregamento do codificador '%1'."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Não é possível criar a pasta: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bytes"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD de Áudio"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Tocar o CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Extrair o CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artista:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Álbum:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Faixa"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Seleccione as faixas que deseja extrair e carregue no botão <b>Codificar</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Codificar..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Codificação do CD de áudio"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Tocar CD Áudio"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Reproduzir DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Reproduzir VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Abrir &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Abrir &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Abrir &CD-Áudio"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Tem de seleccionar as faixas a extrair."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Foram encontrados vários CDs de Áudio. Escolha um:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Não foi encontrado nenhum CD de áudio."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD de Vídeo"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Foram encontrados vários DVDs de Vídeo. Escolha um:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Foram encontrados vários S(VCD)s. Escolha um:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Sem Título"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Faixa %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "À procura do item de CDDB local ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "À procura do item de CDDB remoto ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Foi encontrada uma ocorrência exacta de um item de CDDB ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Foi encontrada uma ocorrência aproximada de um item de CDDB ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "Ocorrências de CDDB"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Foram encontrados vários itens no CDDB. Escolha um:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Um 'plugin' de codificação de MP3 do Lame para o Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Um 'plugin' de codificação de Ogg Vorbis para o Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Cliente de DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Não foi possível abrir socket de informação."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Não foi possível ligar ao 'socket' de informação!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Não foi possível abrir 'socket'."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Não é possível definir a opção do 'socket'!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Não foi possível ligar ao 'socket'!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Todos os Tamanhos"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Muito Pequeno"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Pequeno"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Médio"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Grande"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Muito Grande"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nova Procura"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "A capa que seleccionou não está disponível. Por favor escolha outra."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Capas Não Disponível"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Transferência de Capas"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Não foram encontradas imagens, indique novos termos de procura:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Indique o novos termos de procura:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Reproduzir"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Reproduzir o Próximo/Adicionar à Fila"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Seleccion&ar Tudo"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Criar Lista de Reprodução a Partir dos Itens Seleccionados"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Adicionar Lege&nda..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Editar o Título"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Informação"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Tamanho"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artista"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Álbum"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Ano"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Género"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Legendas"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "em uso"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Ficheiros de Legendas\n"
+"*.*|Todos os Ficheiros"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Seleccionar o Ficheiro de Legendas"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Escolha uma Capa..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galeria..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtro"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Lista de músicas:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Seleccione a lista de reprodução activa. Para mudar o nome da lista de "
+"reprodução edite-a e confirme com 'Return'."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Tocar Lista De Reprodução"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Repetir"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Lista de reprodução em modo contínuo"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Baral&har"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Reproduzir itens aleatoriamente"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Obter automaticamente as capas"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Obtenção automática das capas"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Limpar a Lista Actual"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "No&va Lista de Reprodução"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importar uma Lista de Reprodução..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Gravar a Lista Actual Como..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Re&mover a Lista Actual"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Listas de Reprodução do Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Todos os Ficheiros"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Abrir a Lista de Reprodução"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Listas de Reprodução M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Listas De Reprodução PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Gravar a Lista de Reprodução"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Lista de Reprodução"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NOVA"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "A importar recursos multimédia..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(sem legendas)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Outra legenda..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galeria"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Em Fila: %1 Entrada(s), Tempo de Reprodução: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Entradas: %1, Tempo de reprodução: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Remover '%1' da lista e do disco?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Esta Lista de Reprodução já Existe"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Indique um nome diferente para a lista de reprodução:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Seleccionar Legendas"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Ficheiro multimédia:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Seleccione o Filme"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Ficheiro de legendas:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Tocar / Pausa"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "Segui&nte"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "S&ilenciar"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Leitor Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Leitor Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Flávio Moringa,Diogo Sousa"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "flavio.moringa@caixamagica.pt,dsousa@6mil.pt"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Um leitor multimédia para o KDE 3. Pode usar várias infra-estruturas para a "
+"reprodução; por omissão usa o xine, e é este o recomendado."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Os Autores do Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Manutenção actual"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Autor original"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Suporte para CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Várias correcções valiosas."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Correcção da navegação do OSD do DVB."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Correcções das categorias do DVB."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logótipo do Kaffeine 0.8 e outros itens artísticos."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animação do logo para o Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Codificação alternativa para as meta tags. Muitas correcções."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Manuseamento de pós 'plugins' do xine. Muitas correcções."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Importação de ficheiros de legendas."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Importação de M3U. Em teste."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Editor de PIDs de Legendas"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PIDs de Legendas"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Novo Item"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Subir"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Descer"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Actualizar a Selecção"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Nova"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Página:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Sub página:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Língua:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Temporizador Repetido"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Editor de PIDs de áudio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "PIDs de Áudio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Editor de Difusão"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Canais disponíveis:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Lista de transmissões:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Clique direito para editar/apagar)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Novo..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Procurar Em"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Deslocamento (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Iniciar a Digitalização"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtros"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Livre para emissão"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Operador:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Adicionar os Seleccionados"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Adicionar os Filtrados"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Encontrado"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Concluído"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Editor de Canais"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nº:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaridade"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frequência:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Frequência de símbolos:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Cifrado"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID do teletexto:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "ID do serviço:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID do vídeo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "ID de transmissão de transporte:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PIDs de Legendas..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "PIDs de Áudio..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Largura de banda:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC alto:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Transmissão:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC baixo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Intervalo de protecção:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarquia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulação:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversão:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Preferências da Codificação"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Codificador:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Pasta de base:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranóia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Desactivar todas as verificações"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Modo normal"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Modo paranóico"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalizar"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Barra de Ferramentas do CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Opções de MP3 do Lame"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Taxa de dados:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Opções do Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Qualidade :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Lis&ta de Reprodução"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Opções de Saída"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Leitor"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Activar &Redimensionamento Automático"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Difusão por &Rede"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navegação"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Menus de &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "Á&udio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Vídeo"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "Pr&oporção"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Barra de Captura de Ecrã"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Barra de Ferramentas de Controlos"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Barra de Volume"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Barra de Feramentas de Posicionamento"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Configuração do Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Comportamento"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Pausar o vídeo quando a janela é minimizada"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Embeber na bandeja do painel"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " s"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "desligado"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Duração do anúncio do títuto na bandeja do painel"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Activar o cliente de DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Opções Diversas"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Usar codificação alternativa (não-Unicode) para Meta tags"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Escolher um nome alternativo para a codificação das Meta tags\n"
+"(de maneira a converter para Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Limpar lista de ficheiros recentes"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Começar a reproduzir imediatamente"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Iniciar no modo de ecrã completo"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Escolher controlador de áudio"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Escolher controlador de vídeo"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Escolher o caminho para o dispositivo de CD-Áudio/VCD/DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Mostrar mensagens de debug do xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Correr ajudante de instalação"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Ficheiro(s) a reproduzir. Pode ser um ficheiro local, um URL, uma directoria "
+"ou 'DVD', 'VCD', 'CD-Áudio'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Iniciar"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Janela do Leitor"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Formatos Mutimédia Suportados"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Ficheiro de Áudio MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Ficheiros de Vídeo MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ficheiros Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Ficheiros AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Ficheiros Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Ficheiros Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Ficheiros Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Ficheiros FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Ficheiros Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Ficheiros WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Falhou o carregamento da parte '%1' do leitor."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 não foi encontrado no caminho de procura."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Abrir um &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Abrir uma &Pasta..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Sair e Desligar Monitor Depois Desta Faixa"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Sair Depois Desta Faixa"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Sair Depois da Lista de Reprodução"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "Modo &Minimalista"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Alternar entre &Lista de Reprodução/Leitor"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Manter a Proporção &Original"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Tamanho Original"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Dobro do Tamanho"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Triplo do Tamanho"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Motor do Leitor"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Cliente de DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Leitor"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Janela Principal"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "A extensão DPMS do Xserver não foi encontrada."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Isto irá sair do Kaffeine e desligar o monitor depois do ficheiro/lista de "
+"reprodução acabar. A opção \"dpms\" tem que estar no seu ficheiro de "
+"configuração do X para o monitor desligar."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Abrir os Ficheiros"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Abrir o URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Indique um URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Abrir a Pasta"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "%1 não encontrado na drive, ou caminho errado para o dispositivo."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Por favor escolha a drive correcta:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Ajudante de Instalação do Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Verificação da Instalação"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ok."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Parte não encontrada. Por favor verifique a sua instalação!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Encontrada a versão"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "O Kaffeine requer o KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Codificadores WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Não foram encontrados codificadores WIN32 em /usr/lib/win32. Não vai conseguir "
+"reproduzir ficheiros Windows Media 9, ficheiros recentes Real Media e alguns "
+"formatos menos comuns. Descarregue os codificadores aqui:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"Não foi encontrada a biblioteca libdvdcss. Não vai conseguir reproduzir DVD's "
+"cifrados (a maioria dos DVD's comerciais). Pode descarregar a biblioteca aqui "
+"(mas usá-la pode violar as leis de copyright do seu país!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Drive de DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Modo de DMA desligado! Para uma reprodução suave de DVD's corra como root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Não é possível verificar o modo de DMA. Permissão negada ou o dispositivo não "
+"existe:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Dispositivo DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Não foram encontrados dispositivos DVB. As funções de DVB ficarão escondidas."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribuição"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"A xine-lib distribuída pela SuSE \" pode não ter certas características devido "
+"a questões legais (possíveis violações de patentes)\". Deve usar os pacotes "
+"disponíveis aqui:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "RESULTADO"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+"Foram encontrados alguns problemas, mas ainda assim o Kaffeine pode funcionar."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Tudo ok!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Usar o Kaffeine como aplicação predefinida para streams mms:// (Microsoft "
+"Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Usar o Kaffeine como aplicação predefinida para streams rtsp:// (Real Media e "
+"outras)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Criar um ícone para o Kaffeine no ambiente de trabalho"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Opções de Instalação"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Qualidade de Desentrelaçamento"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Utilização do processador muito baixa, pior qualidade.</b>"
+"<br>Perde-se metade da resolução vertical. Para alguns sistemas (com placas "
+"gráficas PCI) isto pode diminuir a utilização do processador quando comparado "
+"com a reprodução simples de vídeo (sem desentrelaçamento)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Utilização do processador baixa, má qualidade.</b>"
+"<br>A imagem é desfocada verticalmente por isso os efeitos do entrelaçamento "
+"são removidos."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Utilização do processador média, qualidade média.</b>"
+"<br>A imagem é analisada e as áreas que mostrem artefactos de entrelaçamento "
+"são corrigidas (interpoladas)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Utilização do processador alta, boa qualidade.</b>"
+"<br>A conversão da imagem do formato DVD melhora a qualidade e corrige o erro "
+"de 'chroma upsampling'."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Utilização do processador muito alta, óptima qualidade.</b>"
+"<br>Além de usar algoritmos de desentrelaçamento inteligentes, também duplica a "
+"taxa de fotogramas (30->60fps) de forma a igualar o ritmo das TVs. Detecta e "
+"reverte o 3-2 pulldown. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Enorme utilização do processador, qualidade óptima com melhoramentos "
+"(experimental).</b>"
+"<br>Permite correcção de 'judder' (reproduzir filmes na sua velocidade original "
+"de 24 fps) e esbatimento vertical da cor (corrige pequenas riscas de cores "
+"observáveis em alguns dvds). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Personalizado"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Configurar o 'Plugin' de Desentrelaçamento do 'tvtime'..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Pode necessitar de um kernel 2.4 com correcções(como o da RedHat) ou um "
+"kernel 2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Configurar o 'Plugin' de Desentrelaçamento do tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Plugins de Efeitos"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Áudio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Filtros de Áudio"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Activar os filtros de áudio"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Adicionar Filtro"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Remover Todos os Filtros"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Vídeo"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Filtros de Vídeo"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Activar os filtros de vídeo"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Parâmetros do Motor xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Opções do %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Opções Básicas"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Opções Avançadas"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Uma parte de leitor baseada em xine para o Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"O suporte para a SMIL (Synchronized Multimedia Integration Language) é "
+"rudimentar!\n"
+"O XinePart pode agora tentar reproduzir as fontes de vídeo contidas sem "
+"qualquer disposição. Deseja prosseguir?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Gravar a Transmissão Como"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Legendas"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Canal de Áudio"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 de %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|Ficheiro-PNG\n"
+"*.bmp|Ficheiro-BMP\n"
+"*.xbm|Ficheiro-XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Guardar a Captura Como"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Porto de difusão:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Configurar a Recepção da Transmissão em Difusão"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Endereço do remetente:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Porto:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Saltar para a posição:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Erro do xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Mensagem do xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Pronto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "A reproduzir"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Ficheiro de Legendas"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Gravar 'Stream' como"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Informação da faixa"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Copiar o URL para a Área de Transferência"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Tocar Externamente no Kaffeine"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Enviar Transmissão em Difusão..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Receber Transmissão em Difusão..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Guardar Captura..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Gravar a Transmissão..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Grava a 'stream' actual para o disco rígido. Esta opção foi desactivada para "
+"alguns formatos (por exemplo Real Media) para evitar potenciais problemas "
+"legais."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Comutar Modo Minimalista"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pausa"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Avançar Rapidamente"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Câmara &Lenta"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Saltar Para a Frente (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Saltar Para Trás (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Saltar Para a Frente (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Saltar Para Trás (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Saltar Para a Frente (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Saltar Para Trás (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Saltar Para a Posição..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Menu DVD para a Esquerda"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Menu DVD para a Direita"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Menu DVD para Cima"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Menu DVD para Baixo"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Menu DVD Seleccionar"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Canal de Áudio"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Seleccionar canal de áudio"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Visualização de Áudio"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Aumentar o Volume"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Diminuir o Volume"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Desentrelaçamento"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+"Activar esta opção para streams entrelaçadas, por exemplo alguns DVD's."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namórfico"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Quadrado"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Ampliação Horizontal"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Redução Horizontal"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Ampliação Vertical"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Redução Vertical"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Qualidade de Desentrelaçamento"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Configuração do Vídeo"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Equalizador"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Comutar o &Menu"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Título"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Raiz"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Sub-Imagem"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "Âng&ulo"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Parte"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Títulos"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Capítulos"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Ângulos"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Informação da Faixa"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Plugins de &Efeitos..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Parâmetros do Motor &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volume"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Posição"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Carregar curto: Activar/Desactivar Temporizador Para a Frente/Para Trás\n"
+"Carregar longo: Activar/Desactivar OSD do Temporizador"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Tempo de Reprodução"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "À procura de entradas no CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Faixa de CD Áudio %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Faixa de VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Configuração do Vídeo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Tom"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Saturação"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Contraste"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Brilho"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Desvio Áudio/Vídeo"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Desvio das Legendas"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Aviso Geral: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Não existem informações disponíveis."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Aviso de Segurança: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"O anfitrião a que se está a tentar ligar é desconhecido. \n"
+"Verifique a validade do nome do anfitrião especificado. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "O nome do dispositivo que indicou parece ser inválido. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"A rede parece não estar disponível.\n"
+"Verifique a sua configuração de rede e o nome do servidor. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Saída de áudio indisponível. O dispositivo está ocupado. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"A ligação foi recusada.\n"
+"Verifique o nome do anfitrião . "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"O ficheiro ou endereço especificado não foi encontrado. Por favor verifique-o. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Foi negada a permissão a esta fonte. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"A fonte não pode ser lida.\n"
+"Talvez você não possua permissões suficientes, ou a fonte não contém dados (por "
+"exemplo: não existe um disco na drive). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Ocorreu um problema ao carregar uma biblioteca ou descodificador: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "A fonte parece estar cifrada, e não pode ser lida. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"O seu DVD provavelmente está cifrado. De acordo com as leis do seu país, poderá "
+"ou não, usar a libdvdcss para poder ler este disco. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Erro desconhecido: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+"Erro: Não foi possível iniciar um novo Controlador de Vídeo %1 - usando %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "A usar o Controlador de Vídeo: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Erro: Não foi possível iniciar um novo Controlador de Áudio %1 - usando %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "A usar o Controlador de Áudio: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Iniciar o xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Não foi possível iniciar o Motor xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Controlador de Áudio a usar (por omissão: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Controlador de Vídeo a usar (por omissão: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Usar misturador áudio por software"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Mostrar Mensagens no Ecrã"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Tamanho do texto das Mensagens no Ecrã"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Fonte para as Mensagens no Ecrã"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"Não foi possível inicializar o Controlador de Vídeo '%1' - a tentar 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Todos os Controladores de Vídeo falharam ao inicializar!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"Não foi possível inicializar o Controlador de Áudio '%1' - a tentar 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Todas os Controladores de Áudio falharam ao inicializar!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Não foi possível criar uma nova 'stream' xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: a abrir..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "A abrir..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Codificador do Áudio"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Codificador do Vídeo"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Não foi encontrado nenhum 'plugin' para este recurso"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "O recurso parece estar quebrado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "O recurso pedido não existe"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "O recurso não pode ser aberto"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Erro genérico"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Mudo Desligado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Mudo Ligado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Avanço Rápido %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Câmara Lenta %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Desentrelaçamento: ligado"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Desentrelaçamento: desligado"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Proporção"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Ampliação em X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Ampliação em Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Configurações do Equalizador"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Ganho de volume"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Ganho de Volume para o Equalizador - Se o som ficar distorcido desligue esta "
+"opção"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Apagar Filtro"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "A posicionar em %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "A inicialização do GStreamer falhou!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Silenciar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Comentário"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parâmetros do Motor &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "O GStreamer não pôde ser inicializado!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Falta o Registo do GStreamer! Esqueceu-se de correr o <b>gst-register</b> "
+"(como 'root') após a instalação?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"Não foi possível inicializar o Controlador de Áudio '%1' - a tentar outro..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Não foi encontrado nenhum controlador de áudio válido!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"Não foi possível inicializar o Controlador de Vídeo '%1' - a tentar outro..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Não foi encontrado nenhum controlador de vídeo válido!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parâmetros do Motor GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Opções de Áudio"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Controlador de áudio preferido"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Opções de Vídeo"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Controlador de vídeo preferido"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* É necessário um novo arranque!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Meio"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Opções do Meio"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Leitor de CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "ParteFalsa"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Estes canais já existem e não foram adicionados:"
diff --git a/po/pt_BR.po b/po/pt_BR.po
new file mode 100644
index 0000000..8ad3375
--- /dev/null
+++ b/po/pt_BR.po
@@ -0,0 +1,3317 @@
+# translation of kaffeine.po to Brazilian Portuguese
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+#
+# Helio Chissini de Castro <helio@kde.org>, 2004.
+# Gustavo Pichorim Boiko <boiko@conectiva.com.br>, 2004.
+# Jose Monteiro <jf.monteiro@yahoo.com>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-02-01 10:28-0300\n"
+"Last-Translator: Fábio Henrique de Souza <fabiohsouza@gmail.com>\n"
+"Language-Team: Brazilian Portuguese <kde-i18n-pt_br@mail.kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=2; plural=(n > 1);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Atualizar"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Agendado"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Atual/Próximo"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Canal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Início"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Duração"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Título"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Ver Todos os Programas"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Adicionar aos Temporizadores"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Nome:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Canal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Início:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Duração:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Fim:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Gravar como:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Nenhum"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Diário"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Semanal"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Mensal"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Personalizado "
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Repetir..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Editor de Temporizador"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Você deve dar-lhe um nome!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "A duração deve ser ao menos de 1 minuto!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"O nome não pode conter nenhum dos seguintes caracteres: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Configurações Iniciais do Transponder"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Este nome não é único."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Faltando o(s) pid(s) de áudio!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "O Pid não pode ser zero!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Você tem que escolher alguns dias."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Canais"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Temporizadores"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Guia Eletrônico de Programação"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Configurações DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Número"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Nome"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Canais de Áudio"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Gravação Instantânea"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Transmissão"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Deslocando Tempo"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Gravando"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Transmitindo"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Selecione o ícone..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Escolha o ícone do canal"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "TV Digital"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "A TV Digital Ao Vivo somente funciona com o motor do xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Próximo Canal do OSD"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Canal Anterior do OSD"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Navegação no OSD"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Próximo Evento do OSD"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Evento Anterior do OSD"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Mostrar o OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Temporizadores..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Transmitindo..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Canais..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Configurar o DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Tudo"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Rádio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Nova Categoria..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Alterar Ícone..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Excluir Categoria..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nova Categoria"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Entre com um nome para esta categoria:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Você realmente deseja excluir esta categoria?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Não é possível obter a informação DVB a partir de "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t \t\tVerifique a sua conexão com a internet e escolha Sim para tentar "
+"outra vez."
+"<br>\t\t\t Ou escolha Não para cancelar."
+"<br>\t\t\tSe você já tem este arquivo, copie-o para "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz e escolha Sim,"
+"<br>"
+"<br>Devo tentar outra vez?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Transmissão falhou."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Impossível iniciar transmissão."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Temporizador criado e iniciado com sucesso."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "É recomendado que você defina um canal primeiro!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Temporizador criado com sucesso."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Ainda gravando."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Ainda transmitindo."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Não é possível sintonizar dvb!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Não é possível definir pid(s)"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Nenhum CAM está livre"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine ainda está gravando. Tem certeza que deseja sair?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"O Kaffeine ainda tem temporizadores em fila. Tem certeza que deseja sair?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Sinal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Travar:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Editar..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Você realmente deseja excluir todos os canais?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "INICIAR busca"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "PARAR busca"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Parando..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Encontrado: %1 TV - %2 rádio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Não é possível abrir socket de informação DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Lista de Temporizadores:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Novo"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Parar/Excluir"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Este temporizador é repetido. Deseja saltar a tarefa atual ou remover o "
+"temporizador?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Saltar Atual"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Excluir o temporizador selecionado?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Baixando..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Copiando arquivos de dados..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Configurações DVB "
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Dispositivo DVB "
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Configurações do Dispositivo "
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Nome:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tipo:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Cabo"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Terrestre"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satélite"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Número de LNBs:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1º sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Configurações do LNB ..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2º sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3º sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4º sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Configurações do LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Origem:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Este dispositivo parece suportar a funcionalidade de <b><i>"
+"pesquisa automática</i></b>. Você poderá escolher <b>AUTO</b> "
+"na lista de Fontes para deixar o Kaffeine procurar em uma faixa de frequências."
+"<br>Se a <b><i>pesquisa automática</i></b> não conseguir encontrar os seus "
+"canais, escolha uma Fonte real na lista.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Se você não conseguir encontrar a sua rede/localização na lista, você "
+"terá que criar uma. Procure em $HOME/.kde/share/apps/kaffeine/dvb-x/ e use um "
+"arquivo existente como ponto de partida. Preencha os valores da sua "
+"rede/localização e dê-lhe um nome adequado (seguir a convenção dos nomes). Se "
+"achar que o seu arquivo pode ser útil para os outros, envie-o para o "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Opções de Gravação DVB "
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Diretório de gravações:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Diretório de deslocamento de tempo:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Margem inicial:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minutos)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Margem final:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Duração da Gravação Instantânea:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Formato preferido:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Transmitindo DVB "
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Endereço de Transmissão:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Porta de Transmissão:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Porta de Informação:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Outros"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Codificação padrão (necessário reiniciar):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Atualizar dados da busca:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Baixar"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Despejar eventos epg para \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Despejo"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Plugins DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Não foi possível obter a informação DVB a partir de "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tVerifique a sua conexão com a internet e escolha Sim para tentar "
+"outra vez."
+"<br>\t\t\tOu escolha Não para cancelar."
+"<br> Devo tentar outra vez?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Diretório de gravações inválido."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Diretório de deslocamento de tempo inválido."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Portas de Transmissão e Informação devem ser diferentes."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Endereço de transmissão inválido."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Configurações do LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "LNB Universal"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "LO Duplo"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "LO Simples"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Frequência de mudança do LO duplo:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Frequência de banda baixa:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Frequência de banda alta:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Frequência do LO simples:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Frequência do LO da pol. vertical:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Frequência do LO da pol. horizontal:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Reiniciar"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Não é possível abrir soquete de transmissão DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Não é possível iniciar soquete de transmissão DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Nenhum codificador de áudio foi encontrado."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "O carregamento do codificador '%1' falhou."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Não foi possível criar a pasta:"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bytes"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "CD de Áudio "
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Reproduzir CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Extrair CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artista: "
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Álbum: "
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Faixa"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Selecione as faixas que deseja extrair e clique no botão <b>Codificar</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Codificar..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Codificação do CD de Áudio"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Reproduzir CD de Áudio "
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Reproduzir DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Reproduzir VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Abrir &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Abrir &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Abrir CD de &Áudio"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Você deve selecionar as faixas para extrair."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Foram encontrados vários CDs de Áudio. Escolha um:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Nenhum CD de Áudio encontrado."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD de Vídeo"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Foram encontrados vários DVDs de Vídeo. Escolha um:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Foram encontrados vários S(VCD)s. Escolha um:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Sem Título"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Faixa %1 "
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Buscando entrada cddb local ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Buscando entrada cddb remota ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Encontrada uma entrada exata no cddb ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Encontrada uma entrada aproximada no cddb ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "Correspondentes CDDB"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Foram encontradas várias entradas CDDB próximas . Escolha uma:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Um plugin de codificação Lame mp3 para o Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Um plugin de codificação Ogg Vorbis para o Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Cliente de DVB "
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Não é possível abrir soquete de informação."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Não foi possível ligar o soquete de informação!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Não foi possível abrir soquete."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Não foi possível definir a opção do soquete!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Não foi possível ligar o soquete!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Todos os Tamanhos "
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Muito Pequeno"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Pequeno"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Médio "
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Grande "
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Muito Grande"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Nova Busca "
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+"A capa que você escolheu não está disponível. Por favor, selecione outra. "
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Capa Não Disponível "
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Transferência de Capas"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Nenhuma imagem encontrada, indique novos termos de busca:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Indique novos termos de busca:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Reproduzir"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Reproduzir Próximo/Adicionar à Fila"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Selecionar &Todos"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Criar Lista de Reprodução à Partir da Seleção"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Adicionar Lege&nda..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Editar Título"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Info"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Tamanho"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artista"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Álbum"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Ano"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Gênero"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Legendas"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "em uso"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Arquivos de Legenda\n"
+"*.*|Todos os Arquivos"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Seleciona um Arquivo de Legenda"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Escolha uma Capa..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galeria..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtro"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Lista de Reprodução:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Seleciona a Lista de Reprodução ativa. Para mudar o nome da Lista de "
+"Reprodução, edite-o e confirme com 'Enter'."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Reproduzir Lista de Reprodução"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Repetir"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Lista de Reprodução em modo contínuo (loop)"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Aleatório"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Reproduz os ítens em ordem aleatória"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Obter automaticamente as capas"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Obtenção automática das capas"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "Limpar Lista de Reprodução Atual"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "No&va Lista de Reprodução"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importar Lista de Reprodução"
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Salvar Lista de Reprodução Atual Como..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Re&mover Lista de Reprodução Atual"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Listas de Reprodução do Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Todos os Arquivos"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Abrir Lista de Reprodução"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Listas de Reprodução M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Listas de Reprodução PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Salvar Lista de Reprodução"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Lista de Reprodução"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NOVO"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importando recursos de mídia"
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(sem legendas)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Outra legendas..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galeria"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Fila: %1 Entradas, Tempo de Reprodução: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Entradas: %1, Tempo de Reprodução: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Remover %1 da lista e do disco?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "O Nome da Lista de Reprodução já existe."
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Entre com um nome diferente para a Lista de Reprodução:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Selecionar uma Legenda"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Arquivo de mídia:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Selecionar o Filme"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Arquivo de Legenda:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Reproduzir / Pausar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Proximo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Mudo"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Reprodutor Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Reprodutor Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Hélio Chissini de Castro, Fábio Henrique de Souza"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "helio@kde.org, fabiohsouza@gmail.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Um reprodutor de mídia para o KDE 3. Pode utilizar múltiplos backends para "
+"reprodução, o padrão (e recomendado) é o xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Os Autores do Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Mantenedor atual"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Autor original"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Suporte para CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Várias correções valiosas."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Correção da navegação do OSD do DVB."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Correções das categorias do DVB."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logotipo do Kaffeine 0.8 e outros ítens artísticos."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animação do logo para o Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Codificação alternativa para meta-tags. Muitas correções."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Pós-tratamento de plugins do xine. Muitas correções."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Importação de arquivos de legenda."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Importação de M3U. Em Teste."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Editor de PIDs de Legenda"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PIDs de Legenda"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Novo Item"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Mover para Cima "
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Mover para Baixo "
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Atualizar Selecionado"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Novo"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Página:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Sub página:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Idioma:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Temporizador Repetido"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Editor de PIDs de Áudio"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "PIDs de Áudio :"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Editor de Transmissão"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Canais disponíveis:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Lista de Transmissão:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Clique direito para editar/excluir)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Novo..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Procurar Em"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Deslocamento (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Iniciar Busca"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtros"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Livre para transmitir"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Provedor:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Adicionar Selecionado"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<<Adicionar Filtrado"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Encontrado"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Feito"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Editor de Canais"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nº:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaridade"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frequência:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Frequência de símbolos:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Cifrado"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID do Teletexto:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "ID do Serviço:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID do Vídeo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "ID do Fluxo de Transporte:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PIDs de Legenda..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "PIDs de Áudio..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Largura de Banda:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC alto:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Transmissão:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC baixo:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Intervalo de proteção:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarquia:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulação:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversão:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Preferências da Codificação"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Codificador:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Diretório base:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "... "
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranóia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Desabilitar todas as verificações"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Modo normal"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Modo paranóia"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalizar"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Barra de Ferramentas CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Opções do Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR "
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Taxa de Bits:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Opções do Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Qualidade :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Lista de Reprodução"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Opções de Saída"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Reprodutor"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Habilitar &Redimensionamento Automático"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Tra&nsmissão por Rede"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navegação"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Menus de &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Áudio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Vídeo"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "%Proporção"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Barra de Ferramentas de Captura de Tela"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Barra de Ferramenta de Controles"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Barra de Ferramenta de Volume"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Barra de Ferramentas de Posição"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Configuração do Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Comportamento"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Pausar vídeo quando a janela for minimizada"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Embutir na bandeja do sistema"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " seg"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "desligado"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Duração do anúncio de título na bandeja do sistema"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Habilitar cliente de DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Opções Diversas"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Utilize uma codificação alternativa (não-Unicode) para as Meta-tags"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Escolha um nome de codificação alternativa para as Meta-tags\n"
+"(para depois converter em Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Limpar lista de arquivos recentes"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Iniciar reproduzindo imediatamente"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Iniciar em modo de tela cheia"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Definir driver de áudio"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Definir driver de vídeo"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Definir o caminho do dispositivo de Audio-CD/VCD/DVD"
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Saída de mensagens de depuração do xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Executar o assistente de instalação"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Arquivos(s) para reproduzir. Pode ser um arquivo local, uma URL, um diretório, "
+"ou 'DVD', 'VCD', 'CD de Áudio'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Iniciar "
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Janela do Reprodutor"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Formatos Suportados de Mídia"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Arquivos de Áudio MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Arquivos de Vídeo MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Arquivos Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Arquivos AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Arquivos Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Arquivos Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Arquivos Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Arquivos FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Arquivos Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Arquivos WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Carregamento do reprodutor '%1' falhou."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 não encontrado no caminho de busca."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Abrir &URL... "
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Abrir &Diretório..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Sair &e Desligar o Monitor Depois Desta Faixa"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Sairr Depois Desta Faixa"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Sair Depois da Lista de Reprodução"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Modo Mínimo"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Alternar entre Lista de Re&produção/Reprodutor"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Preservar Proporção &Original "
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Tamanho Original"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Tamanho Duplo"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Tamanho Triplo"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Motor do Re&produtor"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Cliente DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Reprodutor"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Janela Principal"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "Extensão DPMS do Xserver não foi encontrada."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Isto fará com que o Kaffeine seja fechado e o monitor seja desligado depois que "
+"a faixa/lista de reprodução terminar. A opção \"dpms\" precisa estar no seu "
+"arquivo de configuração do Xserver para que o monitor seja desligado."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Abrir Arquivo(s)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Abrir URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Digite uma URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Abrir Pasta "
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Sem %1 no dispositivo, ou caminho inválido para o dispositivo."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Selecione o dispositivo correto:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Assistente de Instalação do Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Verificação da Instalação"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-XINE"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ok."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Parte não encontrada. Por favor verifique sua instalação!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Versão encontrada"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine requer KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Codecs WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Nenhum codificador WIN32 encontrado em /usr/lib/win32. Você não será capaz de "
+"reproduzir arquivos Windows Media 9. Baixe os codificadores aqui:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss não encontrada. Você não será capaz de reproduzir DVDs (em sua "
+"maioria comerciais) criptografados. Você pode obter a biblioteca aqui (mas seu "
+"uso pode violar leis de Copyright de seu país!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Dispositivo de DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Modo DMA desligado! Para reprodução de DVD sem travamentos, execute como root:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Impossível verificar modo DMA. Permissão negada ou dispositivo inexistente:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Dispositivo-DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Nenhum Dispositivo-DVB encontrado. As funções relacionadas a DVB ficarão "
+"ocultas."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribuição"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"Na xine-lib distribuída pela SuSE \"alguns recursos podem não estar disponívels "
+"devido à problemas legais (potencial violação de patente)\". Você deve utilizar "
+"os pacotes daqui:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "RESULTADO"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+"Alguns problemas foram encontrados, mas ainda assim o Kaffeine deve funcionar."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Tudo ok!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Usar o Kaffeine como aplicação predefinada para fluxos mms:// (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Usa o Kaffeine como aplicação predefinida para fluxos rtsp:// (Real Media e "
+"outros )"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Criar um ícone do Kaffeine no desktop"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Opções de Instalação"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Qualidade do &Desentrelaçamento"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Muito baixo uso de cpu, péssima qualidade.</b><b>"
+"Parte da resolução vertical é perdida. Para alguns sistemas ( com placas de "
+"vídeo PCI ) isto pode reduzir o uso de cpu quando comparado com a reprodução "
+"simples de vídeo ( sem desentrelaçamento)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Baixo uso de cpu, qualidade pobre.</b>"
+"<br>A imagem é desfocada verticalmente por isso os efeitos de entrelaçamento "
+"são removidos."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Médio uso de cpu; qualidade mediana.</b>"
+"<br>A imagem é analisada e as áreas mostrando artefatos de entrelaçamento são "
+"corrigidas (interpoladas)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Alto uso de cpu, boa qualidade.</b>"
+"<br>A conversão da imagem do formato dvd melhora a qualidadade e corrige o erro "
+"'chroma upsampling'."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Uso grande de cpu, excelente qualidade.</b>"
+"<br> Além de usar algoritmos inteligentes de desentrelaçamento, também dobra o "
+"taxa de quadros ( 30->60fps) de forma a igualar taxa de atualização das TVs. "
+"Detecta e reverte o 3-2 pulldown. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Uso extremamente alto de cpu, qualidade excelente com melhorias ( "
+"experimental )</b>"
+"<br> Habilita a correção judder (reproduz filmes na sua velociade de original "
+"de 24fps) e suavização de colorização vertical (corrige pequenas listras "
+"coloridas vistas em alguns dvd's). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Definido pelo usuário"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Configurar Plugin de Desentrelaçamento do tvtime..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr "*<i>Pode requerer kernel 2.4 com correções ou kernel 2.6.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Configurar plugin de Desentrelacçamento do tvtime"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Plugins de Efeito"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Áudio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Filtros de Áudio"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Habilitar filtros de áudio"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Adicionar Filtro"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Remover Todos os Filtros"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Vídeo"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Filtros de Vídeo"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Habilitar filtros de vídeo"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Parâmetros do Motor xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Opções de %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Opções Básicas"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Opções Avançadas"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Uma parte de reprodutor baseada no xine para o Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"O suporte à SMIL (Linguagem para Integração Sincronizada de Multimídia) é "
+"rudimentar!\n"
+"O XinePart pode agora tentar reproduzir origens de vídeo contidas sem qualquer "
+"disposição. Deseja prosseguir?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Salvar Fluxo como "
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Legenda"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Canal de áudio"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 de %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|Arquivo PNG\n"
+"*.bmp|Arquivo BMP\n"
+"*.xbm|Arquivo XBM"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Salvar Captura de Tela como"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Porta de Transmissão:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Configurar a Recepção do Fluxo de Transmissão"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Endereço do remetente:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Porta: "
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Saltar para a posição:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Erro do xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Mensagem do xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Pronto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Reproduzindo"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Arquivo de Legenda"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Salvar Fluxo como"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Informação da faixa"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Copiar URL para a Área de Transferência"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Reproduzir no Kaffeine Externamente"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Enviar Fluxo de Transmissão..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Receber Fluxo de Transmissão..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Salvar Captura de Tela"
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Salvar Fluxo"
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Salva o fluxo atual para o disco. Este recurso foi desabilitado para alguns "
+"formatos (e.g. Real Media) para prevenini potenciais problemas legais."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Mudar para Modo Mínimo"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pausar"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Avanço Rápido"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Reprodução &Lenta"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Salto Progressivo (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Salto Regressivo (20s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Salto Progressivo (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Salto Regressivo (1m)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Salto Progressivo (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Salto Regressivo (10m)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Saltar para a posição..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Menu DVD para a Esquerda"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Menu DVD para a Direita"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Menu DVD para Cima"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Menu DVD para Baixo"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Menu DVD Selecionar"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Canal de Áudio"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Selecione o canal de áudio"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Visualização de Áudio"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Aumentar Volume"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Diminuir Volume"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Desentrelaçamento"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Ative isso para fluxos com entrelaçamento, alguns DVD's por exemplo."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Auto"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namórfico"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Quadrado"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Mais Zoom Horizontal"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Menos Zoom Horizontal"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Mais Zoom Vertical"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Menos Zoom Vertical"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Qualidade do &Desentrelaçamento"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Configurações de &Vídeo"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Equalizador"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Alternar &Menu"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Título"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Raiz"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Miniatura"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "Ân&gulo"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Parte"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Títulos "
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Capítulos "
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Ângulos "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Informações da Faixa"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Plugins de Efeito..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Parâmetros do Motor &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volume"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Posição"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Clique rápido: Alternar o Temporizador Para a Frente/Para Trás\n"
+"Clique longo: Alternaar o OSD do Temporizador"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Tempo de Reprodução"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Procurando por entradas no CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Faixa de CD de Áudio %1 "
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Faixa de VCD %1 "
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Configurações de Vídeo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Coloração"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Saturação"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Contraste"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Brilho"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Desvio de Áudio/Vídeo"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Desvio de Legendas"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Aviso Geral: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Sem Informações disponíveis."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Aviso de Segurança: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"O servidor que você está tentando se conectar é desconhecido.\n"
+"Verifique a validade do nome do servidor especificado."
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "O nome do dispositivo que você especificou parece ser inválido."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Não foi possível acessar a rede.\n"
+"Verifique suas configurações de rede e o nome do servidor."
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Saída de áudio indisponível. Dispositivo ocupado."
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"A conexão foi recusada.\n"
+"Verifique o nome do servidor."
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"O arquivo ou url especificado não foi encontrado. Por favor verifique-o."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Permissão para está origem foi negada."
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"A origem não pode ser lida.\n"
+"Talvez você não tenha permissões para isso, ou a origem não contém dados ( ex. "
+"não há disco no dispositivo)."
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Um problema ocorreu ao carregar uma biblioteca ou um decodificador:"
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "A origem parece estar criptografada, e não pode ser lida."
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Seu DVD provavelmente está criptografado. De acordo com as leis de seu país, "
+"você poderá ou não usar a libdvdcss para poder ler este disco."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Erro desconhecido: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Erro: Não foi possível iniciar o novo Driver de Vídeo %1 - usando %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Usando Driver de Vídeo: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Erro: Não foi possível iniciar o novo Driver de Áudio %1 - usando %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Usando Driver de Áudio: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Iniciar xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Não posso iniciar o Motor xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Driver de Áudio para usar (padrão: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Driver de Vídeo para usar (padrão: auto)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Usar mixagem de áudio por sofware"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Mostrar Mensagens OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Tamanho do texto OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Fonte para as Mensagens OSD"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Não foi possível iniciar o Driver de Vídeo '%1' - tentando 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Todos os Drivers de Vídeo falharam ao inicializar!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Não foi possível iniciar o Driver de Áudio '%1' - tentando 'auto'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Todos os Drivers de Áudio falharam ao inicializar!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Não foi possível criar um novo Fluxo do xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: abrindo..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Abrindo..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Codec de Áudio"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Codec de Vídeo"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Nenhum plugin encontrado para manipular este recurso"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Este recurso parece estar quebrado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "O recurso requisitado não existe"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "O recurso não pode ser aberto"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Erro genérico"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Mudo Desligado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Mudo Ligado"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Avanço Rápido %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Reprodução Lenta %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Desentrelaçamento: ligado"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Desentrelaçamento: desligado"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Proporção"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Zoom X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Zoom Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "mseg"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Configurações do Equalizador"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Ganho de Volume"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Ganho de Volume para o Equalizador - Se o som ficar distorcido desabilite essa "
+"opção"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Excluir Filtro"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Posicionando em %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "GStreamer falhou ao inicializar!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Mudo"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Comentário"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parâmetros do Motor do &GStreamer "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "O GStreamer não pôde ser inicializado!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Faltando o Registro do GStreamer! Você esqueceu-se de executar o <b>"
+"gst-register</b> (como 'root') após a instalação?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Não foi possível iniciar o Driver de Áudio '%1' - tentando outro..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Nenhum driver de áudio válido foi encontrado!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Não foi possível iniciar o Driver de Vídeo '%1' - tentando outro..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Nenhum driver de vídeo válido foi encontrado!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parâmetros do Motor do GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Opções de Audio"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Driver de áudio preferido"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Opções de Vídeo"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Driver de vídeo preferido"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Reinício requerido!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Mídia"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Opções da Mídia"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Dispositivo de CD,VCD e DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Estes canais já existem e não foram adicionados:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Falha ao conectar ao X-Server!"
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "Fechando a janela principal, o Kaffeine continuará em execução, porém apenas como um ícone na bandeja do sistema. Use Sair do menu Arquivo para sair do aplicativo."
+
+#~ msgid "No player"
+#~ msgstr "Sem reprodutor"
+
+#~ msgid "No layer"
+#~ msgstr "Sem camada"
+
+#~ msgid "Ch %1"
+#~ msgstr "Ch %1"
+
+#~ msgid "Alternate Layout"
+#~ msgstr "Disposição Alternada"
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "Parte do Kaffeine"
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-C"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-T"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-S"
+
+#, fuzzy
+#~ msgid "No DVD Video found."
+#~ msgstr "Nenhum CD de Áudio encontrado."
+
+#, fuzzy
+#~ msgid "No (S)VCD found."
+#~ msgstr "Nenhum CD de Áudio encontrado."
+
+#~ msgid "Developer"
+#~ msgstr "Desenvolvedor"
+
+#~ msgid "DVB Support"
+#~ msgstr "Suporte DVB"
+
+#~ msgid "AudioCD - DVD - VCD"
+#~ msgstr "AudioCD - DVD - VCD"
+
+#~ msgid "DVD"
+#~ msgstr "DVD "
+
+#~ msgid "VCD"
+#~ msgstr "VCD"
+
+#~ msgid " min"
+#~ msgstr "min"
+
+#~ msgid ""
+#~ "Interval to fake keypresses\n"
+#~ "(prevent screensaver from activating)"
+#~ msgstr ""
+#~ "Intervalo para pressionamento falso de teclas\n"
+#~ "( evita ativação de screensaver )"
+
+#~ msgid "Open Files"
+#~ msgstr "Abrir Arquivos"
+
+#~ msgid "Open Directory"
+#~ msgstr "Abrir Diretório"
+
+#~ msgid "Open DVD"
+#~ msgstr "Abrir DVD"
+
+#~ msgid "Open VCD"
+#~ msgstr "Abrir VCD"
+
+#~ msgid "This player doesn't support DVD playback."
+#~ msgstr "Este leitor não suporta reprodução de DVD."
+
+#~ msgid "This player doesn't support VCD playback."
+#~ msgstr "Este leitor não suporta reprodução de VCD."
+
+#~ msgid "This player doesn't support Audio CD playback."
+#~ msgstr "Este leitor não suporta reprodução de CD de Áudio."
+
+#~ msgid "Create Go!-Tab"
+#~ msgstr "Criar a Aba Ir!"
+
+#, fuzzy
+#~ msgid "Audio Browser"
+#~ msgstr "Codec de Áudio"
+
+#~ msgid "Name must not start with ( > )!"
+#~ msgstr "O nome não pode começar com ( > )!"
+
+#~ msgid "Audio:"
+#~ msgstr "Áudio:"
+
+#~ msgid "Playlist Toolbar"
+#~ msgstr "Barra de Ferramentas de Lista de Reprodução"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Selecionar Lista de Reprodução"
+
+#~ msgid "&Next in Playlist/Queue"
+#~ msgstr "&Próximo na Lista de Reprodução/Fila"
+
+#~ msgid "Pre&vious in Playlist"
+#~ msgstr "Anterior na Lista de Reprodução"
+
+#~ msgid "Next Channel"
+#~ msgstr "Próximo Canal"
+
+#~ msgid "Previous Channel"
+#~ msgstr "Canal Anterior "
+
+#~ msgid "Go!"
+#~ msgstr "Ir!"
+
+#~ msgid "Kaffeine Playlist"
+#~ msgstr "Lista de Reprodução do Kaffeine"
+
+#~ msgid "Undock"
+#~ msgstr "Desanexar"
+
+#~ msgid "Undock Playlist Window"
+#~ msgstr "Desanexar Janela da Lista de Reprodução"
+
+#~ msgid "Dock"
+#~ msgstr "Anexar"
diff --git a/po/ru.po b/po/ru.po
new file mode 100644
index 0000000..0cf8ea0
--- /dev/null
+++ b/po/ru.po
@@ -0,0 +1,3184 @@
+# translation of kaffeine.po to
+# Vladimir Marteev <admin@archlinux.ru>, 2004, 2005.
+# Nick Shaforostoff <shafff@ukr.net>, 2005, 2006.
+# artjom <sgartjom@mail.ru>, 2006.
+# This file is distributed under the same license as the Kaffeine package.
+# Copyright (C) 2003 Juergen Kofler <kaffeine@gmx.net>
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-12-14 12:52+0300\n"
+"Last-Translator: Andrey Cherepanov <sibskull@mail.ru>\n"
+"Language-Team: Russian <kde-russian@lists.kde.ru>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>"
+"=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Программа передач"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Обновить"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Отложено"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Текущий/Следующий"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Канал"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Начало"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Длительность"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Заголовок"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Просмотр всех программ"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Добавить к таймерам"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Имя:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Канал:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Начало:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Длительность:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Найден:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Записывать как:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Отключено"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Ежедневно"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Еженедельно"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Ежемесячно"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Другой интервал"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Повтор..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Редактор таймера"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Задайте название."
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Длительность должна быть не меньше 1 минуты."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "В имени не допускается использование симолов > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Начальные параметры транспондера"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Это имя не уникально."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Отсутствуют аудио pid(ы)."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Pid не должен равняться нулю."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Выберите дни."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Каналы"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Таймеры"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Электронная программа передач"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "Экранное меню"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Установки DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Номер"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Имя"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Аудио-каналы"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Мгновенная запись"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Трансляция"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Остановка времени"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Запись"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Трансляция"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Выбрать значок..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Выбрать значок канала"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Цифровое ТВ"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "\"Живой\" просмотр цифрового ТВ возможен только с движком xine"
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Экранное меню: Следующий канал"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Экранное меню: Предыдущий канал"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Экранное меню: Переключить канал"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Экранное меню: Следующее событие"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Экранное меню: Предыдущее событие"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Показать Экранное меню"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "Электронная программа передач"
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Таймеры..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Трансляция"
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Каналы..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Настройка DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Все"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TВ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Радио"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Создать категорию..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Сменить значок..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Удалить категорию..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Новая категория"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Введите название категории:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Удалить эту категорию?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Невозможно получить данные DVB из "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t\t\tПроверте свое соединение с интернетом, и нажмите Да для повторной "
+"попытки."
+"<br>\t\t\tИли нажмите Нет для отмены."
+"<br>\t\t\tЕсли у вас уже есть этот архив, то скопируйте его в "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz и нажмите Да."
+"<br>"
+"<br>Попробовать снова?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Трансляция невозможна."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Невозможно начать трансляцию."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Таймер был успешно создан и начал выполняться."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Сначала необходимо задать несколько каналов."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Таймер успешно создан."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Запись продолжается."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Трансляция продолжается."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Не удалось настроить dvb устройство!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Невозможно установить pid(ы)"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Нет свободного модуля (карты) доступа"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Запись продолжается. Вы действительно хотите выйти?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Найдены активные таймеры. Вы действительно хотите выйти?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Сигнал:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "Сигнал/шум:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Захват:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Изменить..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Удалить все каналы?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Начать сканирование"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Остановить сканирование"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Остановка..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Найдено: %1 ТВ - %2 радио"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Не удалось открыть информационный сокет DVB"
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Список таймеров:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Новый"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Стоп/Удалить"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Этот таймер повторяемый. Вы хотите остановить текущую задачу или удалить "
+"таймер?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Пропустить текущую"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Удалить выбранный таймер?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Идёт загрузка..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Копирование файлов данных..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Параметры DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB-устройство"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Параметры устройства"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Имя:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Тип:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Кабель"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Наземный"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Спутник"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "Исполнитель"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Число головок LNB:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1-ый спутник:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Параметры LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2-ой спутник:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3-ий спутник:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4-ый спутник:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Параметры LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Источник:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Похоже, что это устройство поддерживает <b><i>автосканирование</i></b>"
+". Вы можете выбрать <b>AUTO</b> в списке Источникt чтобы Kaffeine просканировал "
+"диапазон частот."
+"<br>Если <b><i>автосканирование</i></b> не найдёт каналов, выберите другой "
+"Источник из списка.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Если вы не можете найти сеть/местоположение/спутник в списке, вы можете "
+"создать новую запись. Создайте файл со своими параметрами наподобии тех, что "
+"находятся в $HOME/.kde/share/apps/kaffeine/dvb-x/ (x=s,t, или c). Заполните его "
+"нужными параметрами сети/местоположения/спутника и назовите понятным именем "
+"(наподобие других файлов в каталоге). Если вы считаете, что этот файл будет "
+"полезен остальным ползователям, пошлите его по адресу: "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Параметры записи DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Каталог для записи:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Каталог для остановки времени:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Запас в начале:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(минут)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Запас в конце:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Продолжительность мгновенной записи:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Предпочтительный формат:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Трансляция DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Адрес трансляции:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Порт трансляции:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Порт информации:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Разное"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Кодировка по умолчанию (требуется перезапуск):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Обновление данных поиска:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Загрузка"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Копировать события Электронной программы передач в \n"
+" ~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Дамп"
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "Клиент DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Невозможно получить данные DVD из http://hftom.free.fr/kaxtv/dvbdata.tar.gz "
+"<br>\t\t\tПроверте своё соединение с сетью и нажмите Да для повторной попытки."
+"<br>\t\t\tНажмите Нет для отмены."
+"<br> Попробовать снова?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Неверный каталог для записи."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Неверный каталог для остановки времени."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Порт трансляции и информации не должны совпадать."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Недопустимый адрес трансляции."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Параметры LNB (конвертора)"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Универсальный конвертор"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Двойной гетеродин"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Одинарный гетеродин"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Частота переключения"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (МГц)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Частота нижней полосы:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Частота верхней полосы"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Частота одиночного гетеродина"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "Частота одиночного гетеродина"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "Частота одиночного гетеродина"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Сбросить"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Невозможно открыть сокет трансляции DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Невозможно инициализировать сокет трансляции DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Не найдены упаковщики звукового потока"
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Не удалось загрузить упаковщик '%1'."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Невозможно создать каталог"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "Мб"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "кб"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "байт"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Audio CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Воспроизвести CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Извлечь дорожки из CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Исполнитель:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Альбом:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Дорожка"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Выберите дорожки, которые вы хотите извлечь, и нажмите на кнопку <b>"
+"Упаковать</b>"
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Упаковать"
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Упаковка Audio CD"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Воспроизвести Audio CD"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Воспроизвести DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Воспроизвести VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Открыть &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Открыть &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Открыть &Аудио-CD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Вы должны выбрать дорожки для извлечения."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Найдено несколько Audio CD. Выберите один."
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Не найдено ни одного Audio CD"
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "диск DVD video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Найдено несколько дисков DVD Video. Выберите один."
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Найдено несколько дисков (S)VCD. Выберите один."
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Заголовок отсутствует"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Дорожка %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Поиск в локальной базе cddb ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Поиск в удалённой базе cddb ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Найдено точное совпадение в базе cddb ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "В базе cddb найден закрытый элемент ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Найдено несколько дисков DVD Video. Выберите один."
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Модуль упаковщика lame для Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Модуль упаковщика Ogg Vorbis для Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Клиент DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Невозможно открыть информационный сокет."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Невозможно выполнить операцию bind с информационным сокетом!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Невозможно открыть сокет."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Невозможно установить параметр сокета!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Невозможно выполнить операцию bind с сокетом!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Все размеры"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Очень маленький"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Маленький"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Средний"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Большой"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Очень большой"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Новый поиск"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Обложка, которую вы выбрали, недоступна. Пожалуйста, выберите другую."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Обложка недоступна."
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Загрузка обложек"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+"Изображения не найдены, пожалуйста, попробуйте поиск с другими условиями."
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Введите новые условия поиска:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Воспроизвести"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Воспроизвести след./Добавить в список"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Выбрать &Все"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Создать список воспроизведения из выбранного"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Добавить суб&титр..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Изменить заголовок"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Информация"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Длина"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Исполнитель"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Альбом"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Год"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Жанр"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Субтитры"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "используется"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Файлы субтитров\n"
+"*.*|Все файлы"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Выбрать субтитры"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Выберите обложку..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Галерея..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Фильтр"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Список воспроизведения:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Выбор активного списка воспроизведения. Для изменения имени списка, "
+"отредактируйте его и подтвердите кнопкой 'Return'."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Воспроизвести список"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Повтор"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Повторять список"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Случайно"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Воспроизвести записи в случайном порядке"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "У&далить текущий список"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Н&овый список"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Импортировать список..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Сохранить список как..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "У&далить текущий список"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Списки воспроизведения Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Все файлы"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Открыть список"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Списки M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Списки PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Сохранить список"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Список воспроизведения"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "НОВЫЙ"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Импортирование медиа-ресурсов..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(нет субтитров)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Другой субтитр..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Галерея"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Очередь: %1 Записей, Время: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Записей: %1, Время: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Удалить '%1' из списка и с диска?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Список с таким именем уже существует"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Введите другое имя:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Выбрать субтитр"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Медиа-файл:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Выбрать фильм"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Файл с субтитрами:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Воспроизвести / Приостановить"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Далее"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "В&ыключить звук"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine Медиаплеер"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine медиаплеер]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Владимир Мартеев,Шмелёв Артемий"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "admin@archlinux.ru,sgartjom@mail.ru"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Медиаплеер для KDE 3. Может использовать разные движки для проигрывания, "
+"рекомендованный (используемый по умолчанию) -- xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2006 разработчики Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Текущий сопровождающий"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Первоначальный автор"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Поддержка CICAM"
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Различные ценные заплатки."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Заплатка экранного меню DVB."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Заплатка категорий DVB"
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Логотип для Kaffeine 0.8 и другие дизайнерские работы."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Анимированный логотип для Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Альтернативная кодировка для мета-тегов. Много патчей."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Управление xine post plugin. Много патчей."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Импортирование субтитров."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Импортирование M3U. Тестирование."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Редактор PID'ов с субтитрами"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID'ы с субтитры"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Новый элемент"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Вверх"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Вниз"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Обновить выбранные"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Создать"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Страница:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Страница субтитров:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Язык:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Повторяющийся таймер."
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Редактор аудио PID'ов"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Audio PID'ы"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Редактор трансляции"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Доступные каналы:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Список трансляции:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(щёлкните правой кнопкой мыши для правки/удаления)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Создать..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Поиск"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Смещение (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Начать поиск"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Фильтры"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "\"Free to air\""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Поставщик:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Добавить выбранное"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Добавить через фильтр"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Найден"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "Cигнал/шум:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Готово"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Редактор каналов"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Номер:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Поляризация"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Частота:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Символьная скорость:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Зашифрованно"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID телетекста:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "SID (ID сервиса):"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "PID видео:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "ID транспортного потока (TID):"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PID'ы субтитров:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Аудио PID(ы) ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Полоса пропускания:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC (высокочастотной полосы)"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Передача:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC (низкочастотной полосы)"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Guard interval:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Иерархия:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Модуляция:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Инверсия:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Настройки кодирования"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Упаковщик:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Базовый каталог:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Паранойя:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Отключить"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Нормальный режим"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Парноидальный режим"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Нормализовать"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Панель инструментов CD"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Настройки Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Скорость потока:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "кб/с"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Настройки Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Качество:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Список воспроизведения"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Опции выхода"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Проигрыватель"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Автоматическая настройка &размера"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "Трансляция в се&ть"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Навигация"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD Меню"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Звук"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "В&идео"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Соотношение сторон"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Снимки экрана"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Кнопки управления"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Громкость"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Позиция"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Настройка"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Поведение"
+
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "Приостанавливать воспроизведение когда свернут"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Встроить в системный лоток"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " c"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "выкл"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Продолжительность показа заголовка в системном лотке"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Включить клиент DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Дополнительные параметры"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Использовать другую (не-Unicode) кодировку для мета-тегов"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Выберете альтернативную кодировку для мета-тегов\n"
+"(в порядке конвертирования в Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Очистить список недавно используемых файлов"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Начать воспроизведение немедленно"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Полноэкранный режим по умолчанию"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Задать аудио-драйвер"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Задать видео-драйвер"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Задать путь к устройствам Audio-CD/VCD/DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Показывать отладочные сообщения xine'а"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Запустить мастер установки"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Файл(ы) для воспроизведения. Они могут быть: локальными файлами, URL, "
+"каталогом, 'DVD', 'VCD' или 'AudioCD'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Начать"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Окно воспроизведения"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Поддерживаемые медиа-форматы"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Аудио файлы MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Видео файлы MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Файлы Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Файлы AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Файлы Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Файлы Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Файлы Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Файлы FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Файлы Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Файлы WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Не удалось загрузить плеер '%1'."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 не найден."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Открыть &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Открыть &каталог..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Выйти и выключить монитор после этой дорожки"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Выйти после этой дорожки"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Выйти после окончания списка"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Минимальный режим"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Включить &Плейлист/Плеер"
+
+#: kaffeine.cpp:710
+#, fuzzy
+msgid "Keep &Original Aspect"
+msgstr "&Оригинальное соотношение сторон"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Оригинальный размер"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Двойной размер"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Тройной размер"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Движок плеера"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Клиент DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Плеер"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Главное окно"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "Расшерение DPMS Xserver'а не найдено."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"После окончания проигрывания файла или списка проигрывания, Kaffeine закроет "
+"себя и выключит монитор. Помните, для того чтобы монитор выключился, необходимо "
+"добавить опцию \"dpms\" в ваш конфигурационный файл X'ов."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Открыть файл(ы)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Открыть URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Введите URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Открыть папку"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Нет %1 в устройстве, или не верный путь к устройству."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Выберите устройство:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 Мастер установки"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Проверка установки"
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "Настройка"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ok."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Движок не найден. Установите заново."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Найдена версия"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Для Kaffeine необходим KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Кодеки WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Кодеки WIN32 не найдены в /usr/lib/win32. Вы не сможете проигрывать файлы "
+"Windows Media 9 и Real Media. Скачать эти кодеки можно от сюда:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss не найден. Вы не сможете проигрывать зашифрованные (большинство "
+"коммерческих) DVD-дисков. Вы можете взять эту библиотеку от сюда:"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD-Привод"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"Режим DMA отключен! Для лучшего воспроизведения DVD, запустите из под root'а:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "Невозможно проверить DMA-режим. Нет доступа или не найдено устройство:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Устройство DVB"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "Не найдены DVB-устройства. Возможности DVB будут скрыты."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Дистрибуция"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"Бибилеотека xine-lib от SuSE может содержать не все необходимые функции для "
+"работы с Kaffeine (из-за патентных проблем). Вы должны использовать пакеты от "
+"сюда:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "РЕЗУЛЬТАТ"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Найдены некоторые проблемы, но Kaffeine все-равно может работать."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Все отлично!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "Использовать Kaffeine как плеер для mms:// (Microsoft Media) потоков"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Использовать Kaffeine как плеер для rtsp:// (Real Media и другие) потоков"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Создать значок на рабочем столе"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Опции установки"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Качество подавления черезстрочности"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Очень низкая нагрузка на процессор, ужасное качество.</b>"
+"<br>Половина вертикального разрешения будет потеряно. Для некоторых систем (с "
+"PCI видео-картами) это может увеличить нагрузку процессора по сравнению с "
+"обычным воспроизведением видео (без подавления чересстрочности)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Низкое использование процессора, плохое качество.</b>"
+"<br>Картинка будет размыта по вертикали, чересстрочный эффект будет удален."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Средняя нагрузка на процессор, среднее качество.</b>"
+"<br>Картинка будет анализироваться и зоны содержащие чересстрочный эффект будут "
+"исправлены (интерполированы)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Высокая нагрузка на процессор, хорошее качество.</b>"
+"<br>Преобразование в формат dvd улучшает качество и исправляет некоторые ошибки "
+"цвета"
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Очень высокая нагрузка на процессор, отличное качество.</b>"
+"<br>Используются умные алгоритмы сглаживания, что приводит к увеличению частоты "
+"кадров в два раза (30->60fps), как у обычного телевизора."
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Самая высокая нагрузка на процессор, лучшее качество с экспериментальными "
+"улучшениями.</b>"
+"<br>Включает judder-коррекцию (проигрывает фильм с его оригинальной скоростью: "
+"24 fps) и сглаживает цвет по вертикали. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Определяется пользователем"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Настроить модуль деинтерлейсинга tvtime"
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Может понадобиться пропатченное ядро 2.4 (как в RedHat) или ядро 2.6</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Настроить плагин tvtime Deinterlace"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Эффекты"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Звук"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Аудио-фильтры"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Включить аудио-фильтры"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Добавить фильтр"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Удалить все фильтры"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Видео"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Видео-фильтры"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Включить видео-фильтры"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Параметры движка xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Установки: %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Установки начинающего"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Установки эксперта"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "Kaffeine-движок"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Движок основанный на xine для Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+#, fuzzy
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Поддержка SMIL (Synchronized Multimedia Integration Language) находиться в "
+"зачаточном состоянии! Продолжить?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Сохранить поток как"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Субтитры"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Аудио-канал"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 из %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-Файл\n"
+"*.bmp|BMP-Файл\n"
+"*.xbm|XBM-Файл"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Сохранить снимок экрана"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Порт трансляции:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Настроить приём транслируемого DVB потока"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Адрес сервера:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Порт:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Перейти к позиции:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Ошибка xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Сообщение xine:"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Готов"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Воспроизведение"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Файл с субтитрами"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Сохранить поток как"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "&Сведения о дорожке"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Скопировать URL в буфер обмена"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Воспроизвести в отдельном окне Kaffeine"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "Транслировать &поток..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "П&ринимать транслированный поток"
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Сохранить снимок экрана..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Сохранить поток..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Сохранять текущий поток на жесткий диск. Эта возможность отключена для "
+"некоторых форматов (например для Real Media), чтобы избежать судебных "
+"разбирательств."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "&Минимальный режим"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Пауза"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "Ускоренное воспроизв&едение"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Замедленное во&спроизведение"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Перемотать вперёд (20 с)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Перемотать назад (20 с)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Перемотать вперёд (1 мин)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Перемотать назад (1 мин)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Перемотать вперёд (10 мин)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Перемотать назад (10 мин)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Перейти к позиции..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD-Меню: Влево"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD-Меню: Вправо"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD-Меню: Вверх"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD-Меню: Вниз"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD-Меню: Выбрать"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Аудио-канал"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Выберете аудио-канал"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Визуализация аудио"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Увеличить громкость"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Уменьшить громкость"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Подавление черезстрочности"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Активировать это для чересстрочных потоков, например некоторые DVD."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Авто"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "А&наморфный (16:9)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Квадратный"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Уменьшить по горизонтали"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Увеличить по горизонтали"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Уменьшить по вертикали"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Увеличить по вертикали"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Качество подавления &черезстрочности"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Настроить &видео"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Эквалайзер"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Включить меню"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Заголовок"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Корень"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Под-картинка"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "У&гол"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Часть"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Заголовки"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Фрагменты"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Углы"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Сведения о дорожке"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Э&ффекты..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Параметры движка &xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Громкость"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Позиция"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Короткий клик: Включает таймер Вперед/Назад\n"
+"Длинный клик: Включает экранное меню таймера"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Время"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Поиск в базе CDDB..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Дорожка AudioCD %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Дорожка CD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Параметры видео"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Оттенок"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Насыщенность"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Контраст"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Яркость"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Аудио/Видео смещение"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Смещение субтитра"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "авто"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Предупреждение: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Информация не доступна."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Внимание! Безопасность: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Узел с которым вы пытаетесь соединиться не найден.\n"
+"Проверьте правильность имени узла. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Имя устройства, которое вы указали неверно."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Сеть не доступна.\n"
+"Проверьте свои сетевые настройки и имя сервера. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Вывод звука невозможен по скольку звуковое устройство занято."
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"В соединении отказано.\n"
+"Проверьте правильность имени узла. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Указанный файл или URL не найден. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "К этому источнику запрещен доступ. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Данные не могут быть считанны.\n"
+"Возможно Вы не имеете достаточно прав на это или источник не содержит данных "
+"(например: нет диска в дисководе). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Ошибка при загрузке библиотеки или декодера: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Источник зашифрован и не может быть прочитан."
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Ваш DVD возможно зашифрован. В соответствии с законодательством вашей страны, "
+"вы можете использовать или нет библиотеку libdvdcss для чтения этого диска."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Неизвестная ошибка: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Ошибка: Не могу инициализировать видео-драйвер %1 - использую %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Видео-драйвер: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Ошибка: не могу инициализировать аудио-драйвер %1 - использую %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Аудио-драйвер: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Инициализация xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Не могу инициализировать движок xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Аудио-драйвер для вывода звука (по умолчанию: авто)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Видео-драйвер для вывода видео (по умолчанию: авто)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Использовать программный аудио-микшер"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Показывать сообщения экранного меню"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Размер текста Экранного меню"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Шрифт для Экранного меню"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Не могу инициализировать видео-драйвер '%1' - попытаюсь 'авто'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Все видео-драйверы не работают!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Не могу инициализировать аудио-драйвер '%1' - попытаюсь 'авто'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Все аудио-драйверы не работают!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Ошибка создания нового потока xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: открытие..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Открытие..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Аудио-кодек"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Видео-кодек"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Не найден расширение для обработки этого ресурса"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Ресурс поврежден"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Запрошенный ресурс не существует"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Ресурс не может быть открыт"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Общая ошибка"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Выключить звук"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Включить звук"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Ускоренное воспроизведение %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Замедленное воспроизведение %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Подавление черезстрочности: вкл"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Подавление черезстрочности: выкл"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Соотношение сторон"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Авто"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2,11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Увеличить X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Увеличить Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr " мсек"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Установки эквалайзера"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Усиление громкости"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Усиление громкости для Эквалайзера - Если звук становится плохим, то отключите "
+"это"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Удалить фильтр"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Переход на %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Невозможно инициализировать GStreamer!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamer-движок"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Выключить звук"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Комментарий"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Параметры движка &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer не может быть инициализирован!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Отсутствует реестр Gstreamer! Возможно, вы забыли выполнить <b>gst-register</b> "
+"(от имени суперпользователя) после установки."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Не могу инициализировать аудио-драйвер '%1' - пробую другой..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Не найдено поддерживаемых аудио-драйверов."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Не могу инициализировать видео-драйвер '%1' - пробую другой..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Не найдено поддерживаемых видео-драйверов."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Параметры GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Параметры звука"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Предпочитаемый аудио-драйвер"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Параметры изображения"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Предпочитаемый видео-драйвер"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Требуется перезапуск"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Носитель"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Параметры носителей"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Привод CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Движок-заглушка"
diff --git a/po/se.po b/po/se.po
new file mode 100644
index 0000000..dfd6e9d
--- /dev/null
+++ b/po/se.po
@@ -0,0 +1,3074 @@
+# translation of kaffeine.po to Northern Sami
+#
+# Børre Gaup <boerre@skolelinux.no>, 2007.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-06-15 12:36+0200\n"
+"Last-Translator: Børre Gaup <boerre@skolelinux.no>\n"
+"Language-Team: Northern Sami <se@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Elektronalaš prográmmaofelaš"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Ođasmahte"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Plánejuvvon"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Dálá/Boahtte"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanála"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Álgge"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Guhkkodat"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Namahus"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Geahča buot prográmmaid"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Namma:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanála:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Álgge:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Guhkkodat:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Loahppa:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Bádde nugo:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Ii oktage"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Beaivvalaččat"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Vahkkosaččat"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Mánosaččat"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Iešdefinerejuvvon"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Gearddut …"
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Áigedoaimmaheaddji"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Fertet addit nama dasa."
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Guhkkodat ferte leat unnimus okta minuhtta."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Namas eai sáhte leat dáid mearkkat: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Váili jietna-PID:a(t)."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "PID:a ii sáhte leat nolla."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Fertet válljet muhton beaivviid."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanálat"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronalaš prográmmaofelaš"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "Šearbmadieđut"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB-heivehusat"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Lohku"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Namma"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Jietnakanálat"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Bádde dakkaviđi"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Báddemin"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Vállje govaža …"
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Vállje kanálgovaža"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digitál-Tv"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Njuolgga digitál-TV doaibmá dušše xine-mohtorain."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Šearbmadieđut: Boahtte kanála"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Šearbmadieđut: Ovddit kanála"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Šearbmadieđut: Bláđđe"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Šearbmadieđut: Boahtte dáhpáhus"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Šearbmadieđut: Ovddit dáhpáhus"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Čájet šearbmadieđuid"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "Elektronalaš prográmmaofelaš …"
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanálat …"
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Heivet DVB …"
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Buot"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Ođđa kategoriija …"
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Rievdat govaža …"
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Sihko kategoriija …"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Ođđa kategoriija"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Čális nama dán kategoriijai:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Háliidatgo duođas dan kategoriija sihkkut?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Ii ožžon DVB-dáhtáid http://hftom.free.fr/kaxtv/dvbdata.tar.gz:s"
+"<br>\t\t\tIskka interneahttaoktavuođa, ja vástit «Jua» jus háliidat geahččalit "
+"ođđasit."
+"<br>\t\t\tDahje vástit «Ii» jus háliidat gaskkalduhttit."
+"<br>\t\t\tJus dus juo lea dát arkiiva, máŋge dan báikái: "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz ja daja «Jua»."
+"<br>"
+"<br>Galgágo geahččalit ođđasit?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Livččii várra buorre idea meroštit muhton kanálaid vuos."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Velge báddemin."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Ii sáhttán geahččat DVB:a."
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Ii sáhttán bidjat PID:a(id)"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Ii oktage guorus CAM"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine lea velge báddemin. Háliidatgo duođas heaittihit?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signála:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Lohkat:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Doaimmat …"
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Háliidatgo duođaid sihkkut buot kanálaid?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Álggat ohcama"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Bisset ohcama"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Bisseheamen …"
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Gávnnai %1 TV-stašuvnna ja %2 radiostašuvnna"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr ""
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr ""
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Ođđa"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Bisset/Sihku"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Njuikes badjel dálá"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Viežžamin …"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Máŋgemin dáhtafiillaid …"
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB-heivehusat"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB-ovttadat"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Ovttadatheivehusat"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Namma:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Šládja:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satelihtta"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "ATSC"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Amas"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Galle LNB:a:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "Vuosttaš satelihtta:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB-heivehusat …"
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "Nubbi satelihtta:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "Goalmmát satelihtta:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "Njeallját satelihtta:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB-heivehusat …"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Gáldu:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB-báddenheivehusat"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Báddenmáhppa:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minuhta)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Oidojuvvon formáhtta:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Diehtoverrát:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Feará mii"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Standárda mearkaráidu (gáibida ođđa álggaheami):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Ođasmahte ohcandáhtaid:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Viečča"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Luoitte"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB-lassemoduvllat"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Gustohis báddenmáhppa"
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB-heivehusat"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Universealla LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Duppal LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Máhcat"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr ""
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr ""
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr ""
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr ""
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Ii sáhttán ráhkadit máhpa: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Stávvala"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Jietna-CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Čuojat CD:a"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Rippe CD:a"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artista:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Skearru:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Bihttá"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "Vállje bihtáid maid háliidat rippet ja coahkkal <b>Kode</b>-boalu."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Kodemin …"
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Jietna-CD-koden"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Čuojat jietna-CD:a"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Čuojat DVD:a"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Čuojat VCD:a"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Raba &DVD:a"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Raba &VCD:a"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Raba &jietna-CD:a"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Ferte válljet guđe bihtáid áiggut rippet."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Gávnnaid máŋga jietna-CD:a. Vállje okta dain:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Ii oktage jietna-CD:a gávdnui."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD-video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Máŋga DVD-videoa gávdnui. Vállje okta dain:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Máŋga (S)VCD:a gávdnui. Vállje okta dain:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Ii oktage namahus"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Bihttá %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Ohcamin báikkálaš CDDB-merkoša …"
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Ohcamin gáiddus CDDB-merkoša …"
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Gávnnai CDDB-mearkkuš mii deaivvai juste …"
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Gávnnai sullosaš CDDB-merkoša …"
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB-deaivamat"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Lame mp3-koden lassemoduvla Kaffeinii."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Ogg Vorbis-koden lassemoduvla Kaffeinii."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB-klienta"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr ""
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Buot sturrodagat"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Hui unni"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Unni"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Gaskageardán"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Stuoris"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Hui stuoris"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Oza ođđasit"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Olggoža maid leat válljen ii leat olámuttus. Vállje muhton eará."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Olggoš ii leat olámuttus"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Olggošviežži"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Ii gávdnan heivvolaš govaid, vállje ođđa ohcancealkaga:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Čális ođđa ohcancealkaga:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Čuojat"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Čuojat boahtte/Lasit gárgadussii"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Vállje &buot"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Ráhkat čuojahanlisttuid merkejuvvon merkošiin"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Lasit &vuolleteavstta …"
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Doaimmat namahusa"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Dieđut"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Guhkkodat"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artista"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Skearru"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Jahki"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Šáŋra"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Vuolleteavsttat"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "geavahusas"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi, *.srt, *.sub, *.txt, *.ssa, *.asc|Vuolleteakstafiillat\n"
+"*.*|Buot fiillat"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Vállje vuolleteakstafiilla"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Vállje olggoža …"
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galleriija …"
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Silli"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Čuojahanlistu:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Vállje aktiivalaš čuojahanlisttu. Jus háliidat rievdadit čuojahanlistonama, "
+"doaimmat dan ja deaddil Enter."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Čuojat čuojahanlisttu"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Gearddut"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Gearddut čuojahanlisttu"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Sáhtedohko"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Čuojat merkošiid sáhtedohko ortnegis"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Viečča olggožiid automáhtalaččat"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Viežžá olggožiid automáhtalaččat"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Sálke dálá čuojahanlisttu"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Ođđa čuojahan&listu"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "Sisa&fievrrit čuojahanlisttu …"
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Vurke dálá čuojahanlisttu nugo …"
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Váldde &eret dálá čuojahanlisttu"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine-čuojahanlisttu"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Buot fiillat"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Raba čuojahanlisttu"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U-čuojahanlisttut"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS-čuojahanlisttut"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Vurke čuojahanlisttu"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Čuojahanlistu"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "OĐĐA"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Sisafievrrideamen medieresurssaid …"
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(eai leat vuolleteavsttat)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Eará vuolleteaksta …"
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galleriija"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Gárgadas: %1 merkoša, čuojahanáigi: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Merkoša: %1, čuojahanáigi: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Sihkkut «%1» sihke listtus ja mašiinnas?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Čuojahanlistonamma gávdno juo"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Čális eará čuojahanlistonama:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Vállje vuolleteavstta"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Mediafiila:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Vállje filmma"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Vuolleteakstafiila:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Čuojat / Boatkke"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "Č&uovvovaš"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Jaskkodahta"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine čuojan"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine čuojan]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Børre Gaup"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "boerre@skolelinux.no"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr ""
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Dálá maŧásdoalli"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Álgovuolggalaš čálli"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM-doarjja."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr ""
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr ""
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr ""
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Ođđa mearkkuš"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Sirdde bajás"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Sirdde vulos"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Ođasmahttin válljejuvvon"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Ođđa"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Siidu:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Vuollesiidu:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Giella:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Olámuttus kanálat:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Ođđa …"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Ohcan alde"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Álggat ohcama"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Sillit"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Lasit merkejuvvon"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Lasit sillejuvvon"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Gávdnun"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Geargan"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Kanáladoaimmaheaddji"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nummir:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaritehta"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frekvensa:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Symbolaleaktu:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Bálvalus-ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Video-PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Vuolleteaksta-PID:at …"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Jietna-PID:at …"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Sádden:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Kodenoidimat"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Vuođđamáhppa:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr " …"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Dábálaš modus"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoiamodus"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalisere"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD-reaidoholga"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame mp3-heivehusat"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bihttáleaktu:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "KB/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg vorbis-heivehusat"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Kvalitehta: "
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Čuojahan&listu"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Heaittihanmolssaeavttut"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "Čuo&jan"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Automáhtalaš &sturrodatrievdadus"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigašuvdna"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD-fálut"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Jietna"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Šearbmagovvaholga"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Stivrranholga"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Jietnaholga"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Sajádatholga"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine-heivehus"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Láhtten"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Boatkke video go láse minimerejuvvo"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Vuojut vuogádatgárcui"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " s"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "eret"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr ""
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr ""
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Feará makkár molssaeavttut"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr ""
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Sálke easka geavahuvvon fiilalisttu"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Álggat čuojaheami dakkaviđi"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Álggat dievasšearbmamodusis"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Vállje jietnastivrrana"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Vállje videostivrrana"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr ""
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr ""
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Vuoje sajáiduhttinofelačča"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Álggat"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Čuojanláse"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Dorjojuvvon mediaformáhtat"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG-jietnafiillat"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG-videofiillat"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis-fiillat"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI-fiillat"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "QuickTime-fiillat"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media-fiillat"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska-fiillat"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC-fiillat"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media-fiillat"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV-fiillat"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr ""
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr ""
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Raba &URL:a …"
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Raba &máhpa …"
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Heaittit &ja jaddat šearpma dán bihtá maŋŋá"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Heaittit dán bihtá maŋŋá"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Heaittit maŋŋágo čuojahanlistu lea geargan"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimála modus"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr ""
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr ""
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Originála sturrodat"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Duppal sturrodat"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Golmma geardde sturrodat"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Čuojan&mohtor"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB-klienta"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Čuojan"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Váldoláse"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr ""
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Raba fiilla(id)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Raba URL:a"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Čális fierpmádatčujuhusa:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Raba máhpa"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr ""
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Vállje rievttes stašuvnna:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine sajáiduhttinofelaš %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Sajáiduhttiniskkus"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ok."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr ""
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Gávnnai veršuvnna"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine gáibida KDE-veršuvdna %1 dahje buorebut"
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32-kodekat"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD-stašuvdna"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-ovttadat"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribušuvdna"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "BOAĐUS"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Visot ortnegis."
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr ""
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Jietna"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Verrát:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Gearggus"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr ""
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Boatkke"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Jietnadássádat"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Jietnadássi"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Sajádat"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr ""
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Videoheivehusat"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Dieldnan"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Vuostálasvuohta"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Čuovgafápmu"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Auto"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr ""
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Jaskadahte"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Kommeanta"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr ""
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr ""
diff --git a/po/sk.po b/po/sk.po
new file mode 100644
index 0000000..2e356b4
--- /dev/null
+++ b/po/sk.po
@@ -0,0 +1,3063 @@
+# translation of kaffeine.po to Slovak
+#
+# Richard Fric <Richard.Fric@kdemail.net>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-09-15 18:40+0200\n"
+"Last-Translator: Richard Fric <Richard.Fric@kdemail.net>\n"
+"Language-Team: Slovak <sk@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr ""
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr ""
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr ""
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr ""
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr ""
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr ""
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr ""
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr ""
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr ""
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr ""
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr ""
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr ""
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr ""
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr ""
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr ""
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr ""
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr ""
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr ""
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr ""
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr ""
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr ""
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr ""
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr ""
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr ""
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr ""
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr ""
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr ""
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr ""
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr ""
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr ""
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr ""
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr ""
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr ""
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr ""
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr ""
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr ""
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr ""
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr ""
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr ""
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr ""
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr ""
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr ""
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr ""
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr ""
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr ""
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr ""
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr ""
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr ""
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr ""
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr ""
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr ""
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr ""
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr ""
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr ""
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr ""
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr ""
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr ""
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr ""
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr ""
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr ""
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr ""
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr ""
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr ""
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr ""
+
+#: main.cpp:78
+msgid "Original author"
+msgstr ""
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr ""
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr ""
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr ""
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr ""
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr ""
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr ""
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr ""
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr ""
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr ""
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr ""
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr ""
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr ""
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr ""
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr ""
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr ""
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr ""
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr ""
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr ""
+
+#: pref.cpp:81
+msgid " sec"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr ""
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr ""
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr ""
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr ""
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr ""
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr ""
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr ""
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr ""
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr ""
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr ""
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr ""
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr ""
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr ""
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr ""
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr ""
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr ""
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr ""
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr ""
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr ""
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr ""
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr ""
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr ""
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr ""
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr ""
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr ""
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr ""
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr ""
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr ""
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr ""
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr ""
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr ""
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr ""
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr ""
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr ""
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr ""
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr ""
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr ""
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr ""
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr ""
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr ""
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr ""
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr ""
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr ""
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr ""
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr ""
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr ""
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr ""
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr ""
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr ""
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr ""
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr ""
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr ""
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr ""
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr ""
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr ""
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr ""
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr ""
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr ""
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr ""
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr ""
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr ""
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr ""
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr ""
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr ""
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr ""
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr ""
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr ""
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr ""
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr ""
diff --git a/po/sr.po b/po/sr.po
new file mode 100644
index 0000000..1f86ced
--- /dev/null
+++ b/po/sr.po
@@ -0,0 +1,3177 @@
+# translation of kaffeine.po to Serbian
+#
+# Chusslove Illich <caslav.ilic@gmx.net>, 2005.
+# Slobodan Simic <simicsl@verat.net>, 2005.
+# Slobodan Simic <slsimic@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-10-11 08:40+0200\n"
+"Last-Translator: Slobodan Simic <slsimic@gmail.com>\n"
+"Language-Team: Serbian <kde@kde.org.yu>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Освежи"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Заказано"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Текуће/следеће"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Канал"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Почетак"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Трајање"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Наслов"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Прикажи све програме"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Додај у тајмере"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Име:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Канал:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Почетак:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Трајање:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Крај:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Сними као:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Никако"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Дневно"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Седмично"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Месечно"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Посебно"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Понови..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Уређивач тајмера"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Морате навести име."
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Трајање мора бити бар 1 минут."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Име не сме садржати следеће знакове: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Почетне поставке транспондера"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Ово име није јединствено."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Недостају аудио PID-ови."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "PID не сме бити нула."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Морате изабрати неке дане."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Канали"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Тајмери"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Електронски програмски водич"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB поставке"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Број"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Име"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Аудио канал"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Тренутно снимај"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Емитуј"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Помак времена"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Снимање"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Емитовање"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Изаберите икону..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Изаберите икону канала"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Дигитални ТВ"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Жива дигитална телевизија ради само са мотором xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD Следећи канал"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD Претходни канал"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD Следећи догађај"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD Претходни догађај"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Прикажи OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Тајмери..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Емитовање..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Канали..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Подеси DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Све"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "ТВ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Радио"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Нова категорија..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Промени икону..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Обриши категорију..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Нова категорија"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Унесите име за ову категорију:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Желите ли заиста да обришете ову категорију?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Не могу да добавим DVB податке са http://hftom.free.fr/kaxtv/dvbdata.tar.gz"
+"<br>\t\t\tПроверите своју везу са Интернетом и кликните на „Да“ да покушате "
+"поново."
+"<br>\t\t\tИли „Не“ да одустанете."
+"<br>\t\t\tАко већ имате ову архиву, копирајте је у "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz и кликните на „Да“."
+"<br>"
+"<br>Да ли да покушам поново?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Емитовање није успело."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Не могу да почнем емитовање."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Тајмер је успешно направљен и покренут."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Требало би прво да дефинишете неке канале."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Тајмер је успешно направљен."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "И даље снимам."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "И даље емитујем."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Не могу да наштелујем DVB!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Не могу да поставим PID-ове"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Нема слободног CAM-а"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine и даље снима. Желите ли заиста да изађете?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine има тајмере у реду. Желите ли заиста да изађете?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Сигнал:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Захват:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Уреди..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Желите ли заиста да обришете све канале?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "ПОЧНИ скенирање"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "ЗАУСТАВИ скенирање"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Заустављам..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Нађено: %1 ТВ — %2 радио"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Не могу да отворим инфо сокет DVB-а."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Листа тајмера:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Нови"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Заустави/обриши"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Овај тајмер је поновљен. Желите ли да прескочите текући посао или да обришете "
+"тајмер?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Прескочи текући"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Обрисати изабрани тајмер?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Преузимам... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Копирам фајлове..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB поставке"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB уређај"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Поставке уређаја"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Име:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Тип:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Кабловска"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Земаљска"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Сателитска"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Непознат"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Број LNB-ова:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1. сат:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB поставке..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2. сат:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3. сат:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4. сат:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB поставке..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Извор:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Овај уређај изгледа подржава <b><i>autoscan</i></b> "
+"могућност. Можете изабрати <b>АУТО</b> у листи извора и Kaffeine ћепретражити "
+"опсег фреквенција."
+"<br>Ако <b><i>autoscan</i></b> не успе да нађе ваше канале, изаберите прави "
+"извор са листе.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Ако не можете да нашете вашу мрежу/локацију на листи, онда направите "
+"једну. Погледајте у $HOME/.kde/share/apps/kaffeine/dvb-x/ и узмите постојећи "
+"фајл као полазну тачку. Допуните је са вредностима за вашу мрежу/локацију и "
+"дајте јој нормално име (у складу са конвенцијим именовања). Ако мислите да би "
+"ваш фајл користио и другима, пошаљите га на kaffeine-user(АТ)lists.sf.net.</i>"
+"</qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Опције DVB снимања"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Директоријум снимака:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Директоријум за помаке времена:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Маргина почетка:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(минута)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Маргина краја:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Трајање тренутног снимања:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Жељени формат:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB емитовање"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Адреса емитовања:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Порт емитовања:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Инфо порт:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Разно"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Подразумевани скуп знакова (тражи рестарт):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Ажурирај податке скенирања:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Преузми"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Избаци догађаје EPG-а у\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Избаци"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB прикључци"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Не могу да добавим подакте о DVB-у са "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tПроверите своју везу са Интернетом и кликните на „Да“ да покушате "
+"поново."
+"<br>\t\t\tИли „Не“ да одустанете."
+"<br>Да ли да покушам поново?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Неисправан директоријум снимака."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Неисправан директоријум помака времена."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Инфо порт и порт за емитовање морају бити различити."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Неисправна адреса емитовања."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB поставке"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Универзални LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Двоструки LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Једноструки LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Учестаност пребацивања двоструког LO:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Нископојасна учестаност:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Високопојасна учестаност:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Учестаност једноструког LO:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Верт. полариз. LO фреквенција:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Хориз. полариз. LO фреквенција:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Ресетуј"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Не могу да отворим DVB сокет за емитовање."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Не могу да иницијализујем DVB сокет за емитовање."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Немогу да нађем декодере звука."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Учитавање декодера „%1“ није успело."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Не могу да направим фасциклу: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Бајта"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Аудио CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Пусти CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Чупај CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Извођач:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Албум:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Нумера"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Изаберите нумере које хоћете да ишчупате и кликните на дугме <b>Кодирај</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Кодирај..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Кодирање аудио CD-а"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Пусти аудио CD"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Пусти DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Пусти VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Отвори &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Отвори &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Отвори &аудио-CD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Морате изабрати нумере за чупање."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Нађено је више аудио CD-ова. Изаберите један:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Није нађен аудио CD."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD Видео"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Нађено је више видео DVD-ова. Изаберите један:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Нађено је више (S)VCD-а. Изаберите један:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Нема наслова"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Нумера %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Траажим локални cddb унос ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Тражим удаљени cddb унос ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Нађено тачно поклапање cddb уноса ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Нађен приближан cddb унос ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Нађено је више видео DVD-ова. Изаберите један:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Lame mp3 кодерски прикључак за Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Ogg Vorbis кодерски прикључак за Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB клијент"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Не могу да отворим инфо сокет."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Не могу да повежем инфо сокет!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Не могу да отворим сокет."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Не могу да поставим опцију сокета!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Не могу да повежем сокет!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Све величине"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Веома мало"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Мало"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Средње"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Велико"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Веома велико"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Ново тражење"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Омот који сте изабрали није доступан. Изаберите други."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Омот недоступан"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Преузимање омота"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Није нађена одговарајућа слика. Унесите нове термине за претрагу:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Унесите нове термине за претрагу:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Пусти"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Пусти следеће / додај у ред"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Изабери &све"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Направи листу нумера из изабраног"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Додај &титл..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Уреди наслов"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Инфо"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Дужина"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Извођач"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Албум"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Година"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Жанр"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Титлови"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "у употреби"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Фајлови титлова\n"
+"*.*|Сви фајлови"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Изаберите фајл титла"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Изаберите омот..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Галерија..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Филтер"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Листа нумера:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Изаберите активну листу нумера. Да бисте јој променили име, измените га и "
+"потврдите тастером Return."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Пусти листу нумера"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Понављај"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Понављај листу нумера"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Измешај"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Пуштај нумере насумично"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Аутоматски преузми омоте"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Аутоматско преузимање омота"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Очисти текућу листу нумера"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Нова листа нумера"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Увези листу нумера..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "Сними текућу листу нумера &као..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "&Уклони текућу листу нумера"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine-ове листе нумера"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Сви фајлови"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Отвори листу нумера"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U листе нумера"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS листе нумера"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Сними листу нумера"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Листа нумера"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "НОВО"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Увозим ресурсе медија..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(нема титла)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Други титл..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Галерија"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Ред: %1 уноса, време пуштања: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Уноса: %1, време пуштања: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Уклонити „%1“ из листе и са диска?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Име листе нумера већ постоји"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Унесите другачије име за листу:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Изаберите титл"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Фајл медија:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Изаберите филм"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Фајл титла:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Пусти / Паузирај"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Следеће"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Утишај"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine, плејер"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine плејер]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Часлав Илић,Слободан Симић"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "caslav.ilic@gmx.net,slsimic@gmail.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Медија плејер за KDE 3. Може да користи више мотора за пуштање, подразумевана "
+"(и препоручена) је xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "© 2003-2005, аутори Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Тренутно одржава"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Првобитни аутор"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM подршка."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Разне вредне закрпе."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Закрпа DVB OSD прегледања."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Закрпе DVB категорија."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Знак за Kaffeine 0.8 и други уметнички радови."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Анимирани лого за Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Алтернативно кодирање за метаознаке. Многе закрпе."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Руковање постприкључцима за Xine. Многе закрпе."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Увоз титлова."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Увоз M3U. Испробавање."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Уређивач PID-ова титлова"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID-ови титлова"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Нова ставка"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Помери нагоре"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Помери надоле"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Ажурирај изабрано"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Ново"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Страна:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Подстрана:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Језик:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Поновљени тајмер"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Уређивач аудио PID-ова"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Аудио PID-ови"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Уређивач емитовања"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Доступни канали:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Листа емитовања:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Десно кликните да уредите/обришете)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Нови..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Тражи на"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Померај (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Почни скенирање"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Филтери"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Слободно за емитовање"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Провајдер:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Додај изабране"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Додај филтриране"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Нађен"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Готово"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Уређивач канала"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Бр:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Поларитет"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Учестаност:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Проток симбола:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Скремблован"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID телетекста:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Ид. сервиса:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Видео PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Ид. транспортног тока:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PID-ови титлова..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Аудио PID-ови..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Пропусност:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC високо:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Пренос:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC ниско:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Интервал одступа:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Хијерархија:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Модулација:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Инверзија:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Подешавања кодирања"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Кодер:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Основни директоријум:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Искључи све провере"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Нормалан режим"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoia режим"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Нормализуј"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD трака алата"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Опције за Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Битни проток:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Опције за Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Квалитет :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Листа нумера"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Опције изласка"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Плејер"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Омогући аутоматску &промену величине"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Мрежно емитовање"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Навигација"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD менији"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Аудио"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Видео"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Пропорција"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Трака за снимке екрана"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Трака контрола"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Трака јачине звука"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Трака положаја"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Подешавање Kaffeine-а"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Понашање"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Паузирај видео док је прозор минимизиран"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Угњезди у системску касету"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " сек."
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "искљ"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Трајање објаве наслова у системској касети"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Укључи DVB клијент"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Разне опције"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Користи алтернативно (не-Unicode) кодирање за метаознаке"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Изаберите алтернативно кодирање за метаознаке\n"
+"(да би се претвориле у Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Очисти листу скорашњих фајлова"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Одмах почни са пуштањем"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Почни у преко целог екрана"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Постави аудио драјвер"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Постави видео драјвер"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Постави путању аудио-CD/VCD/DVD уређаја."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Исписуј исправљачке поруке Xine-а"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Покрени чаробњак за инсталацију"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Фајлови за пуштање. Могу бити локални, URL, директоријум или „DVD“, „VCD“, "
+"„Аудио CD“."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Покрени"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Прозор плејера"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Подржани медија формати"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG аудио фајлови"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG видео фајлови"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis фајлови"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI фајлови"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime фајлови"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media фајлови"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska фајлови"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC фајлови"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media фајлови"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV фајлови"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Учитавање дела плејера „%1“ није успело."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 није нађен у путањи претраге."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Отвор&и URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Отвори &директоријум..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Изађи и угаси монитор после ове нумере"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Изађи после ове нумере"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Изађи после листе нумера"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Минимални режим"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Пребаци &листу нумера/плејер"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Сачувај &оригиналну пропорцију"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Оригинална величина"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Двострука величина"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Трострука величина"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Мотор плејера"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB клијент"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Плејер"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Главни прозор"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS проширење X сервера није нађено."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Ово ће изаћи из Kaffeine-а и искључити напајање монитора пошто се фајл или "
+"листа нумера заврши. Да би се монитор искључио, мора постојати опција „dpms“ у "
+"вашем фајлу са поставкама X-а."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Отвори фајл(ове)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Отвори URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Унесите URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Отвори фасцикле"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Нема %1 у уређају, или је погрешна путања до уређаја."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Изаберите постојећи уређај:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1, чаробњак за инсталацију"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Провера инсталације"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "У реду."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Део није нађен. Проверите инсталацију!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Нађена верзија"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine захтева KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 кодеци"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Ниједан WIN32 кодек није нађен у /usr/lib/win32. Нећете моћи да пуштате Windows "
+"Media 9 фајлове, новије Real Media фајлове, и неке мање познате формате. Кодеке "
+"можете преузети овде:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss није нађена. Нећете моћи да пуштате шифроване DVD-ове (већина "
+"комерцијалних). Библиотеку можете набавити овде (али њеним коришћењем можете "
+"прекршити законе о ауторским правима у својој држави!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD уређај"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"DMA режим је искључен! За глатко пуштање DVD-а, као администратор покрените:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Не могу да проверим DMA режим. Дозвола није дата или нема таквог уређаја:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB уређај"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Ниједан DVB уређај није нађен. Функције у вези са DVB-ом ће бити скривене."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Дистрибуција"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"xine-lib испоручена уз SuSE „може бити без неких могућности због законских "
+"ограничења (могућа кршења патената)“. Требало би да користите пакете одавде:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "РЕЗУЛТАТ"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Било је неких проблема, али ће Kaffeine вероватно радити."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Све је у реду!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Користи Kaffeine као помоћни програм за mms:// токове (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Користи Kaffeine као помоћни програм за rtsp:// токове (Real Media и други)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Направи икону Kaffeine-а на радној површини"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Опције инсталације"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Квалитет расплитања"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Врло ниска употреба процесора, најгори квалитет.</b>"
+"<br>Губи се пола усправне резолуције. За неке системе (са PCI графичким "
+"картицама) ово може смањити оптерећење процесора у односу на обично пуштање "
+"(без расплитања)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Ниска употреба процесора, слаб квалитет.</b>"
+"<br>Слика је замућена усправно, тако да су ефекти преплитања уклоњени."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Средња употреба процесора, средњи квалитет.</b>"
+"<br>Слика се анализира и исправљају се (интерполирају) подручја са артефактима "
+"преплитања."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Висока употреба процесора, добар квалитет.</b>"
+"<br>Претварање DVD формата слике побољшава квалитет у исправља грешку "
+"хрома-надузорковања."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Врло висока употреба процесора, одличан квалитет.</b>"
+"<br>Поред коришћења паметних алгоритама за расплитање, такође се удвостручује "
+"број кадрова (30->60fps) ради поклапања са ТВ-ом. Открива и отклања 3-2 "
+"спуштање. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Врло висока употреба процесора, одличан квалитет са (експерименталним) "
+"побољшањима.</b>"
+"<br>Укључује исправљање брујања (пушта филмове у оригинална 24 кадра по "
+"секунди) и вертикално уједначавање боја (исправља мале обојене траке које се "
+"виде на неким DVD-овима). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Кориснички дефинисано"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Подеси tvtime, прикључак за расплитање..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Може захтевати закрпљено 2.4 језгро (као RedHat-ово) или 2.6 језгро.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Подеси tvtime, прикључак за расплитање"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Прикључци за ефекте"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Аудио"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Аудио филтери"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Укључи аудио филтере"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Додај филтер"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Уклони све филтере"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Видео"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Видео филтери"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Укључи видео филтере"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Параметри мотора Xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Опције за %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Почетничке опције"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Стручњачке опције"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Део пуштача за Kaffeine на основи xine-а."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Подршка за SMIL (језик за синхронизовану мултимедијалну интеграцију) је само "
+"најосновнија!\n"
+"XinePart може сада покушати да пусти садржане видео изворе без икаквог "
+"распореда. Наставити?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Сними ток као"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Титл"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Аудио канал"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 од %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG фајл\n"
+"*.bmp|BMP фајл\n"
+"*.xbm|XBM фајл"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Сачувај снимак екрана као"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Порт за емитовање:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Подеси примање емитованог тока"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Адреса пошиљаоца:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Порт:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Скочи на положај:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine грешка"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine порука"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Спреман"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Пуштам"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Фајл титла"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Сними ток као"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Информације о нумери"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Копирај URL у клипборд"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Пусти у Kaffeine-у споља"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Пошаљи ток емитовања..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Прими ток емитовања..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Сачувај снимак екрана..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Сними ток..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Снима текући ток на диск. Ова могућност је искључена за неке формате (нпр. Real "
+"Media) ради спречавања могућих законских проблема."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Мења минимални режим"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Пауза"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Брзо напред"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "&Успорено"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Скочи напред (20 сек)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Скочи назад (20 сек)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Скочи напред (1 мин)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Скочи назад (1 мин)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Скочи напред (10 мин)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Скочи назад (10 мин)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Скочи на положај..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD мени лево"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD мени десно"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD мени горе"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD мени доле"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD мени избор"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Аудио канал"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Изаберите аудио канал"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Аудио &визуелизација"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Звук јаче"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Звук слабије"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Расплићи"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Активирајте ово за преплетене токове, нпр. неке DVD-ове."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Аутоматски"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "Ана&морфично"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Квадрат"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Увеличај водоравно"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Умањи водоравно"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Увеличај усправно"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Умањи усправно"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Квалитет расплитања"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Видео поставке"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Еквилајзер"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Укљ/искљ. менија"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Наслов"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Корен"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Подслика"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Угао"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Део"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Наслови"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Поглавља"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Углови"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Информације о &нумери"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Прикључци за &ефекте..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Параметри &мотора Xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Јачина звука"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Положај"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Кратак клик: тајмер напред/назад\n"
+"Дугачак клик: OSD тајмера"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Време пуштања"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Тражим CDDB уносе..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Аудио CD нумера %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD нумера %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Видео поставке"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Нијанса"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Засићење"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Контраст"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Осветљеност"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Аудио/видео помак"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Помак титла"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "аутоматски"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Опште упозорење: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Информације нису доступне."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Безбедносно упозорење: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Домаћин на који покушавате да се повежете није познат.\n"
+"Проверите исправност наведеног имена домаћина. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Име уређаја које сте навели не делује исправно. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Изгледа да мрежа није доступна.\n"
+"Проверите своја мрежна подешавања и име сервера. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Аудио излаз није доступан. Уређај је заузет. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Веза је одбијена.\n"
+"Проверите име домаћина. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Наведени фајл или URL није нађен. Проверите то. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Дозвола за овај извор није дата. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Извор се не може прочитати.\n"
+"Можда немате довољно овлашћења за ово, или извор не садржи податке (нпр. нема "
+"диска у уређају). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Дошло је до проблема при учитавању библиотеке или декодера: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Извор делује дешифровано, али се не може прочитати. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Ваш DVD је вероватно шифрован. Можете употребити libdvdcss за читање овог "
+"диска, али тиме можете прекршити законе државе у којој сте. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Непозната грешка: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Грешка: Не могу да иницијализујем нови видео драјвер %1 — користим %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Користим видео драјвер: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Грешка: Не могу да иницијализујем нови аудио драјвер %1 — користим %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Користим аудио драјвер: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Иницијализуј Xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Не могу да иницијализујем мотор Xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Аудио драјвер који се користи (подразумевано: аутоматски)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Видео драјвер који се користи (подразумевано: аутоматски)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Користи софтверску аудио миксету"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Приказуј OSD поруке"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Величина OSD текста"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Фонт за OSD поруке"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Не могу да инцијализујем видео драјвер „%1“, покушавам „аутоматски“..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Ниједан видео драјвер није успео да се инцијализује!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Не могу да инцијализујем аудио драјвер „%1“, покушавам „аутоматски“..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Ниједан аудио драјвер није успео да се инцијализује!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Не могу да направим нови ток Xine-а!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: отварам..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Отварам..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Аудио кодек"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Видео кодек"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Није нађен прикључак за руковање овим ресурсом"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Ресурс делује покварено"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Захтевани ресурс не постоји"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Ресурс се не може отворити"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Генеричка грешка"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Неутишано"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Утишано"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Брзо напред %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Успорено %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Расплитање: укључено"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Расплитање: искључено"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Пропорција"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Аутоматски"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Увеличање X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Увеличање Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Поставке еквилајзера"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Појачање звука"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "Појачање звука за еквилајзер — ако звук има превише шума искључите ово"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Обриши филтер"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Идем на %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Иницијализација GStreamer-а није успела!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Утишај"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Коментар"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Параметри мотора &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer није могао да се инцијализује!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Недостаје регистар GStreamer-а! Да ли сте заборавили да покренете <b>"
+"gst-register</b> (као администратор) после инсталације?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Не могу да иницијализујем аудио драјвер „%1“, покушавам други..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Није нађен употребљив аудио драјвер!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Не могу да иницијализујем видео драјвер „%1“, покушавам други..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Није нађен употребљив видео драјвер!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Параметри мотора GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Аудио опције"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Жељени аудио драјвер"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Видео опције"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Жељени видео драјвер"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Захтева поновно покретање."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Медији"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Медија опције"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD уређај"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Ови канали већ постоје и зато нису додати:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Нисам успео да се повежем са X сервером!"
diff --git a/po/sr@Latn.po b/po/sr@Latn.po
new file mode 100644
index 0000000..1beba1e
--- /dev/null
+++ b/po/sr@Latn.po
@@ -0,0 +1,3178 @@
+# translation of kaffeine.po to Serbian
+#
+# Chusslove Illich <caslav.ilic@gmx.net>, 2005.
+# Slobodan Simic <simicsl@verat.net>, 2005.
+# Slobodan Simic <slsimic@gmail.com>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-10-11 08:40+0200\n"
+"Last-Translator: Slobodan Simic <slsimic@gmail.com>\n"
+"Language-Team: Serbian <kde@kde.org.yu>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Osveži"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Zakazano"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Tekuće/sledeće"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Početak"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Trajanje"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Naslov"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Prikaži sve programe"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Dodaj u tajmere"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Ime:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Početak:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Trajanje:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Kraj:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Snimi kao:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Nikako"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Dnevno"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Sedmično"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Mesečno"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Posebno"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Ponovi..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Uređivač tajmera"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Morate navesti ime."
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Trajanje mora biti bar 1 minut."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Ime ne sme sadržati sledeće znakove: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Početne postavke transpondera"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Ovo ime nije jedinstveno."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Nedostaju audio PID-ovi."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "PID ne sme biti nula."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Morate izabrati neke dane."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanali"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Tajmeri"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronski programski vodič"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB postavke"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Broj"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Ime"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Audio kanal"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Trenutno snimaj"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Emituj"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Pomak vremena"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Snimanje"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Emitovanje"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Izaberite ikonu..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Izaberite ikonu kanala"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digitalni TV"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Živa digitalna televizija radi samo sa motorom xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD Sledeći kanal"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD Prethodni kanal"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD Sledeći događaj"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD Prethodni događaj"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Prikaži OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Tajmeri..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Emitovanje..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanali..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Podesi DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Sve"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Nova kategorija..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Promeni ikonu..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Obriši kategoriju..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Nova kategorija"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Unesite ime za ovu kategoriju:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Želite li zaista da obrišete ovu kategoriju?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Ne mogu da dobavim DVB podatke sa http://hftom.free.fr/kaxtv/dvbdata.tar.gz"
+"<br>\t\t\tProverite svoju vezu sa Internetom i kliknite na „Da“ da pokušate "
+"ponovo."
+"<br>\t\t\tIli „Ne“ da odustanete."
+"<br>\t\t\tAko već imate ovu arhivu, kopirajte je u "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz i kliknite na „Da“."
+"<br>"
+"<br>Da li da pokušam ponovo?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Emitovanje nije uspelo."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Ne mogu da počnem emitovanje."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Tajmer je uspešno napravljen i pokrenut."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Trebalo bi prvo da definišete neke kanale."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Tajmer je uspešno napravljen."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "I dalje snimam."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "I dalje emitujem."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Ne mogu da naštelujem DVB!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Ne mogu da postavim PID-ove"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Nema slobodnog CAM-a"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine i dalje snima. Želite li zaista da izađete?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine ima tajmere u redu. Želite li zaista da izađete?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Zahvat:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Uredi..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Želite li zaista da obrišete sve kanale?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "POČNI skeniranje"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "ZAUSTAVI skeniranje"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Zaustavljam..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Nađeno: %1 TV — %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Ne mogu da otvorim info soket DVB-a."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Lista tajmera:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Novi"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Zaustavi/obriši"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Ovaj tajmer je ponovljen. Želite li da preskočite tekući posao ili da obrišete "
+"tajmer?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Preskoči tekući"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Obrisati izabrani tajmer?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Preuzimam... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Kopiram fajlove..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB postavke"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB uređaj"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Postavke uređaja"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Ime:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tip:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kablovska"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Zemaljska"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Satelitska"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "Atsc"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Nepoznat"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Broj LNB-ova:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1. sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB postavke..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2. sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3. sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4. sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB postavke..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Izvor:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Ovaj uređaj izgleda podržava <b><i>autoscan</i></b> "
+"mogućnost. Možete izabrati <b>AUTO</b> u listi izvora i Kaffeine ćepretražiti "
+"opseg frekvencija."
+"<br>Ako <b><i>autoscan</i></b> ne uspe da nađe vaše kanale, izaberite pravi "
+"izvor sa liste.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Ako ne možete da našete vašu mrežu/lokaciju na listi, onda napravite "
+"jednu. Pogledajte u $HOME/.kde/share/apps/kaffeine/dvb-x/ i uzmite postojeći "
+"fajl kao polaznu tačku. Dopunite je sa vrednostima za vašu mrežu/lokaciju i "
+"dajte joj normalno ime (u skladu sa konvencijim imenovanja). Ako mislite da bi "
+"vaš fajl koristio i drugima, pošaljite ga na kaffeine-user(AT)lists.sf.net.</i>"
+"</qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Opcije DVB snimanja"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Direktorijum snimaka:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Direktorijum za pomake vremena:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Margina početka:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minuta)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Margina kraja:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Trajanje trenutnog snimanja:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Željeni format:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB emitovanje"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Adresa emitovanja:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Port emitovanja:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Info port:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Razno"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Podrazumevani skup znakova (traži restart):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Ažuriraj podatke skeniranja:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Preuzmi"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Izbaci događaje EPG-a u\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Izbaci"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB priključci"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Ne mogu da dobavim podakte o DVB-u sa "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tProverite svoju vezu sa Internetom i kliknite na „Da“ da pokušate "
+"ponovo."
+"<br>\t\t\tIli „Ne“ da odustanete."
+"<br>Da li da pokušam ponovo?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Neispravan direktorijum snimaka."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Neispravan direktorijum pomaka vremena."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Info port i port za emitovanje moraju biti različiti."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Neispravna adresa emitovanja."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB postavke"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Univerzalni LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-Band LNB"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-Band Multipoint LNB"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Dvostruki LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Jednostruki LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V LO"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Učestanost prebacivanja dvostrukog LO:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Niskopojasna učestanost:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Visokopojasna učestanost:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Učestanost jednostrukog LO:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Vert. polariz. LO frekvencija:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Horiz. polariz. LO frekvencija:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Resetuj"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Ne mogu da otvorim DVB soket za emitovanje."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Ne mogu da inicijalizujem DVB soket za emitovanje."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Nemogu da nađem dekodere zvuka."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Učitavanje dekodera „%1“ nije uspelo."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Ne mogu da napravim fasciklu: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bajta"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Audio CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Pusti CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Čupaj CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Izvođač:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Numera"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"Izaberite numere koje hoćete da iščupate i kliknite na dugme <b>Kodiraj</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Kodiraj..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Kodiranje audio CD-a"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Pusti audio CD"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Pusti DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Pusti VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Otvori &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Otvori &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Otvori &audio-CD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Morate izabrati numere za čupanje."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Nađeno je više audio CD-ova. Izaberite jedan:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Nije nađen audio CD."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD Video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Nađeno je više video DVD-ova. Izaberite jedan:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Nađeno je više (S)VCD-a. Izaberite jedan:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Nema naslova"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Numera %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Traažim lokalni cddb unos ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Tražim udaljeni cddb unos ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Nađeno tačno poklapanje cddb unosa ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Nađen približan cddb unos ..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Nađeno je više video DVD-ova. Izaberite jedan:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Lame mp3 koderski priključak za Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Ogg Vorbis koderski priključak za Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB klijent"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Ne mogu da otvorim info soket."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Ne mogu da povežem info soket!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Ne mogu da otvorim soket."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Ne mogu da postavim opciju soketa!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Ne mogu da povežem soket!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Sve veličine"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Veoma malo"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Malo"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Srednje"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Veliko"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Veoma veliko"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Novo traženje"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Omot koji ste izabrali nije dostupan. Izaberite drugi."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Omot nedostupan"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Preuzimanje omota"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Nije nađena odgovarajuća slika. Unesite nove termine za pretragu:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Unesite nove termine za pretragu:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Pusti"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Pusti sledeće / dodaj u red"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Izaberi &sve"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Napravi listu numera iz izabranog"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Dodaj &titl..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Uredi naslov"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Info"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Dužina"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Izvođač"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Godina"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Žanr"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Titlovi"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "u upotrebi"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Fajlovi titlova\n"
+"*.*|Svi fajlovi"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Izaberite fajl titla"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Izaberite omot..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galerija..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filter"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Lista numera:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Izaberite aktivnu listu numera. Da biste joj promenili ime, izmenite ga i "
+"potvrdite tasterom Return."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Pusti listu numera"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Ponavljaj"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Ponavljaj listu numera"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Izmešaj"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Puštaj numere nasumično"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Automatski preuzmi omote"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Automatsko preuzimanje omota"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Očisti tekuću listu numera"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Nova lista numera"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Uvezi listu numera..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "Snimi tekuću listu numera &kao..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "&Ukloni tekuću listu numera"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine-ove liste numera"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Svi fajlovi"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Otvori listu numera"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U liste numera"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS liste numera"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Snimi listu numera"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Lista numera"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "NOVO"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Uvozim resurse medija..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(nema titla)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Drugi titl..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galerija"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Red: %1 unosa, vreme puštanja: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Unosa: %1, vreme puštanja: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Ukloniti „%1“ iz liste i sa diska?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Ime liste numera već postoji"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Unesite drugačije ime za listu:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Izaberite titl"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Fajl medija:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Izaberite film"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Fajl titla:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Pusti / Pauziraj"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Sledeće"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Utišaj"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine, plejer"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine plejer]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Časlav Ilić,Slobodan Simić"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "caslav.ilic@gmx.net,slsimic@gmail.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Medija plejer za KDE 3. Može da koristi više motora za puštanje, podrazumevana "
+"(i preporučena) je xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "© 2003-2005, autori Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Trenutno održava"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Prvobitni autor"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM podrška."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Razne vredne zakrpe."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Zakrpa DVB OSD pregledanja."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Zakrpe DVB kategorija."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Znak za Kaffeine 0.8 i drugi umetnički radovi."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animirani logo za Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Alternativno kodiranje za metaoznake. Mnoge zakrpe."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "Rukovanje postpriključcima za Xine. Mnoge zakrpe."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Uvoz titlova."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Uvoz M3U. Isprobavanje."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Uređivač PID-ova titlova"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID-ovi titlova"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Nova stavka"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Pomeri nagore"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Pomeri nadole"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Ažuriraj izabrano"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Novo"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Strana:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Podstrana:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Jezik:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Ponovljeni tajmer"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Uređivač audio PID-ova"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Audio PID-ovi"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Uređivač emitovanja"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Dostupni kanali:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Lista emitovanja:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Desno kliknite da uredite/obrišete)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Novi..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Traži na"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Pomeraj (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Počni skeniranje"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filteri"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Slobodno za emitovanje"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Provajder:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Dodaj izabrane"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Dodaj filtrirane"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Nađen"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Gotovo"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Uređivač kanala"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Br:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaritet"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Učestanost:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Protok simbola:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Skremblovan"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "PID teleteksta:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Id. servisa:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Video PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Id. transportnog toka:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "PID-ovi titlova..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Audio PID-ovi..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Propusnost:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC visoko:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Prenos:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC nisko:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Interval odstupa:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hijerarhija:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulacija:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inverzija:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Podešavanja kodiranja"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Koder:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Osnovni direktorijum:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Isključi sve provere"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Normalan režim"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoia režim"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalizuj"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD traka alata"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Opcije za Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bitni protok:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Opcije za Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Kvalitet :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Lista numera"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Opcije izlaska"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Plejer"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Omogući automatsku &promenu veličine"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Mrežno emitovanje"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigacija"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD meniji"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Audio"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Proporcija"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Traka za snimke ekrana"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Traka kontrola"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Traka jačine zvuka"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Traka položaja"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Podešavanje Kaffeine-a"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Ponašanje"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Pauziraj video dok je prozor minimiziran"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Ugnjezdi u sistemsku kasetu"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sek."
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "isklj"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Trajanje objave naslova u sistemskoj kaseti"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Uključi DVB klijent"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Razne opcije"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Koristi alternativno (ne-Unicode) kodiranje za metaoznake"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Izaberite alternativno kodiranje za metaoznake\n"
+"(da bi se pretvorile u Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Očisti listu skorašnjih fajlova"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Odmah počni sa puštanjem"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Počni u preko celog ekrana"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Postavi audio drajver"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Postavi video drajver"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Postavi putanju audio-CD/VCD/DVD uređaja."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Ispisuj ispravljačke poruke Xine-a"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Pokreni čarobnjak za instalaciju"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Fajlovi za puštanje. Mogu biti lokalni, URL, direktorijum ili „DVD“, „VCD“, "
+"„Audio CD“."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Pokreni"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Prozor plejera"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Podržani medija formati"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG audio fajlovi"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG video fajlovi"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis fajlovi"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI fajlovi"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime fajlovi"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media fajlovi"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska fajlovi"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC fajlovi"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media fajlovi"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV fajlovi"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Učitavanje dela plejera „%1“ nije uspelo."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 nije nađen u putanji pretrage."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Otvor&i URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Otvori &direktorijum..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Izađi i ugasi monitor posle ove numere"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Izađi posle ove numere"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Izađi posle liste numera"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimalni režim"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Prebaci &listu numera/plejer"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Sačuvaj &originalnu proporciju"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Originalna veličina"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Dvostruka veličina"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Trostruka veličina"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Motor plejera"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB klijent"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Plejer"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Glavni prozor"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS proširenje X servera nije nađeno."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Ovo će izaći iz Kaffeine-a i isključiti napajanje monitora pošto se fajl ili "
+"lista numera završi. Da bi se monitor isključio, mora postojati opcija „dpms“ u "
+"vašem fajlu sa postavkama X-a."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Otvori fajl(ove)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Otvori URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Unesite URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Otvori fascikle"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Nema %1 u uređaju, ili je pogrešna putanja do uređaja."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Izaberite postojeći uređaj:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1, čarobnjak za instalaciju"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Provera instalacije"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "U redu."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Deo nije nađen. Proverite instalaciju!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Nađena verzija"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine zahteva KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 kodeci"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Nijedan WIN32 kodek nije nađen u /usr/lib/win32. Nećete moći da puštate Windows "
+"Media 9 fajlove, novije Real Media fajlove, i neke manje poznate formate. "
+"Kodeke možete preuzeti ovde:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss nije nađena. Nećete moći da puštate šifrovane DVD-ove (većina "
+"komercijalnih). Biblioteku možete nabaviti ovde (ali njenim korišćenjem možete "
+"prekršiti zakone o autorskim pravima u svojoj državi!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD uređaj"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"DMA režim je isključen! Za glatko puštanje DVD-a, kao administrator pokrenite:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"Ne mogu da proverim DMA režim. Dozvola nije data ili nema takvog uređaja:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB uređaj"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Nijedan DVB uređaj nije nađen. Funkcije u vezi sa DVB-om će biti skrivene."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribucija"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"xine-lib isporučena uz SuSE „može biti bez nekih mogućnosti zbog zakonskih "
+"ograničenja (moguća kršenja patenata)“. Trebalo bi da koristite pakete odavde:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "REZULTAT"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Bilo je nekih problema, ali će Kaffeine verovatno raditi."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Sve je u redu!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Koristi Kaffeine kao pomoćni program za mms:// tokove (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Koristi Kaffeine kao pomoćni program za rtsp:// tokove (Real Media i drugi)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Napravi ikonu Kaffeine-a na radnoj površini"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Opcije instalacije"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Kvalitet rasplitanja"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Vrlo niska upotreba procesora, najgori kvalitet.</b>"
+"<br>Gubi se pola uspravne rezolucije. Za neke sisteme (sa PCI grafičkim "
+"karticama) ovo može smanjiti opterećenje procesora u odnosu na obično puštanje "
+"(bez rasplitanja)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Niska upotreba procesora, slab kvalitet.</b>"
+"<br>Slika je zamućena uspravno, tako da su efekti preplitanja uklonjeni."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Srednja upotreba procesora, srednji kvalitet.</b>"
+"<br>Slika se analizira i ispravljaju se (interpoliraju) područja sa artefaktima "
+"preplitanja."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Visoka upotreba procesora, dobar kvalitet.</b>"
+"<br>Pretvaranje DVD formata slike poboljšava kvalitet u ispravlja grešku "
+"hroma-naduzorkovanja."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Vrlo visoka upotreba procesora, odličan kvalitet.</b>"
+"<br>Pored korišćenja pametnih algoritama za rasplitanje, takođe se udvostručuje "
+"broj kadrova (30->60fps) radi poklapanja sa TV-om. Otkriva i otklanja 3-2 "
+"spuštanje. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Vrlo visoka upotreba procesora, odličan kvalitet sa (eksperimentalnim) "
+"poboljšanjima.</b>"
+"<br>Uključuje ispravljanje brujanja (pušta filmove u originalna 24 kadra po "
+"sekundi) i vertikalno ujednačavanje boja (ispravlja male obojene trake koje se "
+"vide na nekim DVD-ovima). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Korisnički definisano"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Podesi tvtime, priključak za rasplitanje..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Može zahtevati zakrpljeno 2.4 jezgro (kao RedHat-ovo) ili 2.6 jezgro.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Podesi tvtime, priključak za rasplitanje"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Priključci za efekte"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Audio"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Audio filteri"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Uključi audio filtere"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Dodaj filter"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Ukloni sve filtere"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Video filteri"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Uključi video filtere"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Parametri motora Xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Opcije za %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Početničke opcije"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Stručnjačke opcije"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Deo puštača za Kaffeine na osnovi xine-a."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Podrška za SMIL (jezik za sinhronizovanu multimedijalnu integraciju) je samo "
+"najosnovnija!\n"
+"XinePart može sada pokušati da pusti sadržane video izvore bez ikakvog "
+"rasporeda. Nastaviti?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Snimi tok kao"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Titl"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Audio kanal"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 od %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG fajl\n"
+"*.bmp|BMP fajl\n"
+"*.xbm|XBM fajl"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Sačuvaj snimak ekrana kao"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Port za emitovanje:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Podesi primanje emitovanog toka"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Adresa pošiljaoca:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Skoči na položaj:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine greška"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine poruka"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Spreman"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Puštam"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Fajl titla"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Snimi tok kao"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Informacije o numeri"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Kopiraj URL u klipbord"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Pusti u Kaffeine-u spolja"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Pošalji tok emitovanja..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Primi tok emitovanja..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Sačuvaj snimak ekrana..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Snimi tok..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Snima tekući tok na disk. Ova mogućnost je isključena za neke formate (npr. "
+"Real Media) radi sprečavanja mogućih zakonskih problema."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Menja minimalni režim"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Pauza"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Brzo napred"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "&Usporeno"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Skoči napred (20 sek)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Skoči nazad (20 sek)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Skoči napred (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Skoči nazad (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Skoči napred (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Skoči nazad (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Skoči na položaj..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD meni levo"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD meni desno"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD meni gore"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD meni dole"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD meni izbor"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Audio kanal"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Izaberite audio kanal"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Audio &vizuelizacija"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Zvuk jače"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Zvuk slabije"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Rasplići"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Aktivirajte ovo za prepletene tokove, npr. neke DVD-ove."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Automatski"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "Ana&morfično"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Kvadrat"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Uveličaj vodoravno"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Umanji vodoravno"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Uveličaj uspravno"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Umanji uspravno"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Kvalitet rasplitanja"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Video postavke"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Ekvilajzer"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Uklj/isklj. menija"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Naslov"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Koren"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Podslika"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Ugao"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Deo"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Naslovi"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Poglavlja"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Uglovi"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Informacije o &numeri"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Priključci za &efekte..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Parametri &motora Xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Jačina zvuka"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Položaj"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Kratak klik: tajmer napred/nazad\n"
+"Dugačak klik: OSD tajmera"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Vreme puštanja"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Tražim CDDB unose..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Audio CD numera %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD numera %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Video postavke"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Nijansa"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Zasićenje"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Osvetljenost"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Audio/video pomak"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Pomak titla"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "automatski"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Opšte upozorenje: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Informacije nisu dostupne."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Bezbednosno upozorenje: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Domaćin na koji pokušavate da se povežete nije poznat.\n"
+"Proverite ispravnost navedenog imena domaćina. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Ime uređaja koje ste naveli ne deluje ispravno. "
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Izgleda da mreža nije dostupna.\n"
+"Proverite svoja mrežna podešavanja i ime servera. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Audio izlaz nije dostupan. Uređaj je zauzet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Veza je odbijena.\n"
+"Proverite ime domaćina. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Navedeni fajl ili URL nije nađen. Proverite to. "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Dozvola za ovaj izvor nije data. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Izvor se ne može pročitati.\n"
+"Možda nemate dovoljno ovlašćenja za ovo, ili izvor ne sadrži podatke (npr. nema "
+"diska u uređaju). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Došlo je do problema pri učitavanju biblioteke ili dekodera: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Izvor deluje dešifrovano, ali se ne može pročitati. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Vaš DVD je verovatno šifrovan. Možete upotrebiti libdvdcss za čitanje ovog "
+"diska, ali time možete prekršiti zakone države u kojoj ste. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Nepoznata greška: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Greška: Ne mogu da inicijalizujem novi video drajver %1 — koristim %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Koristim video drajver: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Greška: Ne mogu da inicijalizujem novi audio drajver %1 — koristim %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Koristim audio drajver: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Inicijalizuj Xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Ne mogu da inicijalizujem motor Xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Audio drajver koji se koristi (podrazumevano: automatski)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Video drajver koji se koristi (podrazumevano: automatski)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Koristi softversku audio miksetu"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Prikazuj OSD poruke"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Veličina OSD teksta"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Font za OSD poruke"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Ne mogu da incijalizujem video drajver „%1“, pokušavam „automatski“..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Nijedan video drajver nije uspeo da se incijalizuje!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Ne mogu da incijalizujem audio drajver „%1“, pokušavam „automatski“..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Nijedan audio drajver nije uspeo da se incijalizuje!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Ne mogu da napravim novi tok Xine-a!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: otvaram..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Otvaram..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Audio kodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Video kodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Nije nađen priključak za rukovanje ovim resursom"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Resurs deluje pokvareno"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Zahtevani resurs ne postoji"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Resurs se ne može otvoriti"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Generička greška"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Neutišano"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Utišano"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Brzo napred %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Usporeno %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Rasplitanje: uključeno"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Rasplitanje: isključeno"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Proporcija"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Automatski"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Uveličanje X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Uveličanje Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "ms"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Postavke ekvilajzera"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Pojačanje zvuka"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Pojačanje zvuka za ekvilajzer — ako zvuk ima previše šuma isključite ovo"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Obriši filter"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Idem na %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Inicijalizacija GStreamer-a nije uspela!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Utišaj"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Komentar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "Parametri motora &GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer nije mogao da se incijalizuje!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Nedostaje registar GStreamer-a! Da li ste zaboravili da pokrenete <b>"
+"gst-register</b> (kao administrator) posle instalacije?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Ne mogu da inicijalizujem audio drajver „%1“, pokušavam drugi..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Nije nađen upotrebljiv audio drajver!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Ne mogu da inicijalizujem video drajver „%1“, pokušavam drugi..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Nije nađen upotrebljiv video drajver!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Parametri motora GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Audio opcije"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Željeni audio drajver"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Video opcije"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Željeni video drajver"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Zahteva ponovno pokretanje."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Mediji"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Medija opcije"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD uređaj"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Ovi kanali već postoje i zato nisu dodati:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Nisam uspeo da se povežem sa X serverom!"
diff --git a/po/sv.po b/po/sv.po
new file mode 100644
index 0000000..7cc1405
--- /dev/null
+++ b/po/sv.po
@@ -0,0 +1,3181 @@
+# translation of kaffeine.po to Swedish
+# translation of sv.po to
+# translation of sv.po to
+# translation of sv.po to
+# translation of sv.po to
+# translation of sv.po to
+# translation of sv.po to
+# translation of sv.po to
+# translation of sv.po to
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Björn Nitzler <b.nitzler@umea.bonet.se>, 2004, 2005.
+# Stefan Asserhall <stefan.asserhall@comhem.se>, 2005.
+# Stefan Asserhäll <stefan.asserhall@comhem.se>, 2005, 2006.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER, 2004.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-11-09 19:43+0100\n"
+"Last-Translator: Stefan Asserhäll <stefan.asserhall@comhem.se>\n"
+"Language-Team: Swedish <sv@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Elektronisk programguide"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Uppdatera"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Schemalagt"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Nuvarande/nästa"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Starta"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Varaktighet"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Titel"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Visa alla program"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Lägg till i inspelningstider"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Namn:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Starta:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Varaktighet:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Slut:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Spela in som:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Ingen"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Dagligen"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Veckovis"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Månadsvis"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Egen"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Repetera..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Tidredigering"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Du måste ge det ett namn."
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Varaktigheten måste vara minst 1 minut."
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Namnet får inte innehålla något av följande tecken: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Initiala transponderinställningar"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Detta namn är inte unikt."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Saknar ljudpaketidentifierare."
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Paketidentifierare måste vara skild från noll."
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Du måste välja några dagar."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanaler"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Inspelningstider"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronisk programguide"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "Skärmvisning"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Digital-tvinställningar"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Nummer"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Namn"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Ljudkanaler"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Omedelbar inspelning"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Utsändning"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Tidsförskjutning"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Inspelning"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Utsändning"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Välj ikon..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Välj kanalikon"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Digital-tv"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Direktsänd digital-tv fungerar bara med Xine-gränssnittet."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Skärmvisning nästa kanal"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Skärmvisning föregående kanal"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Skärmvisning växling"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Skärmvisning nästa händelse"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Skärmvisning föregående händelse"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Visa skärmmeddelande"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "Elektronisk programguide..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Inspelningstider..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Utsändning..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanaler..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Ställ in digital-tv..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Alla"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Ny kategori..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Ändra ikon..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Ta bort kategori..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Ny kategori"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Skriv in ett namn på kategorin:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Vill du verkligen ta bort kategorin?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Kan inte hämta digital-tvdata från "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz."
+"<br>\t\t\tKontrollera din Internet-anslutning, och klicka på Ja för att försöka "
+"igen."
+"<br>\t\t\tEller klicka på Nej för att avbryta."
+"<br>\t\t\tOm du redan har detta arkiv, kopiera det till "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz och klicka på Ja."
+"<br>"
+"<br>Ska ett nytt försök göras?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Utsändning misslyckades."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Kan inte starta utsändning."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Inspelningstid skapades och startades med lyckat resultat."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Du kanske först vill definiera någon kanal."
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Inspelningstid skapades med lyckat resultat."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Spelar fortfarande in."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Sänder fortfarande ut."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Kan inte ställa in digital-tv."
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Kan inte ställa in paketidentifierare."
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Ingen villkorlig åtkomstmodul ledig"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine spelar fortfarande in. Vill du verkligen avsluta?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine har köade inspelningstider. Vill du verkligen avsluta?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Signal:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "Signal-brusförhållande:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Låsning:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Redigera..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Vill du verkligen ta bort alla kanaler?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Starta sökning"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Stoppa sökning"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Stoppar..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Hittade: %1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Kan inte öppna informationsuttag för digital-tv."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Tidlista:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Ny"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Stoppa/Ta bort"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Inspelningstiden upprepas. Vill du hoppa över nuvarande jobb eller ta bort "
+"inspelningstiden?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Hoppa över nuvarande"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Ta bort markerad inspelningstid?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Laddar ner..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Kopierar data filer..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Digital-tvinställningar"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Digital-tvenhet"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Enhetsinställningar"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Namn:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Typ:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kabel"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Markbunden"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "satellit"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "ATSC"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Okänd"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Antal lågbrusblock:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1:a sat:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Lågbrusblockinställningar..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2:a sat:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3:e sat:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4:e sat:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Lågbrusblockinställningar..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Källa:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Enheten verkar stödja funktionen <b><i>automatisk sökning</i></b>"
+". Du kan välja <b>Automatisk</b> i listan med källor för att låta Kaffeine söka "
+"i ett frekvensområde."
+"<br>Om <b><i>automatisk sökning</i></b> misslyckas med att hitta dina kanaler, "
+"välj en verklig källa i listan.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>Om du inte kan hitta ditt nätverk eller din plats i listan, måste du "
+"skapa dem. Titta i $HOME/.kde/share/apps/kaffeine/dvb-x/ och använd en "
+"befintlig fil som exempel.Fyll i den med värden för ditt nätverk eller din "
+"plats och ge den ett vettigt namn (följ namngivningskonventionen). Om du tror "
+"att den nya filen kan vara användbar för andra, skicka den till "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Inspelningsalternativ för digital-tv"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Inspelningskatalog:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Tidförskjutningskatalog:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Startmarginal:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(minuter)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Slutmarginal:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Omedelbar inspelningsvaraktighet:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Föredraget format:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Digital-tvutsändning"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Utsändningsadress:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Utsändningsport:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Informationsport:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Blandat"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Förvald teckenuppsättning (omstart krävs):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Uppdatera sökdata:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Nerladdning"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Spara händelser från elektronisk programguide i\n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Spara"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Insticksprogram för digital-tvklient"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Kan inte hämta digital-tvdata från "
+"http://hftom.free.fr/kaxtv/dvbdata.tar.gz. "
+"<br>\t\t\tKontrollera din Internet-anslutning, och klicka på Ja för att försöka "
+"igen."
+"<br>\t\t\tEller klicka på Nej för att avbryta."
+"<br>Ska ett nytt försök göras?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Felaktig inspelningskatalog."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Felaktig tidförskjutningskatalog."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Utsändnings- och informationsportar måste vara olika."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Felaktig utsändningsadress."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Lågbrusblockinställningar"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Universellt lågbrusblock"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "C-band lågbrusblock"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "C-band flerpunkters lågbrusblock"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Dubbel låg"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Enkel låg"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "H/V låg"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Dubbel låg omslagsfrekvens:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Lågbandsfrekvens:"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Högbandsfrekvens:"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Enkel låg frekvens:"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "Vertikalt polariserad låg frekvens:"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "Horisontellt polariserad låg frekvens:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Återställ"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Kan inte öppna utsändningsuttag för digital-tv."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Kan inte initiera utsändningsuttag för digital-tv."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Några ljudkodare hittades inte."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Laddning av kodaren '%1' misslyckades."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Kan inte skapa katalog: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "Mibyte"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "Kibyte"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Byte"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Ljudcd"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Spela cd"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Lagra cd"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Artist:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Album:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Spår"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "Välj spåren du vill lagra och klicka på knappen <b>Koda</b>."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Koda..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Kodning av ljudcd"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Spela ljudcd"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Spela dvd"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Spela vcd"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Öppna &dvd"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Öppna &vcd"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Öppna &ljudcd"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Du måste välja spår att lagra."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Flera ljudcd hittades. Välj en:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Någon ljudcd hittades inte."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "Video-dvd"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Flera video-dvd hittades. Välj en:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "Vcd-svcd"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Flera (s)vcd hittades. Välj en:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Saknar titel"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Spår %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Söker efter lokal CDDB-post..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Söker efter CDDB-post via nätet..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Hittade CDDB-post som passar in exakt..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Hittade näraliggande CDDB-post..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB träffar"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Flera näraliggande CDDB-poster hittades. Välj en:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "Kaffeine MP3 Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "En Lame MP3 kodningsprogramdel för Kaffeine."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "Kaffeine Ogg Vorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "En Ogg Vorbis-baserad kodningsprogramdel för Kaffeine."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Digital-tvklient"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Kan inte öppna informationsuttag."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Kan inte binda till informationsuttag."
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Kan inte öppna uttag."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Kan inte ställa in alternativ för uttag."
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Kan inte binda till uttag."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Alla storlekar"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Mycket liten"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Liten"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Normal"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Stor"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Mycket stor"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Ny sökning"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Omslaget du har valt är inte tillgängligt. Välj ett annat."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Omslag inte tillgängligt"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Omslagsnerladdning"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Inga passande bilder hittades. Skriv in nya sökbegrepp:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Skriv in nya sökbegrepp:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Spela"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Spela nästa/Lägg till i kö"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Markera &alla"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Skapa spellista från markerat"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Lägg till under&text..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "R&edigera titel"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Information"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Längd"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "Webbadress"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Artist"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Album"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "År"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Genre"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Undertexter"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "används redan"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Textningsfiler\n"
+"*.*|Alla filer"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Välj undertextfil"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Välj ett omslag..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galleri..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filter"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Spellista:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Markera den aktiva spellistan. För att ändra spellistans namn redigera den och "
+"bekräfta med returtangenten."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Spela spellista"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Repetera"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Repetera spellista"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Blanda"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Spela spår slumpmässigt"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Ladda automatiskt ner omslag"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Automatisk nerladdning av omslag"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "&Rensa nuvarande spellista"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Ny spellista"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Importera spellista..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Spara nuvarande spellista som..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "&Ta bort nuvarande spellista"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine-spellistor"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Alla filer"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Öppna spellista"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U-spellistor"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS-spellistor"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Spara spellista"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Spellista"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "Ny"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Importerar mediaresurser..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(inga undertexter)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Annan undertext..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galleri"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Kö: %1 spår, Speltid: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Spår: %1, Speltid: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Ta bort '%1' från både lista och disk?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Spellistans namn finns redan"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Skriv in ett annat namn på spellistan:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Välj undertext"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Mediafil:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Välj film"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Textningsfil:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Spela/Paus"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Nästa"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Tyst"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine mediaspelare"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine spelare]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Björn Nitzler,Stefan Asserhäll"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "b.nitzler@umea.bonet.se,stefan.asserhall@comhem.se"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"En mediaspelare för KDE 3. Kan använda ett flertal gränssnitt för uppspelning, "
+"standard (och rekommenderat) är Xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "© 2003-2005, Kaffeines upphovsmän"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Nuvarande utvecklare"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Ursprunglig upphovsman"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Stöd för CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Diverse värdefulla programfixar."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "Programfix för skärmvisningsbläddring i digital-tv."
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "Programfix för kategorier i digital-tv."
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Logotyp för Kaffeine 0.8 och annan grafik."
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Animering av logotyp för Kaffeine 0.5"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Alternativ teckentabell för metataggar. Många programfixar."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+"Hantering av Xines insticksprogram för efterbehandling. Många programfixar."
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Import av textningsfiler."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U-import. Testning."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Redigering av textningspaketidentifierare"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Textningspaketidentifierare"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Ny post"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Flytta upp"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Flytta ner"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Uppdatera markerade"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Ny"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Paketidentifierare:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Sida:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Delsida:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Språk:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Upprepad inspelningstid"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Redigering av ljudpaketidentifierare"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Ljudpaketidentifierare"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Utsändningsredigering"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Tillgängliga kanaler:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Utsändningslista:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Högerklicka för att redigera/radera)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Ny..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Sök på"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Förskjutning (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Starta sökning"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filter"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Fri att sända"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Leverantör:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Lägg till markerade"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Lägg till filtrerade"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Hittad"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "Signal-brusförhållande"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Färdig"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&Digital-tv"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Kanalredigering"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Polaritet"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frekvens:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Symboltakt:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Krypterad"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Text-tv paketidentifierare:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Tjänst-id:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Videopaketidentifierare:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Transportström-id:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Textningspaketidentifierare..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Ljudpaketidentifierare..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Bandbredd:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC Hög:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Sändning:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC Låg:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Vaktintervall:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Hierarki:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Modulation:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Inversion:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Kodningsinställningar"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Kodare:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Baskatalog:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Inaktivera all kontroll"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Normalt läge"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoia-läge"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalisera"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Verktygsrad för cd"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame MP3-inställningar"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "Variabel bithastighet"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bithastighet:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kbit/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis-inställningar"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Kvalitet:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Spel&lista"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Avslutningsalternativ"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "S&pelare"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "Använd automatisk bildsto&rlek"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Nätverksutsändning"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Navigering"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&Dvd"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&Dvd-menyer"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Ljud"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Bildproportion"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Verktygsrad för skärmdump"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Verktygsrad för kontroller"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Verktygsrad för volym"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Verktygsrad för position"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine-inställning"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Uppförande"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Paus i video när fönstret minimeras"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Bädda in i systembrickan"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sek"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "av"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Hur lång tid annonsering av titel visas i systembrickan"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Aktivera digital-tvklient"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Diverse alternativ"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Använd alternativ (ej Unicode) teckentabell för metataggar."
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Välj alternativ teckentabell för metataggar\n"
+"(för att konvertera till Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Töm listan för senast öppnade filer"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Starta uppspelning omedelbart"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Starta i fullskärmsläge"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Ställ in ljuddrivrutin"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Ställ in videodrivrutin"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Ställ in sökväg till ljudcd-, vcd-, dvd-enheten."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Visa Xine avlusningsmeddelanden"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Kör installationsguiden"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Fil(er) att spela. Kan vara en lokal fil, en webbadress, en katalog eller "
+"'DVD', 'VCD', 'AudioCD'."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Starta"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Spelarfönster"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Media format som stöds"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG-ljudfiler"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG-videofiler"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis-filer"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Avi-filer"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime-filer"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media-filer"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska-filer"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC-filer"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media-filer"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV-filer"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Laddning av spelarens programdel '%1' misslyckades."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 hittades inte i sökvägen."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Öppna &webbadress..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Öppna &katalog..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Avsluta och stäng av bildskärmen efter detta spår"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Avsluta efter detta spår"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Avsluta efter spellista"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Minimalt läge"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Växla s&pellista/spelare"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Behåll &originalproportion"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Originalstorlek"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Dubbel storlek"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Tredubbel storlek"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "S&pelargränssnitt"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Digital-tvklient"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Spelare"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Huvudfönster"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS Xserver-utökning hittades inte."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Detta kommer att avsluta Kaffeine och stänga av strömmen till bildskärmen efter "
+"att filen/spellistan har spelat klart. Alternativet \"dpms\" måste finnas i din "
+"X-servers konfigurationsfil för att skärmen skall stängas av."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Öppna fil(er)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Öppna webbadress"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Skriv in webbadress:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Öppna katalog"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Ingen %1 i enheten, eller felaktig sökväg till enhet."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Var vänlig välj korrekt enhet:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 installationsguide"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Installationskontroll"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ok."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Delprogram hittades inte. Kontrollera din installation."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Hittade version"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine kräver KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32-avkodare"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"Inga WIN32-avkodare hittades i /usr/lib/win32. Du kommer inte att kunna spela "
+"Windows Media 9 filer, nyare Real Media filer och en del mindre kända format. "
+"Ladda hem avkodarna här:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss hittades inte. Du kommer inte att kunna spela krypterade (de flesta "
+"kommersiella) dvd:er. Du kan hämta biblioteket här (men användning av det "
+"kanske inte är förenligt med upphovsrättslagarna i ditt land):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Dvd-enhet"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"DMA-läge avstängt. För jämn dvd-uppspelning kör som systemadministratör:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "Kan inte kontrollera DMA-läge. Åtkomst nekad eller ingen sådan enhet:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "Digital-tvenhet"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+"Inga digital-tvenheter hittades. Digital-tvrelaterade funktioner döljs."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Distribution"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"xine-lib som SuSE levererar \"kan sakna vissa funktioner på grund av legala "
+"skäl (eventuellt patentintrång)\". Du bör använda paketen härifrån:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "Resultat"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Upptäckte en del problem, men trots det kan Kaffeine fungera."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Allt ok!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "Använd Kaffeine som hjälpprogram för mms:// (Microsoft Media) strömmar"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Använd Kaffeine som hjälpprogram för rtsp:// (Real Media och andra) strömmar "
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Skapa en ikon för Kaffeine på skrivbordet"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Installationsalternativ"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Kvalitet för borttagning av inflätning"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Mycket låg processoranvändning, sämst kvalitet.</b>"
+"<br>Halva den vertikala upplösningen förloras. För vissa system (med PCI "
+"videokort) så kan detta minska processoranvändningen jämfört med vanlig "
+"videoavspelning (ingen borttagning av inflätning)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Låg processoranvändning, dålig kvalitet.</b>"
+"<br>Bilden diffuseras vertikalt så att inflätningseffekter tas bort."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Medium processoranvändning, mediumkvalitet.</b>"
+"<br>Bilden analyseras och områden som uppvisar inflätningsfel rättas till (slås "
+"samman)."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Hög processoranvändning, bra kvalitet.</b>"
+"<br>Konvertering av dvd-bildformat ökar kvaliteten och rättar till fel vid "
+"\"upsampling\" av krominans."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Mycket hög processoranvändning, mycket bra kvalitet.</b>"
+"<br>Förutom användning av smarta algoritmer vid borttagning av inflätning så "
+"fördubblas bildrutefrekvensen (30->60 bilder per sekund) för att matcha "
+"fältfrekvensen på en TV. Känner av och återställer 3-2 nerdragning. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Högsta processoranvändning, mycket bra kvalitet med (experimentella) "
+"förbättringar.</b>"
+"<br>Aktiverar korrigering av skakningar (spelar filmer med deras urspungliga "
+"hastighet 24 bilder per sekund) och vertikal färgutjämning (rättar till små "
+"färgstreck som kan ses på vissa dvd:er). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Användardefinierad"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "Ställ in tvtime-insticksprogram för borttagning av inflätning..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Kan kräva en patchad 2.4 kärna (såsom en från RedHat) eller 2.6 kärna.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "Ställ in tvtime-insticksprogram för borttagning av inflätning"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Effektinsticksprogram"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Ljud"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Ljudfilter"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Använd ljudfilter"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Lägg till filter"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Ta bort alla filter"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Videofilter"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Använd videofilter"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Xine-gränssnittets parametrar"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 alternativ"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Nybörjaralternativ"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Expertalternativ"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "Xine-delprogram"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "En Xine-baserad spelarprogramdel för Kaffeine."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"Stödet för SMIL (Synchronized Multimedia Integration Language) är rudimentärt.\n"
+"Xine-delprogrammet kan nu försöka spela innehållet i videokällan utan någon "
+"layout. Fortsätt?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Spara ström som"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Undertext"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Ljudkanal"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 av %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-fil\n"
+"*.bmp|BMP-fil\n"
+"*.xbm|XBM-fil"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Spara skärmdump som"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Utsändningsport:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Anpassa mottagning av utsändningsström"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Sändarens adress:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Gå till position:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Fel i Xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Meddelande från Xine:"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Klar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Spelar"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Textningsfil"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Spara ström som..."
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Spårinformation"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Kopiera webbadress till klippbord"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Spela med Kaffeine externt"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Sänd ut ström..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "&Ta emot utsänd ström..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Spara skärmdump..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Spara ström..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Sparar nuvarande mediaström till hårddisken. Denna möjlighet är avstängd för "
+"vissa format (t.ex. Real Media) för att undvika potentiella legala problem."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "Växla minimalt läge"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Paus"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Snabbspola framåt"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "Slow &motion"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "Gå framåt (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "Gå bakåt (20 s)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Gå framåt (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Gå bakåt (1 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Gå framåt (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Gå bakåt (10 min)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Gå till position..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "Dvd-meny vänster"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "Dvd-meny höger"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "Dvd-meny upp"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "Dvd-meny ner"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "Dvd-meny välj"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Ljudkanal"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Välj ljudkanal"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Visualisering av ljud"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Öka volym"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Minska volym"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Ta bort inflätning"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Aktivera det här för inflätade strömmar, till exempel vissa dvd:er."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Automatisk"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorf"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Fyrkantig"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Zooma in horisontellt"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Zooma ut horisontellt"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Zooma in vertikalt"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Zooma ut vertikalt"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "&Kvalitet för borttagning av inflätning"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Videoinställningar"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Equalizer"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Växla &meny"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Titel"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Rot"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Delbild"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Vinkel"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Avsnitt"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Titlar"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Kapitel"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Vinklar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Spår&information"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "Effektinsticks&program..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&Xine-gränssnittets parametrar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Volym"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Position"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Kort klick: Flytta inspelningstid framåt/bakåt\n"
+"Långt klick: Visa eller dölj skärmmeddelande för inspelningstid"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Speltid"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "Letar efter CDDB-poster..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Ljudcd-spår %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Vcd-spår %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Videoinställningar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Färgton"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Färgmättnad"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Ljusstyrka"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Ljud- och videoförskjutning"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Textningsförskjutning"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "automatisk"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Allmän varning: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Ingen information tillgänglig."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Säkerhetsvarning: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Värddatorn du försöker kontakta är okänd.\n"
+"Kontrollera att det specifierade värddatornamnet är korrekt."
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Enhetsnamnet du angav verkar felaktigt."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Nätverket ser inte ut att vara tillgängligt.\n"
+"Kontrollera dina nätverksinställningar och serverns namn. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Ljudutmatning är inte tillgängligt. Enheten är upptagen. "
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Anslutningen vägrades.\n"
+"Kontrollera värddatornamnet. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+"Den specifierade filen eller webbadressen hittades inte. Var vänlig kontrollera "
+"den."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Åtkomst till denna källa vägrades. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Källan kan inte läsas.\n"
+"Kanske har du inte tillräckliga rättigheter för detta, eller så innehåller "
+"källan ingen data (dvs. ingen skiva i enheten). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Ett fel uppstod vid laddning av bibliotek eller avkodare: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Källan ser ut att vara krypterad och kan inte läsas. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Din dvd är förmodligen krypterad. Beroende på lagarna i ditt land så kan det "
+"kanske vara möjligt att använda libdvdcss för att läsa denna skiva. "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Okänt fel: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Fel: Kan inte initiera ny videodrivrutin %1 - använder %2."
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Använder videodrivrutin: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Fel: Kan inte initiera ny ljuddrivrutin %1 - använder %2."
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Använder ljuddrivrutin: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Initierar Xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Kan inte initiera Xine-gränssnittet."
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Ljuddrivrutin att använda (standard: automatisk)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Videodrivrutin att använda (standard: automatisk)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Använd mjukvarumixer för ljud"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Visa skärmmeddelanden"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Storlek på skärmmeddelandetext"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Teckensnitt för skärmmeddelanden"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "Kan inte initiera videodrivrutin '%1' - försöker med 'automatisk'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Alla videodrivrutiner misslyckades att initiera."
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "Kan inte initiera ljuddrivrutin '%1' - försöker med 'automatisk'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Alla ljuddrivrutiner misslyckades att initiera."
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Kan inte skapa en ny Xine-ström."
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "Digital-tv: öppnar..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Öppnar..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Ljudavkodare"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Videoavkodare"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Hittade inget insticksprogram som kan hantera denna resurs"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Resursen verkar vara felaktig"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Efterfrågad resurs existerar inte"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Resursen kan inte öppnas"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Allmänt fel"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Tyst av"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Tyst på"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Snabbspola framåt %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Slow motion %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Borttagning av inflätning: på"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Borttagning av inflätning: av"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Bildproportion"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Automatisk"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Zooma X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Zooma Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msec"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Equalizerinställningar"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Volymökning"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "Volymökning för Equalizer - Om ljudet blir brusigt stäng av detta"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Ta bort filter"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "Söker till %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "Initiering av Gstreamer misslyckades."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "Gstreamer-delprogram"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Tyst"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Kommentar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "&Gstreamer-gränssnittets parametrar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "Gstreamer kunde inte initieras."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"Saknar Gstreamer-registret. Glömde du köra <b>gst-register</b> "
+"(som systemadministratör) efter installationen?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "Kan inte initiera ljuddrivrutin '%1' - försöker med en annan..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Ingen användbar ljuddrivrutin hittades."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "Kan inte initiera videodrivrutin '%1' - försöker med en annan..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Ingen användbar videodrivrutin hittades."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Gstreamer-gränssnittets parametrar"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Ljudalternativ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Ljuddrivrutin som föredras"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Videoalternativ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Videodrivrutin som föredras"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Omstart krävs."
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Media"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Mediaalternativ"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Cd-, vcd-, dvd-enhet"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "Tomt delprogram"
diff --git a/po/tg.po b/po/tg.po
new file mode 100644
index 0000000..b7387b3
--- /dev/null
+++ b/po/tg.po
@@ -0,0 +1,3070 @@
+# translation of kaffeine.po to Tajik Language
+# Victor Ibragimov <youth_opportunities@tajikngo.org>, 2007.
+# Roger Kovacs <rkovacs@khujand.org>, 2007.
+# Youth Opportunities NGO
+# Khujand Computer Technologies, Inc
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-05-07 21:22+0500\n"
+"Last-Translator: Victor Ibragimov <youth_opportunities@tajikngo.org>\n"
+"Language-Team: Tajik Language\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "Барномаи телевизионӣ"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Навсозӣ"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Ҷорӣ/Навбатӣ"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Шабака"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Оғоз кардан"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Давомнокӣ"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Сарлавҳа"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Намоиши ҳамаи барномаҳо"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Илова ба вақтсанҷ"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Ном:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Шабака:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Оғоз кардан:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Давомнокӣ:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Итмом:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Сабт кардан ҳамчун:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Ҳеҷ чиз"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Ҳар рӯз"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Ҳар ҳафта"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Ҳар моҳ"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Оддӣ"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Такрор..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Тағйири вақтсанҷ"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Шумо бояд ба ин ном гузоред!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Давомнокӣ бояд аз 1 дақиқа дарозтар шавад!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr ""
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr ""
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Шумо бояд чанд рӯзҳо интихоб кунед."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Шабакаҳо"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Вақтсанҷҳо"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Танзимотҳои DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Рақам"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Ном"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Шабақаҳои аудио"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Сабти маврид"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Транслятсия"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Пешрафти вақт"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Сабткунӣ"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Транслятсия"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Интихоби нишона..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Интихоби нишонаи шабака"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Телевизиони рақамӣ"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Телевизиони рақамии зинда фақат бо дастгоҳи Xine кор мекунад."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Шабакаи OSD навбатӣ"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Шабакаи OSD пешакӣ"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "Сӯзондани OSD"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Рӯйдоди OSD навбатӣ"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Рӯйдоди OSD пешакӣ"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Намоиши OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Вақтсанҷҳо..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Транслятсия..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Шабакаҳо..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Танзимоти DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Ҳама"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "Телевизион"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Радио"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Категорияи нав..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Нишонаи шабака..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Нест кардани категория..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Категорияи нав"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Барои категорияи равон ном гузоред:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Шумо мехоҳед категорияи интихобшударо нобуд созед?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Транслятсия вайрон шуд."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Транслятсия оғоз карда натавонист."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Вақтсанҷ бо муваффақият сар карда шуд."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Шумо метавонед аввал якчанд шабакаҳо муайян кунед!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Вақтсан¯бо муваффақият офарида шуд."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Ҳоло ҳам сабт карда истода аст."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Ҳоло ҳам транслятсия карда истода аст."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "DVB танзим карда натавонист!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr ""
+"Kaffeine ҳоло ҳам сабт карда истода аст. Шумо ҳам мехоҳед барномаро қатъ кунед?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Kaffeine вақтсанҷҳоро бо тартиб монд. Шумо ҳам мехоҳед барномаро қатъ кунед?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Сигнал:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Қулф:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Тағйир..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Шумо мехоҳед ҳама шабакаҳоро нобуд созед?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "ОҒОЗИ сканер"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "ИСТ КАРДАНИ сканер"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Ист карда истода аст..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr ""
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr ""
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Рӯйхати вақтсанҷ:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Нав"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Ист кардан/Нобуд кардан"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr ""
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Шумо мехоҳед вақтсанҷи интихобшударо нобуд созед?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Бор карда истода аст... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Нусха бардории файлҳои манбаъ..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Танзимотҳои DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Дастгоҳи DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Танзимотҳои дастгоҳ"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Ном:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Намуд:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Ноқил"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Заминавӣ"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Радифӣ"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr ""
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Номуайян"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Миқдори LNB:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Танзимотҳои LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Танзимотҳои LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Манбаъ:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Интихобҳои сабти DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Феҳристи сабт:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(дақиқа)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Давомноки сабти маврид:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Андозаи хоҳиш:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Транслятсияи DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Ҷойгиршавии транслятсия:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Порти транслятсия:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Ахбороти порт:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Гуногун"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Боркунӣ"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "Модулҳои DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Феҳристи сабти нодуруст:"
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Ҷойгиршавии транслятсияи нодуруст."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Танзимотҳои LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Бозсозӣ"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr ""
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr ""
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr ""
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr ""
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr ""
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "МБ"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "КБ"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Байтҳо"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Аудио CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Навозиши CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr ""
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Иҷрокунанда:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Албом:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Роҳча"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Рамзгузорӣ..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Рамзгузории аудио CD"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Навозиши аудио CD"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Навозиши DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Навозиши VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Кушодани &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Кушодани &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Кушодани &Аудио-CD"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr ""
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr ""
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD Видео"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr ""
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Бе сарлавҳа"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Роҳчаи %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr ""
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr ""
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr ""
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr ""
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Ҳамаи андозаҳо"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Ҷустуҷӯи нав"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Навозиш"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Интихоби &ҳама"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Тағйири сарлавҳа"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Ахборот"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Дарозӣ"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Иҷрокунанда"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Албом"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Сол"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Жанр"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Нигористон..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Филтр"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Рӯйхати роҳчаҳо:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Навозиши роҳчаҳо"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Такрор"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Рӯйхати &роҳчаҳои нав"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Ҳамаи файлҳо"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Кушодани рӯйхати роҳчаҳо"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "НАВ"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Нигористон"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Навбатӣ: %1 Намоиш, Вақти намоиш: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Намоиш: %1, Вақти намоиш: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Файли медиа:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Интихоби филм"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr ""
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Навозиш / Таваққуф"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Навбатӣ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Беовозӣ"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Навозишгари Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Навозишгари Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Роҷер Ковакс, Виктор Ибрагимов, Акбар Ватаншоев"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "rkovacs@khujand.org, youth_opportunities@tajikngo.org"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Муаллифони Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr ""
+
+#: main.cpp:78
+msgid "Original author"
+msgstr ""
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr ""
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr ""
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr ""
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr ""
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Файли нав"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Нав"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Саҳифа:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr ""
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Вақтсанҷи такроршуда"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Тағйири транслятсия"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Шабакаҳои дастрас:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Рӯйхати транслятсия:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Нав..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Оғози сканер"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Филтрҳо"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Провайдер:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Файлҳои интихобшударо илова кунед"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Шуд"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Тағйири шабака"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Қутбият"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Суръат:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Паҳноии роҳча:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Рамзгузорӣ:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Параноя:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr ""
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Кб/с"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Сифат :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Рӯйхати &роҳчаҳо"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Қатъи интихобҳо"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Навозишгар"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Транслятсияи интернет"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Навигатсия"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&Менюҳои DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Аудио"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Видео"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Нисбати фишор"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr ""
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr ""
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr ""
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr ""
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr ""
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr ""
+
+#: pref.cpp:81
+msgid " sec"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr ""
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr ""
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr ""
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr ""
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr ""
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr ""
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr ""
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr ""
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr ""
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr ""
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr ""
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr ""
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr ""
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Оғоз кардан"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Тирезаи навозишгар"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr ""
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Файлҳои MPEG Аудио"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Файлҳои MPEG Видео"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr ""
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Файлҳои AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr ""
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr ""
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr ""
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Файлҳои FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr ""
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Файлҳои WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr ""
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr ""
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Кушодани &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Кушодани ф&еҳрист..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr ""
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr ""
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr ""
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr ""
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr ""
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr ""
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr ""
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr ""
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr ""
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr ""
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr ""
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr ""
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr ""
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr ""
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Кушодани файл(ҳо)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Кушодани URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr ""
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Кушодани феҳрист"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr ""
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr ""
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr ""
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr ""
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr ""
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr ""
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr ""
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr ""
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr ""
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr ""
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Дастгоҳи DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr ""
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr ""
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "НАТИҶА"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr ""
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr ""
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr ""
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Аудио"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Видео"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr ""
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 аз %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-Файл\n"
+"*.bmp|BMP-Файл\n"
+"*.xbm|XBM-Файл"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Навозиш"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr ""
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Худкор"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Танзимотҳои видео"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Эквалайзер"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Сарлавҳа"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Қисм"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Сарлавҳаҳо"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Ахбороти &роҳча"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Вақти намоиш"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Роҳчаи Аудио CD %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "Роҳчаи VCD %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Танзимотҳои видео"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "худкор"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Хатои номуайян: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Худкор"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr ""
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Дастгоҳи CD, VCD, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr ""
diff --git a/po/tr.po b/po/tr.po
new file mode 100644
index 0000000..ecfb52f
--- /dev/null
+++ b/po/tr.po
@@ -0,0 +1,3170 @@
+# translation of kaffeine.po to Türkçe
+# Görkem Çetin <gorkem@kde.org>, 2004.
+# ihsan Haluk AKIN <ihsan_akin@yahoo.com>, 2005.
+# Server Acim <sacim@kde.org.tr>, 2006.
+# Engin Çağatay <engincagatay@yahoo.com>, 2006.
+# translation of kaffeine.po to
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-10-29 17:24+0200\n"
+"Last-Translator: Engin Çağatay <engincagatay@yahoo.com>\n"
+"Language-Team: Türkçe <yerellestirme@kde.org.tr>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Tazele"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "Zamanlanmış"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Şimdiki/Sonraki"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Kanal"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Başla"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Süre"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Başlık"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Bütün Programları Gör"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Zamanlayıcılara ekle"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "İsim:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Kanal:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Başla:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Süre:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Son:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Kayıtla:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Yok"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Günlük"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Haftalık"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Aylık"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Özel"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Tekrarla..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Zamanlayıcı Düzenleyici"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Buna bir isim vermelisiniz!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Süre en az 1 dakika olmalı!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "İsim bu karakterlerden hiç birini içermemeli: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "İlk Transponder Ayarları"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Bu isim tek değil."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Ses pid numaraları blunamıyor!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Pid sıfır olmamalı!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Bazı günler seçmelisiniz."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Kanallar"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Zamanlayıcılar"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Elektronik Program Kılavuzu"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB ayarları"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Sayı"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "İsim"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Ses Kanalları"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Anında Kayıt"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Yayın"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "Zaman kaydırması"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Kayıt"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Yayın"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "Simge seç..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "Kanal simgesi seç"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Dijital TV"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Canlı sayısal TV sadece xine ile birlikte çalışır."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD Sonraki Kanal"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD Önceki Kanal"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "OSD Zap"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD Sonraki Olay"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD Önceki Olay"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Ekran Mesajlarını Göster"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Zamanlayıcılar..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Yayınlama..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Kanallar..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "DVB'yi ayarlar..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Tüm"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radyo"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Yeni Kategori..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Simgeyi Değiştir..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Kategoriyi Sil..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Yeni Kategori"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Bu kategori için isim gir :"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Gerçekten bu kategoriyi silmek istiyor musunuz?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>http://hftom.free.fr/kaxtv/dvbdata.tar.gz adresinden DVB verisi alınamıyor!"
+"<br>\t\t\tİnternet bağlantınızı kontrol edin ve tekrar denemek için Evet'i "
+"tıklayın."
+"<br>\t\t\tveya vazgeçmek için Hayır'ı tıklayın."
+"<br>\t\t\tEğer bu dosyaya zaten sahipseniz, "
+"dosyayı~/.kde/share/apps/kaffeine/dvbdata.tar.gz olarak kopyalayın ve Evet'i "
+"tıklayın."
+"<br>"
+"<br>Tekrar deneyeyim mi?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Yayın başarısız oldu."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Yayın başlatılamadı."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Zamanlayıcı başarılı olarak oluşturuldu ve başlatıldı."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "İlk olarak birkaç kanal tanımlamak isteyebilirsiniz!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Zamanlayıcı başarılı olarak oluşturuldu."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Hala hayıt yapılıyor."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Hala Yayındayız."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "DVB' yi ayarlayamıyoruz."
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Pid numaraları düzenlenemedi"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "Hiç boş CAM yok"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine hala kayıt yapıyor. Gerçekten çıkmak istiyor musun?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+"Kaffeine hala kuyrukta bekleyen zamanlayıcılar. Gerçekten çıkmak istiyor musun?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Sinyal :"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR :"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Kilitle:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Düzenle..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Gerçekten tüm kanalları silmek istiyor musunuz?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Aramaya BAŞLA"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Aramayı DURDUR"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Durduruluyor..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Bulunan : %1 TV - %2 radyo"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "DVB'nin bilgi soketi açılamadı."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Zamanlayıcı listesi :"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Yeni"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Durdur/Sil"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Bu zamanlayıcı tekrarlanıyor. Ne yapmak istersiniz, geçerli görevi yoksaymak ya "
+"da zamanlayıcıyı silmek?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Geçerli olanı yoksay"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Seçili zamanlayıcı silinsin mi?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "İndiriliyor... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Veri dosyaları kopyalanıyor..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB ayarları"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB Aygıtı"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Aygıt Ayarları"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>İsim :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Tip :</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Kablo"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "Dünyasal"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Uydu"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr ""
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Bilinmeyen"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "LNB'lerin sayısı :"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1. uydu :"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB ayarları..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2. uydu :"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3. uydu:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4. uydu:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB ayarları..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Kaynak :"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"<qt>Bu aygıtın desteği <b><i>otomatik tarama</i></b> "
+"gibi gözüküyor. Kaffeine'in frekansları kaynak listeden araması için <b>"
+"OTOMATİK</b> seçeneğini seçebilirsiniz."
+"<br>If <b><i>otomatik tarama</i></b> kanallarınızı listedeki gerçek Kaynak'tan "
+"bulamıyor.</qt>"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"<qt><i>eğer listede bölgenizi bulamazsanız kendiniz oluşturmak durumundasınız. "
+"Şu dosyaya göz atın $HOME/.kde/share/apps/kaffeine/dvb-x/ ve başlamak için "
+"varolan dosyalardan birini alın. Bölgeniz için değerleri doldurun ve ona özel "
+"bir isim verin. (isim verme kurallarına dikkat edin). Eğer yeni dosyanın "
+"diğerleri için de faydalı olacağını düşünüyorsanız bu dosyayı kaffein "
+"kullanıcıları listesine gönderin. Göndereceğiniz posta adresi: "
+"kaffeine-user(AT)lists.sf.net.</i></qt>"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB Kayıt seçenekleri"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Kayıt dizini :"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "Zaman kaydırma dizini:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Başla :"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(dakikalar)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Bitir:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Anlık kayıt süresi:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Tercih edilen biçim:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB Yayını"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Yayın adresleri :"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Yayın Portu:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Bilgi portu:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Karışık"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Öntanımlı karakter kümesi (yeniden başlatma gerekir):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Tarama verisini güncelle:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "İndirme"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"epg olaylarını kaydet \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Kaydet"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "DVB eklentileri"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>http://hftom.free.fr/kaxtv/dvbdata.tar.gz adresinden DVB verisi alınamıyor!"
+"<br>\t\t\tİnternet bağlantınızı kontrol edin ve tekrar denemek için Evet'i "
+"tıklayın."
+"<br>\t\t\tveya vazgeçmek için Hayır'ı tıklayın."
+"<br>Tekrar deneyeyim mi?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Hatalı kayıt dizini."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "Hatalı zaman kaydırma dizini."
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Yayın ve bilgi portları farklı olmalı."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Hatalı yayın adresi."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "DVB ayarları"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Evrensel LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "İkili LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Tekli LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "İkili LO Frekans seçimi:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "Kısa dalga Frekans :"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "Uzun dalga Frekans :"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "Tekli LO Frekans :"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Yeniden başlat"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "DVB yayın soketi açılamıyor."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "DVB yayın soketi ilk kullanım için başlatılamıyor."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Hiç bir ses kodlayıcı bulunamadı."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "%1 kodlayıcı yüklemesinde hata."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Dizin açılamıyor:"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Bayt"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Ses CD'si"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "CD Oynat"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "CD'yi Dönüştür"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Sanatçı:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Albüm:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Parça"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "İşlemek istediğiniz izi seçiniz ve <b>Encode</b> düğmesini tıklayın."
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Kodla..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Ses CD kodlaması"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Müzik CD'si Oynat"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "DVD Oynat"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "VCD Oynat"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "&DVD Aç"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "&VCD Aç"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "&Müzik CD'si Aç"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Dönüştürülecek parçaları seçin."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "Bir kaç müzik CD'si bulundu. Birini seçin:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Müzik CD'si bulunamadı."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD Video"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "Bir kaç DVD videosu bulundu. Birini seçin:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "Birkaç (S)VCD bulundu. Birini seçin:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Başlık Yok"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Parça %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Bölgesel cddb girişi arıyor ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Uzak cddb girişi arıyor ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "Tam uyumlu bir cddb girişi buldu ..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "Yaklaşık bir cddb girdisi bulundu..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB Eşleşmesi"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "Bir kaç CDDB eşleşmesi bulundu. Birini seçin:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Kaffeine için Lame kipi kodlayıcı eklentisi."
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Kaffeine için Ogg Vorbis kipi kod eklentisi."
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB Cihazı"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Bilgi soketi açılamıyor."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Bilgi bağlantı soketi açılamadı!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Soket açılamadı."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Soket seçenekleri ayarlanamadı!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Bağlantı soketi açılamadı!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Tüm Boyutlar"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Çok Küçük"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Küçük"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Orta"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Büyük"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Çok Büyük"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Yeni Arama"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Seçtiğiniz kapak mevcut değil. Lütfen başka bir tane seçin."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Kapak Bulunamadı"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Kapak İndirme Sistemi"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Karşılık gelen bir resim bulunamadı, lütfen tekrar deneyin:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Yeni arama terimleri girin:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Oynat"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Sonrakini Oynat/Kuyruğa Ekle"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "&Tümünü Seç"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Seçilenlerden Oynatma Listesi Oluştur"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "&Altyazı Ekle..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Başlığı düzenle"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Bilgi"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Uzunluk"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "Adres"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Sanatçı"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Albüm"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Yıl"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Tür"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Altyazılar"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "kullanımda"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Altyazı Dosyaları\n"
+"*.*|Tüm Dosyalar"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Altyazı dosyasını seç"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Bir Kapak Seçin..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Galeri.."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Filtre"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Oynatma listesi:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Geçerli oynatma listesini seç: Oynatma listesinin adını değiştirdikten sonra "
+"'Enter' ile onaylayın."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Listedekileri Oynat"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Tekrarla"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Oynatma listesini tekrarla"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Karıştır"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Dosyaları rastgele oynat"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "Kapakları otomatik indir"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "Kapakların otomatik indirilmesi"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "Geçerli Oynatma Listesini &Temizle"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Yeni Oynatma Listesi"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Oynatma Listesini Al..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Geçerli Oynatma Listesini Farklı Kaydet..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "&Geçerli Oynatma Listesini Kaldır"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine Oynatma Listeleri"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Tüm Dosyalar"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Oynatma Listesini Aç"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U Oynatma Listesi"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS Oynatma Listeleri"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Oynatma Listesini Kaydet"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Oynatma listesi"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "YENİ"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Medya kaynakları alınıyor..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(altyazı yok)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Diğer altyazı..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Galeri"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Kuyrukta %1 Girdi, Oynatma Süresi: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Girdiler: %1, Oynatma süresi: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "'%1' diskten ve çalma listesinden silinsin mi?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Oynatma listesi ismi zaten var"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Farklı bir oynatma listesi ismi giriniz:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Altyazıyı Seç"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Görüntü / ses dosyası:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Filmi Seç"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Altyazı Dosyası:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Oynat / Duraklat"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Sonraki"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Sesi Kapat"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine Oynatıcı"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine Oynatıcı]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Görkem Çetin , Bülent ŞENER"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "gorkem@kde.org, bulent@kde.org.tr"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr "KDE 3 için bir çokluortam oynatıcı."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, The Kaffeine Authors"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Şu anki sağlayıcı"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Asıl yazar"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM desteği."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Pek çok yama."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "DVB OSD yaması"
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "DVB kategorileri"
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Kaffeine 0.8 logosu"
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Kaffeine 0.5 için logo canlandırması"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "Web sayfası kodları için alternatif kodlamalar. Bazı yamalar."
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "xine ön eklenti çözmektedir. Pek çok yama var. "
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Altyazı dosyasını alır."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U alma. Test ediliyor."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Altyazı Pid Editörü"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "Altyazı PID'leri"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Yeni Nesne"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Yukarı"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Aşağı"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Seçili olanı güncelle"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Yeni"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Sayfa:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Alt sayfa:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Dil:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Tekrarlanan Zamanlayıcı"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Ses pid editörü"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Ses PID'leri:"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Yayın editörü"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Kullanılabilir kanallar:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "Yayın listesi:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Düzenlemek/silmek için sağ tıkla)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Yeni..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "Arama"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "Seçenek (KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Taramayı başlat"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Filtreler"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "Yayına hazır"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Sağlayıcı:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Seçili olanı ekle"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Filtre Ekle"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Bulunanlar"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Bitti"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Kanal editörü"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "No:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Kutupsallık :"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Frekans:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Sembol değeri:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "Karıştırılmış"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Teleteks PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "Servis ID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Video PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "Yayın akışını taşıma kimliği:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Altyazı PID'leri..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Ses PID'leri..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "Bantgenişliği:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC high:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "Yayın:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "Alçak FEC:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "Korunacak aralık:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Sıradüzen:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Ayarlama:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Tersine çevirme:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "Kodlama Tercihleri"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "Kodlayıcı..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "Temel dizin:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "Paranoia:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "Tüm denetimleri etkisizleştir"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Normal kip"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "Paranoya kipi"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Normalleştir"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD Araç Çubuğu"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame mp3 seçenekleri"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Bit oranı:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis Seçenekleri"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Kalite :"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Oynatma Listesi"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Çıkış Opsiyonları"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Oynatıcı"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "&Otomatik Boyutlandırmayı Etkinleştir"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Ağ Yayını"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Dolaşma"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD Menüleri"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Ses"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Video"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "&Pencere Boyut Oranı"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Ekran Görüntüsü Araç Çubuğu"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Ayarlar Araç Çubuğu"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Ses Araç Çubuğu"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Konum Araç Çubuğu"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine Ayarları"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Davranış"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "Pencere küçültüldüğünde videoyu duraklat"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Sistem çubuğuna yerleş"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " sn"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "kapalı"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Sistem çekmecesinde uyarıların gösterilme süresi"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "DVB istemciyi aktifleştir"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Çeşitli Ayarlar"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Meta bilgiler için Unicode dışı kodlama kullan"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr "Meta bilgiler için alternatif kodlama kullan"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Son açılan dosyalar listesini sil"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Hemen oynatmaya başla"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Açılışta tam ekran kipinde başlat"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Ses sürücüsünü tanımla"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Video sürücüsünü tanımla"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Ses CD'si/VCD/DVD aygıt yolunu tanımla."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Xine hata ayıklama çıktı iletileri"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Kurulum sihirbazını çalıştır"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr "Oynatılacak dosya(lar). Yerel dosya, adres, VCD, DVD vb olabilir."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Başlat"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Oynatma Penceresi"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Desteklenen Video Biçimleri"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG Ses Dosyası"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG Video Dosyası"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis Dosyaları"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI Dosyaları"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime Dosyaları"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media Dosyaları"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska Dosyaları"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC Dosyaları"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media Dosyaları"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV Dosyaları"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "%1 yüklemesinde hata."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "Arama yolunda %1 bulunamadı."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "&Adres Aç..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "&Dizin Aç..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Bu Parçadan sonra Çık ve Monitörü Kapat"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Bu parçadan sonra çık"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Bu oynatma listesinden sonra çık"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Ufak Mode"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Oynatma Listesi ve Oynatıcıyı Aç/kapat"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "Asıl &Oranı Koru"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Asıl Boyut"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "İki Kat Büyük"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Üç Kat Büyük"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "&Oynatıcı Motoru"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB cihazı"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Oynatıcı"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Ana Pencere"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS X sunucusu uzantıları bulunamadı."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"Dosya/oynatma listresi bittiğinde Kaffeine'den çıkılacak ve monitör "
+"kapatılacak. Monitörün kapatılabilmesi için \"dpms\" seçeneği X ayar dosyanızda "
+"mutlaka bulunmalı."
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Dosya Aç"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Adres Aç"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Bir adres girin:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Dizin Aç"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "Sürücüde %1 bulunamadı, ya da aygıta giden yol hatalı."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Lütfen doğru sürücüyü seçin:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 Kurulum Sihirbazı"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Kurulum Denetimi"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Tamam."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "Bir hata alındı. Lütfen kurulumu yeniden gözden geçirin."
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Bulunan sürüm"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine'in çalışması için KDE %1 ve yukarısına ihtiyaç vardır."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 Kodekleri"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"/usr/lib/wine32 dizininde WIN32 kodekleri bulunamadı. Windows Media 9 ve yeni "
+"Real Media dosyaları bu nedenle oynatılamayacak. Kodek dosyalarını bu adresten "
+"indirebilirsiniz:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"libdvdcss bulunamadı. Şifreli DVD'leri izleyemeyeceksiniz. Kütüphane dosyasını "
+"buradan edinebilirsiniz (bunun kullanımı ülkenizdeki yasalara aykırı "
+"olabilir!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD Sürücü"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+"DMA kipi kapalı durumda. Daha yumuşak bir DVD oynatma istiyorsanız aşağıdaki "
+"komutu root haklarıyla yazın:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "DMA kipi denetlenemedi. Erişim engellendi:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-Aygıtı"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "DVB-Aygıtı bulunamadı. DVB ile ilişkili fonksiyonlar gizlenecek."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Dağıtım"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"SuSE tarafından sağlanan xine kütüphanesi \"yasal gerekliliklerden\" (olası "
+"patent ihlalleri gibi) bazı özellikleri içermeyebilir. Buradan alabileceğiniz "
+"paketi kullanabilirsiniz:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "SONUÇ"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Bazı sorunlar bulundu, ancak Kaffeine çalışacaktır."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Tüm işlemler tamam!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "mms:// (Microsoft Media) yayınları için Kaffeine kullan"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr "rtsp:// (Real Media) yayınları için Kaffeine kullan"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Masaüstünde Kaffeine simgesi oluştur"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Kurulum Seçenekleri"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Hat ikileme Niteliği"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>Çok düşük işlemci kullanımı, en düşük kalite.</b>"
+"<br>Dikey çözünürlüğün yarısı kaybolur. Bazı sistemlerde (PCI video "
+"kartlarıyla) bu durum işlemci kullanımını düşürür. "
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"<b>Düşük işlemci kullanımı, düşük kalite. </b>"
+"<br>Ekranda oluşabilecek hataların gizlenmesi için görüntü dikey olarak "
+"bulanıklaştırılır."
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"<b>Orta seviye işlemci kullanımı, orta kalite.</b>"
+"<br>Resim analiz edilir ve hatalı gösterilmesi muhtemel görüntüler düzeltilmeye "
+"çalışılır."
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"<b>Yüksek işlemci kullanımı, iyi kalite.</b>"
+"<br>Dvd görüntü kipini dönüşümü kaliteyi yükseltir ve düşük görüntü kalitesi "
+"hatasını düzeltir."
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>Çok yüksek işlemci kullanımı, yüksek kalite.</b>"
+"<br>Akıllı işleme algoritmaları kullanımının ötesinde bu aynı zamanda çerçeve "
+"oranını TV'lerin görüntüleme oranına uyması amacıyla görüntü oranını ikiye (30->"
+"60fps). 3-2 dönüştürücüyü tanır ve dönüştürür.*"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>Çok çok yüksek işlemci kullanımı, yeni gelişimlerle yüksek kalite "
+"görüntü.</b>"
+"<br>Titreşim düzeltmeyi (filmleri orijinal 24 fps hızında oynatır) ve dikey "
+"renk yumuşatmasını etkinleştirir. (bazı dvd'lerde görülen renk kaymalarını "
+"düzeltir). *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Kullanıcı Tanımlı"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "tvtime Görüntü Düzeltme Eklentisini Yapılandırıyor..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"* <i>Yamalı bir 2.4 çekirdek ya da yeni 2.6 serisi çekirdek kullanılmasını "
+"gerektirebilir.</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "tvtime Görüntü Düzeltme Eklentisini Yapılandır"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Efekt Eklentileri"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Ses"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Ses Filtreleri"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Ses Filtrelerini Etkinleştir"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Filtre Ekle"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Tüm Filtreleri Sil"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Video"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Video Filtreleri"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Video Filtrelerini Etkinleştir"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Xine Motoru Parametreleri"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 Seçenekleri"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Genel Seçenekler"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Uzman Seçenekleri"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "Kaffeine için Xine tabanlı bir oynatıcı."
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL (Senkronize Edilmiş Çokluortam Tümleştirme Dili) desteği tam "
+"gelişmemiştir!\n"
+"KaffeinePart şimdi ilgili görüntü kaynağını herhangi bir yerleşime bağlı "
+"kalmadan oynatmayı deneyebilir. Yapılsın mı?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Kaynağı Farklı Kaydet"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Altyazı"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Ses kanalı"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%2'nin %1'i"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-Dosyası\n"
+"*.bmp|BMP-Dosyası\n"
+"*.xbm|XBM-Dosyası"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Ekran Görüntüsünü Kaydet"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Yayın Portu:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "Alınan yayın akışını ayarlar"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Gönderenin Adresi:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Port:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Konuma Git:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine Hatası"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine Mesajı"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Hazır"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Oynatıyor"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Altyazı Dosyası"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Kaynağı Farklı Kaydet"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "Parça Bilgisi"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Adresi Panoya Kopyala"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "Ayrı bir Kaffeine penceresinde oynat"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Yayın Akışı Gönder..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "Y&ayın Akışı Al..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "Ekran Görüntüsünü Kaydet..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Kaynağı Kaydet..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Gelen yayını sabit diske kaydeder. Bu özellik yasal bazı düzenlemelerden dolayı "
+"bazı yayın türleri için (örnek, Real Media) kapalı tutulmuştur."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr ""
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Beklet"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "&Hızlı Gösterim"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "&Yavaş Gösterim"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "20 sn ileri git"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "20 sn geri git"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "1 dk ileri git"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "1 dk geri git"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "10 dk ileri git"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "10 dk geri git"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Konuma Git..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD Menüsü Solda"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD Menüsü Sağda"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD Menüsü Yukarıda"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD Menüsü Aşağıda"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD Menüsü Seçimi"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Ses Kanalı"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Ses kanalını seç"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "&Görsel Etkileşim"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Sesi Yükselt"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Sesi Kıs"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "&Görüntüyü Düzelt"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "Bunu bazı görüntü akışı için etkinleştir, bazı DVD'ler için örneğin."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Otomatik"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "A&namorfik"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Kare"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Yatay büyüt"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Yatay küçült"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Dikey büyüt"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Dikey küçült"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Görüntü Düzeltme & Niteliği"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Video Ayarları"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Ekolizer"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "&Menü Aç/Kapat"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Başlık"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Kök"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Alt pencere"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Açı"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Bölüm"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Başlıklar"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Kanallar"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Açılar"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Parça Bilgisi"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Efekt Eklentileri..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "X&ine Motoru Parametreleri"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Ses"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Konum"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"Kısa Tıklama: Zamanlayıcı Düğmesi İleri/Geri\n"
+"Uzun Tıklama: OSD Zamanlayıcısı Düğmesi"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Oynatma süresi"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "CDDB verilerine bakılıyor..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "Müzik CD Parçası %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD Parçası %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Video Ayarları"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Renk"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Doygunluk"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Kontrast"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Parlaklık"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "Ses/Görüntü Seçeneği"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Altyazı Seçeneği"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "Otomatik"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Genel Uyarı: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Bilgi yok."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Güvenlik Uyarısı:\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Bağlanmayı denediğiniz sunucu bilinmiyor.\n"
+"Sunucu adınının geçerliliğini kontrol edin."
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Belirttiğiniz aygıt adı geçersiz görünüyor."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"Ağa erişilemiyor.\n"
+"Lütfen ağ ayarlarınızı yeniden kontrol edin. "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Ses çıktısı kullanılamıyor. Aygıt meşgul."
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Bağlantıya izin verilmedi.\n"
+"Makine adını kontrol edin. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Verilen adres bulunamadı. Lütfen yeniden kontrol ediln."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Bu kaynağa erişime izin verilmedi. "
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Kaynak okunamadı.\n"
+"Okumak için hakkkınız olmayabilir ya da kaynak veri içermeyebilir (örneğin "
+"sürücüde disk olmayabilir)."
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Kütüphane yüklenirken bir hata oluştu: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "Kaynak dosya şifrelenmiş ve okunamıyor. "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"Kullandığınız DVD şifrelenmiş olabilir. Ülkenizdeki kurallara göre bu DVD "
+"diskini kullanabilmeniz için libdvdcss kullanmanız gerekebilir."
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Bilinmeyen hata: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "Hata: Yeni %1 video sürücüsü başlatılamadı, %2 kullanılıyor! "
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "Kullanılan Video Sürücüsü: %1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "Hata: Yeni %1 ses sürücüsü başlatılamadı, %2 kullanılıyor! "
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Kullanılan Ses Sürücüsü: %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Xine başlatılıyor..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Xine motoru çalıştırılamadı."
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Kullanılacak ses sürüsücüsü (öntanımlı: otomatik)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Kullanılacak video sürüsücüsü (öntanımlı: otomatik)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Yazılım ses karıştırıcısını göster"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Ekran Mesajlarını Göster (EMG)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Ekran Mesajlarını Göster tektinin boyu"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "OSD iletileri için yazıtipi"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "%1 video sürücüsü başlatılamadı, 'otomatik' ayarlar kullanılacak..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "Hiç bir video sürücüsü çalıştırılamadı"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "%1 ses sürücüsü başlatılamadı, 'otomatik' ayarlar kullanılacak..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Hiç bir ses sürücüsü başlatılamadı!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Yeni bir xine kanalı açılamıyor!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: Açılıyor..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Açılıyor..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Ses Kodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Video Kodek"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Bu kaynak için bir eklenti bulunamadı"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Kaynak hatalı veri gönderiyor"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "İstenen kaynak bulunamadı"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Kaynak açılamadı"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Genel hata"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Ses Açık"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Ses Kapalı"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Hızlı Gösterim %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Yavaş Gösterim %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Deinterlace : açık"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Deinterlace : kapalı"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Pencere Oranı"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Otomatik"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "X'e Yaklaş"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Y'ye Yaklaş"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msec"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Ekolayzer Ayarları"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "Sesi arttırıcısı"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"Ekolayzer için ses arttırıcısı - eğer ses gürültülüöolursa bu seçeneği kapatın"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Filtreyi Sil"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "%s aranıyor"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "GStreamerPart başlatılması başarısız oldu!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Ses Kapalı "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Yorum"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "&GStreamer Motoru Parametreleri"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "GStreamer başlatılamadı!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"GStreamer-registry bulunamıyor! Kurulumdan sonra <b>gst-register</b> "
+"komutunu root olarak çalıştırmayı unuttunuz mu?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "%1 ses sürücüsü başlatılamadı, bir başkası denenecek ..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Kullanışlı ses-sürücüsü bulunamadı!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "%1 video sürücüsü başlatılamadı - bir başkası denenecek ..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Kullanışlı video-sürücüsü bulunamadı!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "GStreamer Motoru Parametreleri"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Ses Seçenekleri"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Tercih edilen ses sürücüsü"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Video Ayarları"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Tercih edelin video sürücüsü"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Yeniden başlama gerekli!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Ortam"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Ortam Seçenekleri"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD sürücü"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Bu kanallar zaten var olduğundan eklenmedi :"
diff --git a/po/uk.po b/po/uk.po
new file mode 100644
index 0000000..5abec5d
--- /dev/null
+++ b/po/uk.po
@@ -0,0 +1,3190 @@
+# Translation of kaffeine.po to Ukrainian
+#
+# Ivan Petrouchtchak <ivanpetrouchtchak@yahoo.com>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-05-07 22:58-0600\n"
+"Last-Translator: Ivan Petrouchtchak <ivanpetrouchtchak@yahoo.com>\n"
+"Language-Team: Ukrainian <translation@linux.org.ua>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.2\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>"
+"=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Оновити"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Поточн./наступн."
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Канал"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Почати"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Тривалість"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Заголовок"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Перегляд всіх програм"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Додати до таймерів"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Назва:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Канал:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Початок:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Тривалість:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Кінець:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Записати як:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Немає"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Щодня"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Щотижня"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Щомісяця"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Нетиповий"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Повторити..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Редактор таймера"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Ви мусите вказати назву!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Тривалість має бути принаймні 1 хвилина!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Назва не може містити наступні символи: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "Початкові параметри транспондера"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "Ця назва не є унікальною."
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "Відсутні аудіо pid(и)!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Pid мусить бути не-нульовим!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Ви мусите вибрати якісь дні."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Канали"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Таймери"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Електронний гід програми"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "Індикатор"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "Параметри DVB"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Число"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Назва"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Аудіо-канали"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "Миттєвий запис"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "Трансляція"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Запис"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "Трансляція"
+
+#: input/dvb/dvbpanel.cpp:271
+#, fuzzy
+msgid "Select icon..."
+msgstr "Виберіть фільм"
+
+#: input/dvb/dvbpanel.cpp:278
+#, fuzzy
+msgid "Choose channel icon"
+msgstr "Редактор каналів"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "Цифрове ТБ"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "Пряме цифрове ТБ працює тільки з рушієм xine."
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "Наступний канал"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "Попередній канал"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "Наступна подія"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "Попередня подія"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Показати індикатор"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Таймери..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "Трансляція..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Канали..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "Налаштувати DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Всі"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "Телебачення"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Радіо"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Нова категорія..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Змінити піктограму..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Видалити категорію..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Нова категорія"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Введіть назву для цієї категорії:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Ви справді хочете видалити цю категорію?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>Не вдається отримати дані DVB з http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tПеревірте ваше з'єднання з Інтернетом і натисніть Так, щоб спробувати "
+"знов."
+"<br>\t\t\tАбо натисніть Ні, щоб скасувати."
+"<br>\t\t\tЯкщо у вас вже є цей архів, то скопіюйте його до "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz і натисніть Так."
+"<br>"
+"<br>Спробувати знов?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "Трансляція зазнала невдачі."
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "Не вдається почати трансляцію."
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Таймер успішно створено і запущено."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "Спочатку потрібно визначити якісь канали!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Таймер успішно створено."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "Ще йде запис."
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "Ще йде трансляція."
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "Не вдається налагодити dvb!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "Не вдається встановити pid"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine ще записує. Дійсно хочете закрити його?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine має в черзі таймери. Дійсно хочете закрити його?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Сигнал:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Блокування:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Редагувати..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Ви дійсно хочете видалити всі канали?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Почати сканування"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Зупинити сканування"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Зупинка..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "Знайдено: %1 TV - %2 радіо"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "Не вдається відкрити сокет інформації DVB."
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Список таймерів:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Новий"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Зупинити/Видалити"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Цей таймер повторюється. Хочете пропустити поточне завдання чи видалити таймер?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Пропустити поточне"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Видалити вибраний таймер?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Звантаження... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Копіювання файлів даних..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "Параметри DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "Пристрій DVB"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Параметри пристрою"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Назва:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Тип:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "Кабель"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "Супутник"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "Виконавець"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Невідомо"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "Кількість LNB:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "1-й сат.:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "Параметри LNB..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "2-й сат.:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "3-й сат.:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "4-й сат.:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "Параметри LNB..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Джерело:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "Параметри запису - DVB"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Каталог записів:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+#, fuzzy
+msgid "Time shifting directory:"
+msgstr "Діалог для вибирання існуючого каталогу"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "Поле початку:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(хвилини)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "Поле кінця:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "Тривалість миттєвого запису:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "Головний формат:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "Трансляція DVB"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "Адреса трансляції:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "Порт трансляції:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "Порт інформації:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Інше"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "Типовий набір символів (потрібний перезапуск):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Оновити дані сканування:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Звантажити"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"Скинути події epg до \n"
+"~/kaffeine_dvb_events.tx:"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Скинути"
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "Клієнт DVB"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>Не вдається отримати дані DVB з http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tПеревірте ваше з'єднання з Інтернетом і натисніть Так, щоб спробувати "
+"знов."
+"<br>\t\t\tАбо натисніть Ні, щоб скасувати."
+"<br>Спробувати знов?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Не чинний каталог записів."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "Порти трансляції й інформації повинні бути різними."
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "Не чинна адреса трансляції."
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "Параметри LNB"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "Універсальний LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "Двоканальна LO"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "Одинарна LO"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "Частота перемикання двоканальної LO:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (МГц)"
+
+#: input/dvb/dvbconfig.cpp:988
+#, fuzzy
+msgid "Lo-band frequency:"
+msgstr "Частота перевірки &вузлів:"
+
+#: input/dvb/dvbconfig.cpp:992
+#, fuzzy
+msgid "Hi-band frequency:"
+msgstr "Частота перевірки &вузлів:"
+
+#: input/dvb/dvbconfig.cpp:996
+#, fuzzy
+msgid "Single LO frequency:"
+msgstr "Частота вибірки:"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "Частота вибірки:"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "Частота вибірки:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Скинути"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "Не вдається відкрити сокет трансляції DVB."
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "Не вдається започаткувати сокет трансляції DVB."
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "Не знайдено жодної програми кодування аудіо."
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "Не вдалося завантажити програму кодування \"%1\"."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "Не вдалося створити теку: "
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "МБ"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "КБ"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Байтів"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Аудіо КД"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "Грати КД"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "Видерти КД"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Виконавець:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Альбом:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Доріжка"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "Закодувати..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "Кодування аудіо-КД"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Грати аудіо-КД"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "Грати DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "Грати VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "Відкрити &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "Відкрити &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Відкрити &аудіо-КД"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "Потрібно вибрати доріжки для видирання."
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "Не знайдено жодного аудіо-КД."
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "Відео DVD"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr ""
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Без заголовка"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Доріжка %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "Пошук локального запису cddb ..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "Пошук віддаленого запису cddb ..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr ""
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "Клієнт DVB"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "Не вдається відкрити сокет інформації."
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "Не вдається прив'язати сокет інформації!!!"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "Не вдається відкрити сокет."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "Не вдається встановити параметр сокета!!!"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "Не вдається прив'язати сокет!!!"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Всі розміри"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Дуже малий"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Малий"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Середній"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Великий"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Дуже великий"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Новий пошук"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "Ви вибрали обкладинку, яка недоступна. Будь ласка, виберіть іншу."
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Обкладинка недоступна"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Завантаження обкладинок"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "Не знайдено відповідних зображень, введіть нові критерії пошуку:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "Введіть нові критерії пошуку:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Пуск"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Програти наступне / Додати до черги"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "Вибрати &все"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Створити список з вибраних композицій"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Додати суб&титр..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "&Редагувати заголовок"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Інформація"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Довжина"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Виконавець"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Альбом"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Рік"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Жанр"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Субтитри"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "вживається"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Файли субтитрів\n"
+"*.*|Всі файли"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Виберіть файл субтитрів"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Виберіть обкладинку..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Галерея..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Фільтр"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "Список композицій:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Виберіть активний список композицій. Щоб змінити назву списка композицій, "
+"відредагуйте його і підтвердіть за допомогою \"Повернутись\"."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Програти список композицій"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "&Повтор"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "Зациклити список композицій"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "Пере&мішати"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Програвати у випадковому порядку"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "Ви&лучити поточний список композицій"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "Но&вий список композицій"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "&Імпортувати список композицій..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Зберегти поточний список композицій як..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Ви&лучити поточний список композицій"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Списки композицій Kaffeine"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Всі файли"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Відкрити список композицій"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "Списки композицій M3U"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "Списки композицій PLS"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Зберегти список композицій"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Список композицій"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "НОВИЙ"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Імпортування ресурсів медіа..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(нема субтитрів)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Інші субтитри..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Галерея"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "Елементів: %1, час програвання: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Елементів: %1, час програвання: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "Вилучити \"%1\" зі списку і з диска?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Назва списку композицій вже існує"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Введіть іншу назву списку композицій:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Виберіть субтитр"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Файл мультимедії:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Виберіть фільм"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Файл субтитрів:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Пуск / Пауза"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Наступне"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Вимкнути"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Програвач Kaffeine"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Програвач Kaffeine]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Іван Петрущак"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "ivanpetrouchtchak@yahoo.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"Програвач мультимідії для KDE 3. Може використовувати декілька рушіїв для "
+"відтворення; типовий (і рекомендовано) - xine."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, автори Kaffeine"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "Поточний супровід"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "Перший автор"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "Підтримка CICAM."
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "Різноманітні цінні латки."
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Анімація логотипу для Kaffeine 0.5"
+
+#: main.cpp:88
+#, fuzzy
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr ""
+"Виберіть назву альтернативного кодування для мета-міток\n"
+"(щоб перетворити в юнікод)"
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Імпортування файла субтитрів."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "Імпортування M3U. Тестування."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Редактор pid субтитрів"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "PID субтитрів"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Новий елемент"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Пересунути вгору"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Пересунути вниз"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Оновити вибране"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Нове"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Сторінка:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, fuzzy, no-c-format
+msgid "Sub page:"
+msgstr "Кодова сторінка клієнта:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Мова:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, fuzzy, no-c-format
+msgid "Repeated Timer"
+msgstr "Повторюється будь-яку кількість разів"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, fuzzy, no-c-format
+msgid "Audio PIDs"
+msgstr "Аудіо-проект"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, fuzzy, no-c-format
+msgid "Broadcasting Editor"
+msgstr "Трансляція зазнала невдачі."
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Наявні канали:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, fuzzy, no-c-format
+msgid "Broadcasting list:"
+msgstr "Трансляція зазнала невдачі."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Клацніть правою кнопкою мишки, щоб змінити/видалити)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Новий..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, fuzzy, no-c-format
+msgid "Search On"
+msgstr "Пошук об'єкту"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "Почати сканування"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Фільтри"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, fuzzy, no-c-format
+msgid "Free to air"
+msgstr "Вільний для балачки"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Провайдер:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Додати вибране"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Додати відфільтроване"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Знайдено"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "SNR"
+msgstr "SNR:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Завершено"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Редактор каналів"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Ном:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "Полярність"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Частота:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "Частота символів:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, fuzzy, no-c-format
+msgid "Scrambled"
+msgstr "&Розшифрувати (Rot 13)"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, fuzzy, no-c-format
+msgid "Service ID:"
+msgstr "Шлях до &служби:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, fuzzy, no-c-format
+msgid "Video PID:"
+msgstr "Відеопроект"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, fuzzy, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Додати файл субтитрів..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, fuzzy, no-c-format
+msgid "Audio PIDs..."
+msgstr "pid субтитрів ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, fuzzy, no-c-format
+msgid "Bandwidth:"
+msgstr "Обмеження &каналу:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, fuzzy, no-c-format
+msgid "Transmission:"
+msgstr "Перенесення по мережі"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, fuzzy, no-c-format
+msgid "Guard interval:"
+msgstr "Інтервал &повторення:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "Ієрархія:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "Модуляція:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, fuzzy, no-c-format
+msgid "Inversion:"
+msgstr "Оголошувати версію:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, fuzzy, no-c-format
+msgid "Encoder:"
+msgstr "Кодувальник:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Base directory:"
+msgstr "Каталог записів:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "Нормальний режим"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "Нормалізувати"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, fuzzy, no-c-format
+msgid "CD Toolbar"
+msgstr "Пенал каналів"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Параметри Lame mp3"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "Частота вибірки:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Кб/с"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Параметри Ogg Vorbis"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "Якість:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "&Список композицій"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Параметри закриття"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Програвач"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "&Увімкнути автозміну розміру"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Трансляції в мережі"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Навігація"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "Меню &DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Аудіо"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Відео"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "Співвід&ношення розмірів"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Пенал знімків екрана"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Пенал керування"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Пенал гучності"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "Пенал розміщення"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Налаштування Kaffeine"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "Поведінка"
+
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "Ставити відео на паузу, коли заховане"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "Вбудувати в системний лоток"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " с"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "вимкнено"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "Тривалість показу заголовка в системному лотку"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "Увімкнути клієнт DVB"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Інші параметри"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Вживати альтернативне кодування (не-юнікод) для мета-міток"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"Виберіть назву альтернативного кодування для мета-міток\n"
+"(щоб перетворити в юнікод)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Очистити список недавніх файлів"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Починати програвати негайно"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Запускати у повноекранному режимі"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Встановити драйвер аудіо"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Встановити драйвер відео"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Вказати шлях пристрою аудіо-КД/VCD/DVD."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "Вивід повідомлень зневадження xine"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Запустити майстер встановлення"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"Файл(и) для програвання. Може бути локальний файл, адреса URL, каталог або "
+"\"DVD\", \"ВідеоКД\", \"АудіоКД\"."
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "Запустити"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Вікно програвача"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Формати медії, які підтримуються"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "Звукові файли MPEG"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "Відео-файли MPEG"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Файли Ogg Vorbis"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "Файли AVI"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Файли Quicktime"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Файли Real Media"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Файли Matroska"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "Файли FLAC"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Файли Windows Media"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "Файли WAV"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr ""
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 не знайдено в шляху пошуку."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "Відкрити &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "Відкрити &каталог..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Закрити програму і вимкнути монітор після цієї доріжки"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Закрити програму після цієї доріжки"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Закрити програму після списку композицій"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Мінімальний режим"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Перемкнути &список композицій / програвач"
+
+#: kaffeine.cpp:710
+#, fuzzy
+msgid "Keep &Original Aspect"
+msgstr "Зберегти &початкове співвідношення"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Початковий розмір"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Вдвічі більший"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Втричі більший"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Рушій &програвача"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "Клієнт DVB"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Програвач"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Головне вікно"
+
+#: kaffeine.cpp:1061
+#, fuzzy
+msgid "DPMS Xserver extension was not found."
+msgstr ""
+"На сервері не знайдено елемента для модифікації. Жодних змін не зроблено"
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Відкрити файл(и)"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Відкрити URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Введіть URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Відкрити теку"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr ""
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Будь ласка, виберіть правильний привід:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Майстер встановлення Kaffeine %1"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Перевірка встановлення"
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "Налаштування Kaffeine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Гаразд"
+
+#: instwizard.cpp:74
+#, fuzzy
+msgid "Part not found. Please check your installation!"
+msgstr ""
+"Не вдалося запустити переглядач журналу GnuPG. Будь ласка, перевірте вашу "
+"інсталяцію!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Знайдено версію"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine потребує KDE >= %1."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "Кодеки WIN32"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "Привід DVD"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-пристрій"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr ""
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Комплект"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "РЕЗУЛЬТАТ"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Виявлено деякі проблеми, однак, Kaffeine може працювати."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Все гаразд!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"Вживати Kaffeine як допоміжну програму для потоків mms:// (Microsoft Media)"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"Вживати Kaffeine як допоміжну програму для потоків rtsp:// (Real Media і інших)"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Створити на стільниці піктограму Kaffeine"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Параметри встановлення"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+#, fuzzy
+msgid "Deinterlace Quality"
+msgstr "Режим вилучення через-рядкової розгортки:"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+#, fuzzy
+msgid "User defined"
+msgstr "Редагувати визначені користувачем типи"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Втулок ефектів"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Аудіо"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Аудіо-фільтри"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Увімкнути аудіо-фільтри"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Додати фільтр"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Вилучити всі фільтри"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Відео"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Відео-фільтри"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Увімкнути відео-фільтри"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Параметри рушія xine"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "Параметри %1"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Параметри для початківця"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Параметри для експерта"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "KaffeinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Зберегти потік як"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Субтитр"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Аудіо-канал"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 з %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-файл\n"
+"*.bmp|BMP-файл\n"
+"*.xbm|XBM-файл"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Зберегти знімок екрана як"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "Порт трансляції:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+#, fuzzy
+msgid "Configure Receive Broadcast Stream"
+msgstr "Налаштувати потік Podcast"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Адреса відправника:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Порт:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+#, fuzzy
+msgid "Jump to position:"
+msgstr "Проаналізована позиція:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Помилка xine"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Повідомлення xine"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Готово"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Програвання"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Файл субтитрів"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Зберегти потік як"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "&Інформація про доріжку"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Скопіювати URL до кишені"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1269
+#, fuzzy
+msgid "&Send Broadcast Stream..."
+msgstr "Транслювання ..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "&Зберегти знімок екрана..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Зберегти потік..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "&Мінімальний режим"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Пауза"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+#, fuzzy
+msgid "&Fast Forward"
+msgstr "Не пересилати"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+#, fuzzy
+msgid "Slow &Motion"
+msgstr "Показати час &зміни"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Перескочити до позиції..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+#, fuzzy
+msgid "DVD Menu Left"
+msgstr "Пересунути меню ліворуч"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+#, fuzzy
+msgid "DVD Menu Right"
+msgstr "Пересунути меню праворуч"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+#, fuzzy
+msgid "DVD Menu Up"
+msgstr "Меню &DVD"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+#, fuzzy
+msgid "DVD Menu Down"
+msgstr "Меню &DVD"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+#, fuzzy
+msgid "DVD Menu Select"
+msgstr "Контекстне меню інструмента вибору"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Аудіо-канал"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Виберіть аудіо-канал"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Віз&уалізація аудіо"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Гучніше"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Тихіше"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+#, fuzzy
+msgid "&Deinterlace"
+msgstr "Режим вилучення через-рядкової розгортки:"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Авто"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Квадрат"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "Збільшити горизонтально"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "Зменшити горизонтально"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "Збільшити вертикально"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "Зменшити вертикально"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+#, fuzzy
+msgid "Deinterlace &Quality"
+msgstr "Режим вилучення через-рядкової розгортки:"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "Параметри &відео"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Еквалайзер"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Перемикання &меню"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Заголовок"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Основа"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "&Підвідео"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "К&ут"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Частина"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Заголовки"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "Глави"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Кути"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "&Інформація про доріжку"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Втулки ефектів..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+#, fuzzy
+msgid "&xine Engine Parameters"
+msgstr "Змінити параметр точки що будується"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Гучність"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Позиція"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+#, fuzzy
+msgid "Playtime"
+msgstr "Залишилось часу"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, fuzzy, c-format
+msgid "AudioCD Track %1"
+msgstr "Доріжка"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, fuzzy, c-format
+msgid "VCD Track %1"
+msgstr "Доріжка"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Параметри відео"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "Відтінок"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "Насиченість"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Контрастність"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Яскравість"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+#, fuzzy
+msgid "Audio/Video Offset"
+msgstr "Додаткові параметри аудіо/відео"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "Відступ субтитрів"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "авто"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Загальне попередження: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Немає інформації."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Попередження безпеки: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+#, fuzzy
+msgid "The device name you specified seems invalid. "
+msgstr "Вказана недійсна назва пристрою."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+#, fuzzy
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Аудіо-вивід відсутній; пристрій зайнятий."
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+#, fuzzy
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"У з'єднанні, яке намагалася встановити програма \"%1\", було відмовлено."
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+#, fuzzy
+msgid "Permission to this source was denied. "
+msgstr ""
+"Спроба змінити права доступу для ресурсу <strong>%1</strong> "
+"завершилась невдало."
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+#, fuzzy
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "Сталася проблема під час завантаження бібліотеки або декодера."
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Невідома помилка: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, fuzzy, c-format
+msgid "Using Video Driver: %1"
+msgstr "Вживається драйвер відео: "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+#, fuzzy
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+"Не вдається започаткувати драйвер аудіо \"%1\" - пробується \"авто\"..."
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, fuzzy, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Вживається драйвер аудіо: "
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "Започаткування xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "Не вдається започаткувати рушій xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "Вживати аудіодрайвер (типовий: авто)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "Вживати відеодрайвер (типовий: авто)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Показувати повідомлення індикатора"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Розмір тексту індикатора"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Шрифт повідомлень індикатора"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+#, fuzzy
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+"Не вдається започаткувати драйвер аудіо \"%1\" - пробується \"авто\"..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+#, fuzzy
+msgid "All Video Drivers failed to initialize!"
+msgstr "Не вдалося започаткувати жодного драйвера аудіо!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+"Не вдається започаткувати драйвер аудіо \"%1\" - пробується \"авто\"..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "Не вдалося започаткувати жодного драйвера аудіо!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Не вдається створити новий потік xine!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: відкриття..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Відкривається..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Аудіокодек"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Відеокодек"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "Не знайдено втулку для опрацювання цього ресурсу"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+#, fuzzy
+msgid "Requested resource does not exist"
+msgstr "Вказана станція не існує."
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+#, fuzzy
+msgid "Resource can not be opened"
+msgstr "Джерело та призначення повинні бути різними."
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Загальна помилка"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "Увімкнути звук"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "Вимкнути звук"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, fuzzy, c-format
+msgid "Fast Forward %1"
+msgstr "Перемістити вище"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+#, fuzzy
+msgid "Deinterlace: on"
+msgstr "Режим вилучення через-рядкової розгортки:"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+#, fuzzy
+msgid "Deinterlace: off"
+msgstr "Режим вилучення через-рядкової розгортки:"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "Пропорції"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Авто"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "Збільшити X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "Збільшити Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "мсек"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Параметри еквалайзера"
+
+#: player-parts/xine-part/equalizer.cpp:43
+#, fuzzy
+msgid "Volume gain"
+msgstr "Назва &тому:"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Видалити фільтр"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, fuzzy, c-format
+msgid "Seeking to %s"
+msgstr "З'єднання з %1:%2..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Вимкнути звук"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Коментар"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+#, fuzzy
+msgid "&GStreamer Engine Parameters"
+msgstr "Налаштування рушія GStreamer - amaroK"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+#, fuzzy
+msgid "GStreamer could not be initialized!"
+msgstr "Не вдається ініціалізувати інтерпретатор LUA"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+#, fuzzy
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+"Не вдається започаткувати драйвер аудіо \"%1\" - пробується \"авто\"..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+#, fuzzy
+msgid "No useable audio-driver found!"
+msgstr "xine не зміг започаткувати аудіо-драйвери."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+#, fuzzy
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+"Не вдається започаткувати драйвер аудіо \"%1\" - пробується \"авто\"..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "Параметри рушія GStreamer"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Параметри аудіо"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Бажаний драйвер аудіо"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Параметри відео"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Бажаний драйвер відео"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* Потрібний перезапуск!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Носій"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+#, fuzzy
+msgid "Media Options"
+msgstr "Більш&е параметрів Samba"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "Привід КД, ВідеоКД, DVD"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Ці канали вже існують, і тому їх не було додано:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "Не вдалось з'єднатись з X-сервером!"
+
+#, fuzzy
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "<qt>При закритті головного вікна JuK продовжуватиме працювати у системному лотку. Вживайте \"Вийти\" з меню \"Файл\", щоб зупинити програму.</qt>"
+
+#~ msgid "No player"
+#~ msgstr "Немає програвача"
+
+#~ msgid "No layer"
+#~ msgstr "Нема шару"
+
+#, fuzzy
+#~ msgid "Ch %1"
+#~ msgstr "Кн "
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "Компонент Kaffeine"
diff --git a/po/uz.po b/po/uz.po
new file mode 100644
index 0000000..25bd2f7
--- /dev/null
+++ b/po/uz.po
@@ -0,0 +1,3378 @@
+# translation of kaffeine.po to Uzbek
+# This file is distributed under the same license as the kaffeine package.
+#
+# Abdurahmonov Nurali <mavnur@gmail.com>, 2005, 2006.
+# Mashrab Kuvatov <kmashrab@uni-bremen.de>, 2005, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-04-07 18:36+0200\n"
+"Last-Translator: Mashrab Kuvatov <kmashrab@uni-bremen.de>\n"
+"Language-Team: Uzbek <kmashrab@uni-bremen.de>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.1\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "Янгилаш"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "Жорий/Кейинги"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "Канал"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "Бошлаш"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "Давомийлиги"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "Номи"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "Ҳамма дастурларни кўриш"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "Таймерга қўшиш"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "Номи:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "Тўлқин:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "Боши:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "Давомийлиги:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "Охири:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "Ёзиш тури:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "Йўқ"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "Ҳар куни"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "Ҳар ҳафта"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "Ҳар ой"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "Бошқа"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "Такрорлаш..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "Таймер таҳрирчи"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "Бунга ном беришингиз лозим!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "Давомийлик камида 1 дақиқа бўлиши лозим!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "Номда қуйидаги белгилар бўлмаши керак: > < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr ""
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "PID нолга тенг бўлмаслиги керак!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "Бирор кунни танлашингиз лозим."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "Каналлар"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "Таймерлар"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "Электрон дастур йўлчиси"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB мосламалари"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "Рақам"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "Номи"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "Аудио каналлар"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr ""
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "Ёзиб олиш"
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:271
+#, fuzzy
+msgid "Select icon..."
+msgstr "Кинони танлаш"
+
+#: input/dvb/dvbpanel.cpp:278
+#, fuzzy
+msgid "Choose channel icon"
+msgstr "Тўлқин таҳрирчи"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "Экранда қўшимча хабарларни кўрсатиш"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "Таймерлар"
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "Каналлар ..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "DVB мосламаси..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "Ҳаммаси"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "ТВ"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Радио"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "Янги туркум..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "Нишончани ўзгартириш..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "Туркумни ўчириш..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "Янги туркум"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "Ушбу туркум учун ном киритинг:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "Ростдан ушбу туркумни ўчиришни истайсизми?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr ""
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "Таймер муваффақиятли тузилди ва ишга туширилди."
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "Таймер муваффақиятли тузилди."
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "PID'(лар) созланмади"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine ёзишни давом эттирмоқда. Ростдан чиқишни истайсизми?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine'да режалаштирилган таймер мавжуд. Ростдан чиқишни истайсизми?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "Сигнал:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "Қулфлаш:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "Таҳрирлаш"
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "Ростдан ҳамма тўлқинни ўчиришни истайсизми?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "Қидиришни бошлаш"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "Қидиришни тўхтатиш"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "Тўхтатилмоқда..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "%1-та ТВ ва %2-та радиостанция топилди"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr ""
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "Таймер рўйхати:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "Янги"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "Тўхтатиш/Ўчириш"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"Ушбу таймер қайтарилди. Жорий вазифани ўтказиб юбориш ёки ўчиришни истайсизми?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "Ўтказиб юбориш"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "Танланган таймерни ўчиришни истайсизми?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "Ёзиб олинмоқда... "
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "Маълумот файллардан нусха олинмоқда..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB мосламалари"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB ускунаси"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "Ускуна мосламаси"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>Номи:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>Тури:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+#, fuzzy
+msgid "Satellite"
+msgstr "Ўйнаш рўйхатини сақлаш"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "Санъаткор"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "Номаълум"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "LNB'лар сони:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB мосламалари"
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB мосламалари"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "Манба:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB ёзиб олиш мосламаси"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "Ёзиб олиш директорияси:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(дақиқа)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr ""
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr ""
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr ""
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "Ҳар хил"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "Қидириш маълумотини янгилаш:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Ёзиб олиш"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "DVB клиенти"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "Ноаниқ ёзиб олиш директорияси."
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr ""
+
+# Hech qachon chala tarjima qilmang. Masalan,
+# "info port" (shunday alohida xabar bor) tarjima
+# qilinsa ushbu xabar mazmunsiz bo'ladi va u
+# tarjima qilingan deb belgilangani uchun uni
+# topish juda qiyin bo'ladi.
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr ""
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB мосламалари"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "Тиклаш"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr ""
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr ""
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr ""
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+#, fuzzy
+msgid "Loading of encoder '%1' failed."
+msgstr "Плейернинг '%1' қисмини юклаш муваффақиятсиз тугади."
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr ""
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "Мб"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "Кб"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "Байт"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "Аудио компакт-диск"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+#, fuzzy
+msgid "Play CD"
+msgstr "VCD кўриш"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr ""
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "Санъаткор:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "Албом:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "Қўшиқ"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr ""
+
+#: input/disc/disc.cpp:209
+#, fuzzy
+msgid "Audio CD encoding"
+msgstr "Аудио PID таҳрирчи"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "Аудио дискни тинглаш"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "DVD кўриш"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "VCD кўриш"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "&DVD кўриш"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "&VCD кўриш"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "Аудио дискни &тинглаш"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr ""
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr ""
+
+#: input/disc/disc.cpp:576
+#, fuzzy
+msgid "DVD Video"
+msgstr "Видео"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr ""
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr ""
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "Номсиз"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "Қўшиқ %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr ""
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+#, fuzzy
+msgid "KaffeineMp3Lame"
+msgstr "Kaffeine плейери"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr ""
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+#, fuzzy
+msgid "KaffeineOggVorbis"
+msgstr "Kaffeine"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB клиенти"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr ""
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "socket. ни очиш имконсиз."
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "Ҳамма ўлчамлар"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "Жуда кичик"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "Кичик"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "Ўртача"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "Катта"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "Жуда катта"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "Янги қидирув"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "Муқова мавжуд эмас"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "Муқова бошқарувчиси"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr ""
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "Ўйнаш"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "Кейингини ўйнаш/Навбатга қўшиш"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "&Ҳаммасини танлаш"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "Танланганлардан рўйхат тузиш"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "Су&бтитр қўшиш"
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "Номини &таҳрирлаш"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "&Маълумот"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "Узунлиги"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "Санъаткор"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "Альбом"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "Йил"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "Жанри"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "Субтитрлар"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "фаолиятда"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "Субтитр файлини танлаш"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "Муқовани танлаш"
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "Галерея"
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "Филтр"
+
+#: input/audiobrowser/playlist.cpp:398
+#, fuzzy
+msgid "Playlist:"
+msgstr "Ўйнаш рўйхати"
+
+# zamonaviy klavalarda return emas enter
+# ishlatiladi
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"Актив қўшиқлар рўйхатини танланг. Қўшиқлар рўйхати номини ўзгартигандан сўнг "
+"Enter тугмаси билан тасдиқланг."
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "Ўйнаш рўйхатини ўйнаш"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "Қай&тариш"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "&Тасодифий усул"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "Қўшиқларни таваккал танлаш усулида ўйнаш"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "Жорий ўйнаш рўйхатини ў&чириш"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "&Янги ўйнаш рўйхати"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "Ўйнаш рўйхатини &импорт қилиш"
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "&Жорий ўйнаш рўйхатини сақлаш"
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "Жорий ўйнаш рўйхатини ў&чириш"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine ўйнаш рўйхати файли"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "Ҳамма файллар"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "Ўйнаш рўйхатини очиш"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U ўйнаш рўйхати файллар"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS ўйнаш рўйхатлари"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "Ўйнаш рўйхатини сақлаш"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "Ўйнаш рўйхати"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "Янги"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "Медиа манбаъларини импорт қилиш..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(субтитрлар йўқ)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "Бошқа субтитрлар..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "Галерея"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "Рўйхатда: %1, Ўйнаш вақти: %2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "'%1' рўйхат ва дискдан ўчирилсинми?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "Ўйнаш рўйхатининг номи аллақачон мавжуд"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "Бошқа номни киритинг:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "Субтитрни танлаш"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "Медиа файли:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "Кинони танлаш"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "Субтитр файли:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "Ўйнаш/Вақтинча тўхтатиш"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "&Кейинги"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "&Товушсиз"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine плейери"
+
+#: startwindow.cpp:85
+#, fuzzy
+msgid "[Kaffeine Player]"
+msgstr "Kaffeine плейери"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "Абдураҳмонов Нурали"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "mavnur@gmail.com"
+
+#: main.cpp:73
+#, fuzzy
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"KDE учун медиа плейер. Турли медиа плейер тизимларини ишлатиш мумкин. Xine - "
+"андоза."
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(C) 2003-2005, Kaffeine тузувчилари"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr ""
+
+#: main.cpp:78
+#, fuzzy
+msgid "Original author"
+msgstr "Асл ўлчами"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr ""
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr ""
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Kaffeine 0.5 учун анимацияли лого"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr ""
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "Субтитр файлини импорт қилиш."
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U импорти. Текшириш."
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "Субтитр PID таҳрирчи"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "Янги нарса"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "Юқорига"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "Пастга"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< Танланганни янгилаш"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< Янги"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "PID:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "Саҳифа:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "Остки саҳифа:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "Тил:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "Таймер такрорланди"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "Аудио PID таҳрирчи"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "Аудио PID"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr ""
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "Мавжуд тўлқинлар:"
+
+# broadcasting'ni boshqacha tarjima qilish kerak.
+# Shuning uchun bu noaniq.
+# broadcasting bu erda dvb (digital video
+# broadcasting) ma'nosida keladi.
+# kaffeine dvb'ni qabul qilishi va o'zi tarqatish
+# imkoniga ega.
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(Мослаш/ўчириш учун сичқончанинг ўнг тугмани босинг)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "Янги..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "Филтерлар"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "Провайдер:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< Танланганни қўшиш"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< Филтрланганни қўшиш"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "Топилди"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "SNR"
+msgstr "SNR:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "Бажарилди"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "Тўлқин таҳрирчи"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "Частотаси:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "Телетекст PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "Видео PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "Субтитр PID'лари ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "Аудио PID'лари ..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "FEC юқори:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "FEC паст:"
+
+# guard - bilmadim, interval - oraliq.
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr ""
+
+# Hierarchy - ruschasi ierarxiya, bu erda nima
+# nazarda tutilgan men bilmadi. sizchi?
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "Инверсия:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, fuzzy, no-c-format
+msgid "Encoder:"
+msgstr "Охири:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, fuzzy, no-c-format
+msgid "Base directory:"
+msgstr "Ёзиб олиш директорияси:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, fuzzy, no-c-format
+msgid "..."
+msgstr "Янги..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr ""
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Компакт-диск асбоблар панели"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, fuzzy, no-c-format
+msgid "VBR"
+msgstr "DVB"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr ""
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, fuzzy, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis файллари"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr ""
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "Ўй&наш рўйхати"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "Чиқиш йўли"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "&Плейер"
+
+# bu erda gap oynaning o'lchami haqida gap
+# ketyapti
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "&Автоматик ўлчамини ўзгартиришни қўллаш"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "&Тармоқ орқали видео/аудио"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "&Йўлчи"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD менюлари"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "&Аудио"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "&Видео"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "Ў&лчам"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "Скриншот асбоблар панели"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "Бошқарув асбоблар панели"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "Товуш асбоблар панели"
+
+# o'zimda hech qanday taklif yo'q bo'lsa ham
+# position holat emas.
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr ""
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine мосламаси"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr ""
+
+# pause hamisha vaqtincha to'xtatish.
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "Сояланганда видеони вақтинча тўхтатиш"
+
+# tray'ni o'zbekchaga tarjima qilishga harakat
+# qilish kerak.
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr ""
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " сония"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "Йўқ"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr ""
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr ""
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "Ҳар хил мосламалар"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "Мета таглар учун алтернатив (Юникод эмас) кодлашни қўллаш"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "Кўп ишлатилган файллар рўйхатини тозалаш"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "Ўйнашни дарҳол бошлаш"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "Бутун экранга кўринишида бошлаш"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "Аудио драйверни созлаш"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "Видео драйверни созлаш"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "Аудио-CD/VCD/DVD ускунаси ўрнини созлаш."
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr ""
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "Ўрнатиш ёрдамчисини ишга тушириш"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr ""
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "Плейер ойнаси"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "Қўлланиладиган медиа форматлар"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG аудио файллари"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG видео файллари"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis файллари"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI файллари"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime файллари"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media файллари"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska файллари"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC файллари"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media файллари"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV файллари"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "Плейернинг '%1' қисмини юклаш муваффақиятсиз тугади."
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 қидирилган жойдан топилмади."
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "&Манзилни очиш"
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "&Жилдни очиш"
+
+# track qo'shiq, video yoki boshqa media
+# bo'lishi mumkin.
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "Ушбу ўйнашдан сўнг чиқиб монитор ўчирилсин"
+
+# track qo'shiq, video yoki boshqa media
+# bo'lishi mumkin.
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "Ушбу ўйнашдан сўнг чиқиш"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "Ўйнаш рўйхати тугагандан кейин чиқиш"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "&Минимал кўриниш"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "Ўйнаш рўйхати/Плейерни &кўрсатиш"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr ""
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "Асл ўлчами"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "Икки марта катта"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "Уч марта катта"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "Плейернинг &медиа тизими"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB клиенти"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "Плейер"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "Асосий ойна"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "DPMS Xserver кенгайтмалари топилмади."
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "Файл(лар)ни очиш"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "Манзилни очиш"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "Манзилни киритинг:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "Жилдни очиш"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "%1 драйвда топилмади ёки ускуна учун йўл хато."
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "Илтимос бошқа тўғри драйвни танланг:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 ни ўрнатиш бошқарувчиси"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "Ўрнатиш текшируви"
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine мосламаси"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ок."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr ""
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "Топилган версия"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine камида KDE %1'ни талаб қилади."
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 кодеклари"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"/usr/lib/win32'да WIN32 кодеклари йўқ. Сиз Windows Media 9, Real Media файллари "
+"ва бошқа форматларни ўйнолмайсиз. Керак бўлган кодекларни бу ердан ёзиб олиш "
+"мумкин:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD-ускунаси"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr ""
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr ""
+"DMA усулини текшириб бўлмади. Бунга рухсат йўқ ёки бундай ускуна умуман мавжуд "
+"эмас:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-ускунаси"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "DVB-ускунаси топилмади. DVB'га алоқа нарсалар кўринмайди."
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "Дистрибютор"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "НАТИЖА"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "Бир қанча муаммолар топилди, шунга қарамасдан Kaffeine ишлайди."
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "Ҳаммаси жойида!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+
+# desktop = ish stoli
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "Kaffeine нишончаси иш столида"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "Ўрнатиш мосламалари"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "Деинтерлейс сифати"
+
+# hech qachon chala tarjima qilmang.
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "Фойдаланувчи аниқлаган"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr ""
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "Эффект плагинлари"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "Аудио"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "Аудио филтрлари"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "Аудио филтрларини қўллаш"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "Филтр қўшиш"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "Барча филтрларни ўчириш"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "Видео"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "Видео филтрлари"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "Видео филтрларни қўллаш"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "Xine тизимини мослаш"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 мосламалари"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "Оддий мосламалар"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "Эксперт мосламалар"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "Stream'ни сақлаш"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "Субтитр"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "Аудио канал"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%2 дан %1"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-файл\n"
+"*.bmp|BMP-файл\n"
+"*.xbm|XBM-файл"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "Скриншотни сақлаш"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "Жўнатувичи манзили:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "Порт:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "Қуйидаги ҳолатга ўтиш:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "Xine хатоси"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "Xine хабари"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "Тайёр"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "Ўйнамоқда"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME тури"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "Субтитр файли"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "Stream'ни қуйидагича сақлаш"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "Ўйналаётган ҳақида &маълумот"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "Манзилдан нусха олиш"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "&Жўнатиш"
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "Қа&бул қилиш"
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "С&криншотни сақлаш"
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "Stream'ни сақлаш..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"Жорий stream ни қаттиқ дискда сақлаш. Ушбу хосса баъзи форматлара ишламайди. "
+"(М-н:Real Media) to prevent potential legal problems."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "&Минимал кўриниш"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "Вақтинча тўхтатиш"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "Те&злаштириш"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "&Секинлаштириш"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+#, fuzzy
+msgid "Skip Forward (20s)"
+msgstr "Ўтказиб юбориш (10 сонияга)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+#, fuzzy
+msgid "Skip Backward (20s)"
+msgstr "Орқага қайтариш (10 сонияга)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "Ўтказиб юбориш (1 дақиқа)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "Орқага қайтариш (1 дақиқа)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "Ўтказиб юбориш (10 дақиқа)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "Орқага қайтариш (10 дақиқа)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "Кўрсатилган жойдан ўйнаш..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD менюси чапда"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD менюси ўнгда"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD менюси юқорида"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD менюси пастда"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD менюсини танлаш"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "Аудио канал"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "Аудио канални танлаш"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "Аудиони &визуаллаштириш"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "Товушни кўтариш"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "Товушни пасайтириш"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "Деи&нтерлейс"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "&Автоматик"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "Ано&морфик"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "&Тўртбурчак"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "Деинтерлейс &сифати"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "&Видео мосламалари"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "&Эквалайзер"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "Менюни кўрсатиш/&бекитиш"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "&Номи"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "&Туб"
+
+# tub - yuqori, bosh. sub - quyi, menimcha.
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "Қуйи рас&м"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "&Бурчак"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "Номлари"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "Бурчаклар"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "Ўйналаётган ҳақида &маълумот"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "&Эффект плагинлари..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "Xine тизимини &мослаш"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "Товуш"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "Ҳолати"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "Ўйнаш вақти"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, fuzzy, c-format
+msgid "AudioCD Track %1"
+msgstr "Қўшиқ %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, fuzzy, c-format
+msgid "VCD Track %1"
+msgstr "Қўшиқ %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "Видео мосламалар"
+
+# men bunga ishonchim komil emas
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr ""
+
+# men bunga ishonchim komil emas
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "Контраст"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "Ёруғлилик"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "Авто"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"Асосий огоҳлантириш: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "Ҳеч қанақа маълумот йўқ."
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"Хавфсизлик огоҳлантириши: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"Уланишга ҳаракат қилинган хост номаълум.\n"
+"Хостнинг номини яроқлилигини текширинг. "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "Сиз кўрсатган ускуна номи хатога ўхшайди."
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "Аудио чиқиш мавжуд эмас. Ускуна банд."
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"Алоқа ўрнатиш рад этилди.\n"
+"Манзилни текширинг. "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "Кўрсатилган файл ёки манзил топилмади. Илтимос текширинг."
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "Ушбу манбага рухсат йўқ."
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"Манбани ўқиб бўлмади.\n"
+"Сизда ушбу манба учун етарли ҳуқуқ бўлмаши ёки манбада умуман ҳеч нарса йўқ "
+"бўлиши мумкин (м-н ускунада диск бўлмаши мумкин). "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"Номаълум хато: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, fuzzy, c-format
+msgid "Using Video Driver: %1"
+msgstr "Ишлатилаётган видео драйвер: "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, fuzzy, c-format
+msgid "Using Audio Driver: %1"
+msgstr "Ишлатилаётган аудио драйвер: "
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "Дастурли аудио миксердан фойдаланиш"
+
+# osd - On Screen Display
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "Экранда қўшимча хабарларни кўрсатиш"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "Экранда қўшимча хабарларнинг ўлчами"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "Экранда қўшимча хабарлар учун шрифт"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "Янги Xine Stream тузилмади!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB: очилмоқда..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "Очилмоқда..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "Аудио кодек"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "Видео кодек"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "Манба ишдан чиққан кўринади"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "Сўралган манбаъ мавжуд эмас"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "Манбани очиб бўлмади"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "Generic хатолик"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+#, fuzzy
+msgid "Mute Off"
+msgstr "Товушсиз"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+#, fuzzy
+msgid "Mute On"
+msgstr "Товушсиз"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "Тезлаштириш %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "Секинлаштириш %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "Деинтерлейс: ёқилган"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "Деинтерлейс: ўчирилган"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "Авто"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "м.сония"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "Эквалазер мосламалари"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr ""
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "Филтрни ўчириш"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "Товушсиз"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "Изоҳ"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "&GStreamer Engine ўлчамлари"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "Яроқли аудио драйвер топилмади!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "Яроқли видео драйвер топилмади!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "GStreamer Engine ўлчамлари"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "Аудио мосламалари"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "Афзал аудио драйвер"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "Видео мосламалари"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "Афзал видео драйвер"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "Қайта юклаш лозим!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "Медиа"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "Медиа мосламалари"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD ускуна"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr ""
+
+#~ msgid "These channels already exist and were not added:"
+#~ msgstr "Ушбу тўлқин аллақачон мавжуд, шу сабабли қўшилмади:"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "X-Server'га уланиш муваффақиятсиз тугади!"
+
+# tray'ni o'zbekchaga tarjima qilishga harakat
+# qilish kerak.
+# Ikkinchi gap quyidagicha tarjima qilinadi.
+# Dasturdan to'liq chiqish uchun Fayl menyusidan
+# Chiqish bandini tanlash kerak.
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "Асосий ойна ёпилса ҳам Kaffeine йиғилган ҳолда ишлайверади. Дастурдан тўлиқ чиқиш учун Файл менюсидан Чиқиш бандини танлаш керак."
+
+#~ msgid "No player"
+#~ msgstr "Плейер йўқ"
+
+#, fuzzy
+#~ msgid "Ch %1"
+#~ msgstr "Канал "
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-C"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-T"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-S"
+
+#~ msgid "Developer"
+#~ msgstr "Тузувчи"
+
+#~ msgid "DVB Support"
+#~ msgstr "DVB қўллануви"
+
+#~ msgid "DVD"
+#~ msgstr "DVD"
+
+#~ msgid "VCD"
+#~ msgstr "VCD"
+
+#~ msgid " min"
+#~ msgstr " дақ"
+
+#~ msgid ""
+#~ "Interval to fake keypresses\n"
+#~ "(prevent screensaver from activating)"
+#~ msgstr ""
+#~ "Тугмалар босилиши орасидаги фарқ\n"
+#~ "(prevent screensaver from activating)"
+
+#~ msgid "Open Files"
+#~ msgstr "Файлларни очиш"
+
+#~ msgid "Open Directory"
+#~ msgstr "Жилдни очиш"
+
+#~ msgid "Open DVD"
+#~ msgstr "DVD кўриш"
+
+#~ msgid "Open VCD"
+#~ msgstr "VCD кўриш"
+
+#~ msgid "This player doesn't support DVD playback."
+#~ msgstr "Бу плейер DVD ўйнашни қўлламайди."
+
+#~ msgid "This player doesn't support VCD playback."
+#~ msgstr "Бу плейер VCD ўйнашни қўлламайди."
+
+#~ msgid "This player doesn't support Audio CD playback."
+#~ msgstr "Бу плейер аудио диск ўйнашни қўлламайди."
+
+# Go! Ketdik! deb tarjima qilingan.
+#~ msgid "Create Go!-Tab"
+#~ msgstr "Кетдик! ойнасини кўрсатиш"
+
+#, fuzzy
+#~ msgid "Audio Browser"
+#~ msgstr "Аудио кодек"
+
+#~ msgid "Name must not start with ( > )!"
+#~ msgstr "Ном (>) белгиси билан бошланмаслиги керак!"
+
+#~ msgid "Audio:"
+#~ msgstr "Аудио:"
+
+#~ msgid "Playlist Toolbar"
+#~ msgstr "Ўйнаш рўйхати асбоблар панели"
+
+#~ msgid "Select Playlist"
+#~ msgstr "Ўйнаш рўйхатини танлаш"
+
+#~ msgid "&Next in Playlist/Queue"
+#~ msgstr "Қўшиқл&ар рўйхати/навбатда кейинги"
+
+#~ msgid "Pre&vious in Playlist"
+#~ msgstr "Қўшиқлар рўй&хатида олдинги"
+
+#~ msgid "Next Channel"
+#~ msgstr "Навбатдаги тўлқин"
+
+#~ msgid "Previous Channel"
+#~ msgstr "Олдинги тўлқин"
+
+#~ msgid "Go!"
+#~ msgstr "Кетдик!"
+
+#~ msgid "Kaffeine Playlist"
+#~ msgstr "Kaffeine ўйнаш рўйхати"
+
+#~ msgid "Undock"
+#~ msgstr "Ажратиш"
+
+#~ msgid "Undock Playlist Window"
+#~ msgstr "Ўйнаш рўйхати ойнасини ажратиш"
+
+#~ msgid "Dock"
+#~ msgstr "Ажратмаш"
+
+#~ msgid "Subtitle pids :"
+#~ msgstr "Субтитр PID'лари:"
+
+#~ msgid "Properties :"
+#~ msgstr "Мосламалар:"
+
+#~ msgid "Audio pids :"
+#~ msgstr "Аудио PID'лар:"
+
+#~ msgid "Video pid :"
+#~ msgstr "Видео PID:"
+
+#~ msgid "Channels :"
+#~ msgstr "Тўлқинлар:"
+
+#~ msgid "Delete all"
+#~ msgstr "Ҳаммасини ўчириш"
+
+#~ msgid "Filters :"
+#~ msgstr "Филтрлар:"
+
+#~ msgid "Found :"
+#~ msgstr "Топилди:"
+
+#~ msgid "Select a subtitle file"
+#~ msgstr "Субтитр файлини танлаш"
+
+#~ msgid "Select a subtitle"
+#~ msgstr "Субтитрни танлаш"
+
+#~ msgid "Kaffeine requires xine-lib >= %1. Download the latest version here:"
+#~ msgstr "Kaffeine учун камида xine-lib %1 лозим. Уни қуйидаги жойдан ёзиб олиш мумкин:"
+
+#~ msgid "Save screenshot as..."
+#~ msgstr "Скриншотни сақлаш"
+
+#~ msgid "Save Stream"
+#~ msgstr "Stream'ни сақлаш"
+
+#~ msgid "Next Entry/Chapter"
+#~ msgstr "Навбатдаги Entry/Chapter"
+
+#~ msgid "Playback failed. Reason unknown."
+#~ msgstr "Ўйнаш тўхтади. Сабаби номаълум."
diff --git a/po/xx.po b/po/xx.po
new file mode 100644
index 0000000..e948f1d
--- /dev/null
+++ b/po/xx.po
@@ -0,0 +1,3165 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2007-06-11 15:59+0000\n"
+"Last-Translator: transxx program <null@kde.org>\n"
+"Language-Team: Test Language <kde-i18n-doc@kde.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "xxEPGxx"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "xxRefreshxx"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr "xxScheduledxx"
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "xxCurrent/Nextxx"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "xxChannelxx"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "xxBeginxx"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "xxDurationxx"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "xxTitlexx"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "xxView All Programsxx"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "xxAdd to Timersxx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "xxName:xx"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "xxChannel:xx"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "xxBegin:xx"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "xxDuration:xx"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "xxEnd:xx"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "xxRecord as:xx"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "xxNonexx"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "xxDailyxx"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "xxWeeklyxx"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "xxMonthlyxx"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "xxCustomxx"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "xxRepeat...xx"
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "xxTimer Editorxx"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "xxYou must give it a name!xx"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "xxDuration must be at least 1 minute!xx"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr ""
+"xxName must not contain any of the following characters: > < \\ / : \" |xx"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "xxInitial Transponder Settingsxx"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "xxThis name is not unique.xx"
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "xxMissing audio pid(s)!xx"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "xxPid must be non zero!xx"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "xxYou have to choose some days.xx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "xxChannelsxx"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "xxTimersxx"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "xxElectronic Program Guidexx"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "xxOSDxx"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "xxDVB settingsxx"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "xxNumberxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "xxNamexx"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "xxAudio Channelsxx"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "xxInstant Recordxx"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "xxBroadcastxx"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "xxTime shiftingxx"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "xxRecordingxx"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "xxBroadcastingxx"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "xxSelect icon...xx"
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "xxChoose channel iconxx"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "xxDigital TVxx"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "xxLive digital TV only works with the xine engine.xx"
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "xxOSD Next Channelxx"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "xxOSD Previous Channelxx"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr "xxOSD Zapxx"
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "xxOSD Next Eventxx"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "xxOSD Previous Eventxx"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "xxShow OSDxx"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "xxEPG...xx"
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "xxTimers...xx"
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "xxBroadcasting...xx"
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "xxChannels...xx"
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "xxConfigure DVB...xx"
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "xxAllxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "xxTVxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "xxRadioxx"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "xxNew Category...xx"
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "xxChange Icon...xx"
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "xxDelete Category...xx"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "xxNew Categoryxx"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "xxEnter a name for this category:xx"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "xxDo you really want to delete this category?xx"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"xx<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>xx"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "xxBroadcasting failed.xx"
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "xxCan't start broadcasting.xx"
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "xxTimer successfully created and started.xx"
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "xxYou may want to define some channel first!xx"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "xxTimer successfully created.xx"
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "xxStill recording.xx"
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "xxStill broadcasting.xx"
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "xxCan't tune dvb!xx"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "xxCan't set pid(s)xx"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr "xxNo CAM freexx"
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "xxKaffeine is still recording. Do you really want to quit?xx"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "xxKaffeine has queued timers. Do you really want to quit?xx"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "xxSignal:xx"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "xxSNR:xx"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "xxLock:xx"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "xxEdit...xx"
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "xxDo you really want to delete all channels?xx"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "xxSTART scanxx"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "xxSTOP scanxx"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "xxStopping...xx"
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "xxFound: %1 TV - %2 radioxx"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "xxCan't open DVB info socket.xx"
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "xxTimers list:xx"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "xxNewxx"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "xxStop/Deletexx"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+"xxThis timer is repeated. Do you want to skip the current job or delete the "
+"timer?xx"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "xxSkip Currentxx"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "xxDelete the selected timer?xx"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "xxDownloading... xx"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "xxCopying data files...xx"
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "xxDVB Settingsxx"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "xxDVB Devicexx"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "xxDevice Settingsxx"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "xx<qt><b>Name:</b></qt>xx"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "xx<qt><b>Type:</b></qt>xx"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "xxCablexx"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr "xxTerrestrialxx"
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "xxSatellitexx"
+
+#: input/dvb/dvbconfig.cpp:517
+msgid "Atsc"
+msgstr "xxAtscxx"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "xxUnknownxx"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "xxNumber of LNBs:xx"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "xx1st sat:xx"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "xxLNB Settings...xx"
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "xx2nd sat:xx"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "xx3rd sat:xx"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "xx4th sat:xx"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "xxLNB settings...xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "xxSource:xx"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+"xx<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>xx"
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+"xx<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+"xx"
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "xxDVB Recording Optionsxx"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "xxRecords directory:xx"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "xxTime shifting directory:xx"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "xxBegin margin:xx"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "xx(minutes)xx"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "xxEnd margin:xx"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "xxInstant record duration:xx"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "xxPreferred format:xx"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "xxDVB Broadcastingxx"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "xxBroadcast address:xx"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "xxBroadcast port:xx"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "xxInfo port:xx"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "xxMiscxx"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "xxDefault charset (restart needed):xx"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "xxUpdate scan data:xx"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "xxDownloadxx"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+"xxDump epg's events to \n"
+"~/kaffeine_dvb_events.tx:xx"
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "xxDumpxx"
+
+#: input/dvb/dvbconfig.cpp:752
+msgid "DVB plugins"
+msgstr "xxDVB pluginsxx"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"xx<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>xx"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "xxInvalid records directory.xx"
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "xxInvalid time shifting directory.xx"
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "xxBroadcast and Info ports must be different.xx"
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "xxInvalid broadcast address.xx"
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "xxLNB Settingsxx"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "xxUniversal LNBxx"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr "xxC-Band LNBxx"
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr "xxC-Band Multipoint LNBxx"
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr "xxDual LOxx"
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr "xxSingle LOxx"
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr "xxH/V LOxx"
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr "xxDual LO switch frequency:xx"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr "xx (MHz)xx"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr "xxLo-band frequency:xx"
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr "xxHi-band frequency:xx"
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr "xxSingle LO frequency:xx"
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr "xxVertical pol. LO frequency:xx"
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr "xxHorizontal pol. LO frequency:xx"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "xxResetxx"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "xxCan't open DVB broadcast socket.xx"
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "xxCan't init DVB broadcast socket.xx"
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "xxNo audio encoders could be found.xx"
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "xxLoading of encoder '%1' failed.xx"
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "xxUnable to create folder: xx"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "xxMBxx"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "xxKBxx"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "xxBytesxx"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "xxAudio CDxx"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "xxPlay CDxx"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "xxRip CDxx"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "xxArtist:xx"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "xxAlbum:xx"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "xxTrackxx"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr ""
+"xxSelect the tracks you want to rip and click the <b>Encode</b> button.xx"
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "xxEncode...xx"
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "xxAudio CD encodingxx"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "xxPlay Audio CDxx"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "xxPlay DVDxx"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "xxPlay VCDxx"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "xxOpen &DVDxx"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "xxOpen &VCDxx"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "xxOpen &Audio-CDxx"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "xxYou must select the tracks to rip.xx"
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "xxSeveral Audio CD found. Choose one:xx"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "xxNo audio CD found.xx"
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "xxDVD Videoxx"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "xxSeveral DVD Video found. Choose one:xx"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "xxVCD-SVCDxx"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "xxSeveral (S)VCD found. Choose one:xx"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "xxNo Titlexx"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "xxTrack %1xx"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "xxSearching local cddb entry ...xx"
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "xxSearching remote cddb entry ...xx"
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "xxFound exact match cddb entry ...xx"
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "xxFound close cddb entry ...xx"
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "xxCDDB Matchesxx"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "xxSeveral close CDDB entries found. Choose one:xx"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "xxKaffeineMp3Lamexx"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "xxA Lame mp3 encoder plugin for Kaffeine.xx"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "xxKaffeineOggVorbisxx"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "xxA Ogg Vorbis encoder plugin for Kaffeine.xx"
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "xxDVB Clientxx"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "xxCan't open info socket.xx"
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "xxCan't bind info socket!!!xx"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "xxCan't open socket.xx"
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "xxCan't set socket option!!!xx"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "xxCan't bind socket!!!xx"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "xxAll Sizesxx"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "xxVery Smallxx"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "xxSmallxx"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "xxMediumxx"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "xxLargexx"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "xxVery Largexx"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "xxNew Searchxx"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "xxThe cover you have selected is unavailable. Please select another.xx"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "xxCover Unavailablexx"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "xxCover Downloaderxx"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "xxNo matching images found, please enter new search terms:xx"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "xxEnter new search terms:xx"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "xxPlayxx"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "xxPlay Next/Add to Queuexx"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "xxSelect &Allxx"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "xxCreate Playlist From Selectedxx"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "xxAdd Sub&title...xx"
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "xx&Edit Titlexx"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "xx&Infoxx"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "xxLengthxx"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "xxURLxx"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "xxArtistxx"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "xxAlbumxx"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "xxYearxx"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "xxGenrexx"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "xxSubtitlesxx"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "xxin usexx"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"xx*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Filesxx"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "xxSelect Subtitle Filexx"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "xxChoose a Cover...xx"
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "xxGallery...xx"
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "xxFilterxx"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "xxPlaylist:xx"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr ""
+"xxSelect the active playlist. To change playlist name edit it and confirm with "
+"'Return'.xx"
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "xxPlay Playlistxx"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "xx&Repeatxx"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "xxLoop playlistxx"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "xxSh&ufflexx"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "xxPlay items in random orderxx"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "xxAutodownload coversxx"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "xxAutomatic dowloading of coversxx"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "xx&Clear Current Playlistxx"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "xxNe&w Playlistxx"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "xx&Import Playlist...xx"
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "xx&Save Current Playlist As...xx"
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "xxRe&move Current Playlistxx"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "xxKaffeine Playlistsxx"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "xxAll Filesxx"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "xxOpen Playlistxx"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "xxM3U Playlistsxx"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "xxPLS Playlistsxx"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "xxSave Playlistxx"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "xxPlaylistxx"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "xxNEWxx"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "xxImporting media resources...xx"
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "xx(no subtitles)xx"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "xxOther subtitle...xx"
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "xxGalleryxx"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "xxQueue: %1 Entries, Playtime: %2xx"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "xxEntries: %1, Playtime: %2xx"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "xxRemove '%1' from list and from disk?xx"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "xxPlaylist Name Already Existsxx"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "xxEnter different playlist name:xx"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "xxSelect Subtitlexx"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "xxMedia file:xx"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "xxSelect Moviexx"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "xxSubtitle file:xx"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "xxPlay / Pausexx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "xx&Nextxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "xx&Mutexx"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "xxKaffeine Playerxx"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "xx[Kaffeine Player]xx"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "xxYour namesxx"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "xxYour emailsxx"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr ""
+"xxA media player for KDE 3. Can use multiple backends for playback, default "
+"(and recommended) is xine.xx"
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "xx(c) 2003-2005, The Kaffeine Authorsxx"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "xxCurrent maintainerxx"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "xxOriginal authorxx"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "xxCICAM support.xx"
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "xxVarious valuable patches.xx"
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "xxDVB OSD browsing patch.xx"
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "xxDVB categories patches.xx"
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "xxLogo for Kaffeine 0.8 and other artwork.xx"
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "xxLogo animation for Kaffeine 0.5xx"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "xxAlternate encoding for meta tags. Many patches.xx"
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "xxxine post plugin handling. Many patches.xx"
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "xxSubtitle file import.xx"
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "xxM3U import. Testing.xx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "xxSubtitle PIDs Editorxx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "xxSubtitle PIDsxx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "xxNew Itemxx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "xxMove Upxx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "xxMove Downxx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "xx<< Update Selectedxx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "xx<< Newxx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "xxPid:xx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "xxPage:xx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "xxSub page:xx"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "xxLang:xx"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "xxRepeated Timerxx"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "xxAudio PIDs editorxx"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "xxAudio PIDsxx"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "xxAC3xx"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "xxBroadcasting Editorxx"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "xxAvailable channels:xx"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "xxBroadcasting list:xx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "xx(Right click to edit/delete)xx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "xxNew...xx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "xxSearch Onxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "xxOffset (KHz)xx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "xx0xx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "xx+167xx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "xx-167xx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "xxStart Scanxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "xxFiltersxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr "xxFree to airxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "xxProvider:xx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "xx<< Add Selectedxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "xx<< Add Filteredxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "xxFoundxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "xxSNRxx"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "xxDonexx"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "xx&DVBxx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "xxChannel Editorxx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "xxNr:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "xxPolarityxx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "xxFrequency:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "xxSymbol rate:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "xxScrambledxx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "xxTeletext PID:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "xxService ID:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "xxVideo PID:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "xxTransport stream ID:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "xxSubtitle PIDs...xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "xxAudio PIDs...xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "xxBandwidth:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "xxFEC high:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "xxTransmission:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "xxFEC low:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "xxGuard interval:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "xxHierarchy:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "xxModulation:xx"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "xxInversion:xx"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "xxEncoding Preferencesxx"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "xxEncoder:xx"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "xxBase directory:xx"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "xx...xx"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr "xxParanoia:xx"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "xxDisable all checkingxx"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "xxNormal modexx"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr "xxParanoia modexx"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "xxNormalizexx"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "xxCD Toolbarxx"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "xxLame mp3 optionsxx"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "xxVBRxx"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "xxBitrate:xx"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "xxKb/sxx"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "xxOgg Vorbis Optionsxx"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "xxQuality :xx"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "xxPlay&listxx"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "xxQuit Optionsxx"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "xx&Playerxx"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "xxEnable Auto &Resizexx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "xx&Network Broadcastingxx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "xx&Navigationxx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "xx&DVDxx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "xx&DVD Menusxx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "xx&Audioxx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "xx&Videoxx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "xx&Aspect Ratioxx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "xxScreenshot Toolbarxx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "xxControls Toolbarxx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "xxVolume Toolbarxx"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "xxPosition Toolbarxx"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "xxKaffeine Setupxx"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "xxBehaviorxx"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "xxPause video when window is minimizedxx"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "xxEmbed in system trayxx"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr "xx secxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "xxoffxx"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "xxDuration of title announcement in system trayxx"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "xxEnable DVB clientxx"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "xxMiscellaneous Optionsxx"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "xxUse alternate (non-Unicode) encoding for Meta tagsxx"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"xxChoose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)xx"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "xxClear recent files listxx"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "xxStart playing immediatelyxx"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "xxStart in fullscreen modexx"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "xxSet audio driverxx"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "xxSet video driverxx"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "xxSet Audio-CD/VCD/DVD device path.xx"
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "xxOutput xine debug messagesxx"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "xxRun installation wizardxx"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr ""
+"xxFile(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'.xx"
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "xxStartxx"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "xxPlayer Windowxx"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "xxSupported Media Formatsxx"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "xxMPEG Audio Filesxx"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "xxMPEG Video Filesxx"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "xxOgg Vorbis Filesxx"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "xxAVI Filesxx"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "xxQuicktime Filesxx"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "xxReal Media Filesxx"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "xxMatroska Filesxx"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "xxFLAC Filesxx"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "xxWindows Media Filesxx"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "xxWAV Filesxx"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "xxLoading of player part '%1' failed.xx"
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "xx%1 not found in search path.xx"
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "xxOpen &URL...xx"
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "xxOpen D&irectory...xx"
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "xxQuit && Shutoff Monitor After This Trackxx"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "xxQuit After This Trackxx"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "xxQuit After Playlistxx"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "xx&Minimal Modexx"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "xxToggle &Playlist/Playerxx"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "xxKeep &Original Aspectxx"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "xxOriginal Sizexx"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "xxDouble Sizexx"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "xxTriple Sizexx"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "xx&Player Enginexx"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "xxDVB clientxx"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "xxPlayerxx"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "xxMain Windowxx"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "xxDPMS Xserver extension was not found.xx"
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+"xxThis will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off.xx"
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "xxOpen File(s)xx"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "xxOpen URLxx"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "xxEnter a URL:xx"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "xxOpen Folderxx"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "xxNo %1 in drive, or wrong path to device.xx"
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "xxPlease select correct drive:xx"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "xxKaffeine %1 Installation Wizardxx"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "xxInstallation Checkxx"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "xxKaffeine-Xinexx"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "xxOk.xx"
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "xxPart not found. Please check your installation!xx"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "xxFound versionxx"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "xxKaffeine requires KDE >= %1.xx"
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "xxWIN32 Codecsxx"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"xxNo WIN32 codecs found in /usr/lib/win32. You're not able to play Windows "
+"Media 9 files, newer Real Media files and some less common formats. Download "
+"the codecs here:xx"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+"xxlibdvdcss not found. You're not able to play encrypted (most commercial) "
+"DVD's. You can get the library here (but using it may violate copyright "
+"regulations of your country!):xx"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "xxDVD Drivexx"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "xxDMA mode off! For smooth DVD playback run as root:xx"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "xxCan't check DMA mode. Permission denied or no such device:xx"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "xxDVB-Devicexx"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "xxNo DVB-Devices found. The DVB related functions will be hidden.xx"
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "xxDistributionxx"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+"xxThe xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:xx"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "xxRESULTxx"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "xxFound some problems, but nevertheless Kaffeine may work.xx"
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "xxAll ok!xx"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr ""
+"xxUse Kaffeine as helper application for mms:// (Microsoft Media) streamsxx"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr ""
+"xxUse Kaffeine as helper application for rtsp:// (Real Media and others) "
+"streamsxx"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "xxCreate a Kaffeine icon on desktopxx"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "xxInstallation Optionsxx"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "xxDeinterlace Qualityxx"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"xx<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing).xx"
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr ""
+"xx<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed.xx"
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr ""
+"xx<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated).xx"
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr ""
+"xx<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug.xx"
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"xx<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *xx"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"xx<b>Very very high cpu usage, great quality with (experimental) "
+"improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *xx"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "xxUser definedxx"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "xxConfigure tvtime Deinterlace Plugin...xx"
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr ""
+"xx* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>xx"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "xxConfigure tvtime Deinterlace Pluginxx"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "xxEffect Pluginsxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "xxAudioxx"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "xxAudio Filtersxx"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "xxEnable audio filtersxx"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "xxAdd Filterxx"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "xxRemove All Filtersxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "xxVideoxx"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "xxVideo Filtersxx"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "xxEnable video filtersxx"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "xxxine Engine Parametersxx"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "xx%1 Optionsxx"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "xxBeginner Optionsxx"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "xxExpert Optionsxx"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "xxXinePartxx"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "xxA xine based player part for Kaffeine.xx"
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"xxSMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?xx"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "xxSave Stream Asxx"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "xxSubtitlexx"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "xxAudiochannelxx"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "xx%1 of %2xx"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"xx*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-Filexx"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "xxSave Screenshot Asxx"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "xxBroadcasting port:xx"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "xxConfigure Receive Broadcast Streamxx"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "xxSender address:xx"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "xxPort:xx"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "xxJump to position:xx"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xxxine Errorxx"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xxxine Messagexx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "xxReadyxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "xxPlayingxx"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "xxMimexx"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "xxSubtitle Filexx"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "xxSave Stream asxx"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "xxTrack infoxx"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "xxCopy URL to Clipboardxx"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "xxPlay in Kaffeine Externallyxx"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "xx&Send Broadcast Stream...xx"
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "xx&Receive Broadcast Stream...xx"
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "xx&Save Screenshot...xx"
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "xxSave Stream...xx"
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr ""
+"xxSaves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems.xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "xxToggle Minimal Modexx"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "xxPausexx"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "xx&Fast Forwardxx"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "xxSlow &Motionxx"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "xxSkip Forward (20s)xx"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "xxSkip Backward (20s)xx"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "xxSkip Forward (1m)xx"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "xxSkip Backward (1m)xx"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "xxSkip Forward (10m)xx"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "xxSkip Backward (10m)xx"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "xxJump to Position...xx"
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "xxDVD Menu Leftxx"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "xxDVD Menu Rightxx"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "xxDVD Menu Upxx"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "xxDVD Menu Downxx"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "xxDVD Menu Selectxx"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "xxAudio Channelxx"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "xxSelect audio channelxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "xxAudio &Visualizationxx"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "xxVolume Upxx"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "xxVolume Downxx"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "xx&Deinterlacexx"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "xxActivate this for interlaced streams, some DVD's for example.xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "xx&Autoxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "xx&4:3xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "xxA&namorphicxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "xx&Squarexx"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "xxZoom In Horizontalxx"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "xxZoom Out Horizontalxx"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "xxZoom In Verticalxx"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "xxZoom Out Verticalxx"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "xxDeinterlace &Qualityxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "xx&Video Settingsxx"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "xx&Equalizerxx"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "xx&Menu Togglexx"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "xx&Titlexx"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "xx&Rootxx"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "xx&Subpicturexx"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "xxAn&glexx"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "xx&Partxx"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "xxTitlesxx"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "xxChaptersxx"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "xxAnglesxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "xxTrack &Infoxx"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "xxEffect &Plugins...xx"
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "xx&xine Engine Parametersxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "xxVolumexx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "xxPositionxx"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"xxShort click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSDxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "xxPlaytimexx"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "xxLooking for CDDB entries...xx"
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "xxAudioCD Track %1xx"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "xxVCD Track %1xx"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "xxVideo Settingsxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "xxHuexx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "xxSaturationxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "xxContrastxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "xxBrightnessxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "xxAudio/Video Offsetxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "xxSubtitle Offsetxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "xxautoxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"xxGeneral Warning: \n"
+"xx\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "xxNo Informations available.xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"xxSecurity Warning: \n"
+"xx\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"xxThe host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "xxThe device name you specified seems invalid. xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"xxThe network looks unreachable.\n"
+"Check your network setup and the server name. xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "xxAudio output unavailable. Device is busy. xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"xxThe connection was refused.\n"
+"Check the host name. xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "xxThe specified file or url was not found. Please check it. xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "xxPermission to this source was denied. xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"xxThe source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "xxA problem occur while loading a library or a decoder: xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "xxThe source seems encrypted, and can't be read. xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"xx\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"xxUnknown error: \n"
+"xx\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "xxError: Can't init new Video Driver %1 - using %2!xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "xxUsing Video Driver: %1xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "xxError: Can't init new Audio Driver %1 - using %2!xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "xxUsing Audio Driver: %1xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "xxInit xine...xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "xxCan't init xine Engine!xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "xxAudiodriver to use (default: auto)xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "xxVideodriver to use (default: auto)xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "xxUse software audio mixerxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "xxShow OSD Messagesxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "xxSize of OSD textxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "xxFont for OSD Messagesxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "xxCan't init Video Driver '%1' - trying 'auto'...xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "xxAll Video Drivers failed to initialize!xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "xxCan't init Audio Driver '%1' - trying 'auto'...xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "xxAll Audio Drivers failed to initialize!xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "xxCan't create a new xine Stream!xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "xxDVB: opening...xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "xxOpening...xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "xxAudio Codecxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "xxVideo Codecxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "xxNo plugin found to handle this resourcexx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "xxResource seems to be brokenxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "xxRequested resource does not existxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "xxResource can not be openedxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "xxGeneric errorxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "xxMute Offxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "xxMute Onxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "xxFast Forward %1xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "xxSlow Motion %1xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "xxDeinterlace: onxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "xxDeinterlace: offxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "xxAspect Ratioxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "xxAutoxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "xx4:3xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "xx16:9xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "xx1:1xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "xx2.11:1xx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "xxZoom Xxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "xxZoom Yxx"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "xxmsecxx"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "xxEqualizer Settingsxx"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "xxVolume gainxx"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr ""
+"xxVolume Gain for Equalizer - If the sound becomes noisy disable thisxx"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "xxDelete Filterxx"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "xxSeeking to %sxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "xxGStreamer initializing failed!xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "xxGStreamerPartxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "xxMutexx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "xxCommentxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "xx&GStreamer Engine Parametersxx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "xxGStreamer could not be initialized!xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr ""
+"xxMissing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "xxCan't init Audio Driver '%1' - trying another one...xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "xxNo useable audio-driver found!xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "xxCan't init Video Driver '%1' - trying another one...xx"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "xxNo useable video-driver found!xx"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "xxGStreamer Engine Parametersxx"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "xxAudio Optionsxx"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "xxPrefered audio driverxx"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "xxVideo Optionsxx"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "xxPrefered video driverxx"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "xx* Restart required!xx"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "xxMediaxx"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "xxMedia Optionsxx"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "xxCD, VCD, DVD drivexx"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "xxDummyPartxx"
diff --git a/po/zh_CN.po b/po/zh_CN.po
new file mode 100644
index 0000000..ba3ba23
--- /dev/null
+++ b/po/zh_CN.po
@@ -0,0 +1,3118 @@
+# Translation of Kaffeine to Chinese Simplified
+# This file is distributed under the same license as the Kaffeine package.
+# Copyright (C) 2003 Jrgen Kofler <juergen.kofler@chello.at>
+# Qianzheng <billqian@sohu.com> 2004
+# KanKer <kanker@163.com>, 2004.
+# qianzheng <billqian@sohu.com>, 2004, 2005.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-05-03 15:26+0800\n"
+"Last-Translator: qianzheng <billqian@sohu.com>\n"
+"Language-Team: zh_CN <i18n-translation@lists.linux.net.cn>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "电子节目指南"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "刷新"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "当前/下一个"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "频道"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "开始"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "时长"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "标题"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr "查看全部节目"
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr "添加到定时器"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "名称:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "频道:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "开始:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "时长:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "结束:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "录制为:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "无"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "每天"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "每周"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "每月"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "自定义"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "重复..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr "定时器编辑器"
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "您必须给出一个名称!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "时长至少为 1 分钟!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "名称不能包含下列字符:> < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr "初始传发器设置"
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "此名称不唯一。"
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "没有音频包标识符!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "包标识符必须为非零!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr "您必须选择哪一天。"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "频道"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr "定时器"
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr "电子节目指南"
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB 设置"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "编号"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "名称"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "音频声道"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "立即录制"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "广播"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr "时光平移"
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "录制中"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "广播"
+
+#: input/dvb/dvbpanel.cpp:271
+msgid "Select icon..."
+msgstr "选择图标..."
+
+#: input/dvb/dvbpanel.cpp:278
+msgid "Choose channel icon"
+msgstr "选择频道图标"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "数字电视"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr "直播数字电视只适用于 xine 引擎。"
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD 下一个频道"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD 上一个频道"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr "OSD 下个事件"
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr "OSD 上个事件"
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "显示 OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "电子节目指南..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr "定时器..."
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "广播..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "频道..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "配置 DVB ..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "全部"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "电视"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "广播"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "新建类别..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "更改图标..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "删除类别..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "新建类别"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "输入此类别的名称:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "您真的要删除此类别吗?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+"<qt>不能从 http://hftom.free.fr/kaxtv/dvbdata.tar.gz 得到 DVB 数据!"
+"<br>\t\t\t请检查您的网络连接,然后按“是”再试一次。"
+"<br>\t\t\t或按“否”取消。"
+"<br>\t\t\t如果您已有这个档案,将它复制到 ~/.kde/share/apps/kaffeine/dvbdata.tar.gz 并按“是”"
+"<br>"
+"<br>要再试一次吗?</qt>"
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "广播失败。"
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "无法开始广播。"
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr "定时器成功创建并已启动。"
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr "您应先定义一些频道!"
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr "定时器创建成功。"
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "仍在录制。"
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "仍在广播。"
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr "不能调制 dvb!"
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "不能设置包标识符"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr "Kaffeine 仍在录制。您真的要退出吗?"
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr "Kaffeine 还有排队的定时器。您真的想退出吗?"
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "信号:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "信噪比:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "锁:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "编辑..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr "您真的要删除所有频道吗?"
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "开始扫描"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "停止扫描"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "正在停止..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "找到:%1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr "无法打开 DVB 信息套接字。"
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr "定时器列表:"
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "新建"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "停止/删除"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr "定时器是重复的。您是想要跳过当前任务还是删除定时器?"
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "跳过当前"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr "删除所选定时器?"
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "正在下载..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "正在复制数据文件..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB 设置"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB 设备"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "设备设置"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>名称:<b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>类型:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr "有线"
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+msgid "Satellite"
+msgstr "卫星"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "艺人"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "未知"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr "LNB 号:"
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr "第一路:"
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB 设置..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr "第二路:"
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr "第三路:"
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr "第四路:"
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB 设置..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "源:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DVB 录制选项"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr "录制目录:"
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr "时光平移目录:"
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr "起始空白:"
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr "(分)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr "结束空白:"
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "立即录制时长:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "首选格式:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB 广播"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "广播地址:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "广播端口:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr "信息端口:"
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "杂项"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr "默认字符集(需要重新启动):"
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr "更新扫描数据:"
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "下载"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "DVB 客户"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+"<qt>不能从 http://hftom.free.fr/kaxtv/dvbdata.tar.gz 得到 DVB 数据!"
+"<br>\t\t\t请检查您的网络连接,然后按“是”再试一次。"
+"<br>\t\t\t或按“否”取消。"
+"<br>要再试一次吗?</qt>"
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr "非法的录制目录。"
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr "非法的时光平移目录。"
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr "广播和信息端口必须不同。"
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "非法的广播地址。"
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB 设置"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+#, fuzzy
+msgid "Dual LO switch frequency:"
+msgstr "频率:"
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+#, fuzzy
+msgid "Lo-band frequency:"
+msgstr "频率:"
+
+#: input/dvb/dvbconfig.cpp:992
+#, fuzzy
+msgid "Hi-band frequency:"
+msgstr "频率:"
+
+#: input/dvb/dvbconfig.cpp:996
+#, fuzzy
+msgid "Single LO frequency:"
+msgstr "频率:"
+
+#: input/dvb/dvbconfig.cpp:1000
+#, fuzzy
+msgid "Vertical pol. LO frequency:"
+msgstr "频率:"
+
+#: input/dvb/dvbconfig.cpp:1004
+#, fuzzy
+msgid "Horizontal pol. LO frequency:"
+msgstr "频率:"
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "重置"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr "无法打开 DVB 广播套接字。"
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr "无法初始化 DVB 广播套接字。"
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "未找到音频编码器。"
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "载入编码器“%1”失败。"
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "无法创建文件夹:"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "字节"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "音频 CD"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "播放 CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "提取 CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "艺人:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "专辑:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "轨道"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "选择您想要提取的音轨,然后单击<b>编码</b>按钮。"
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "编码..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "音频 CD 编码"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "播放音频 CD"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "播放 DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "播放 VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "打开 DVD(&D)"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "打开 VCD(&V)"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "打开 Audio-CD(&A)"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "您必须选择要抓取的音轨。"
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "找到了多张音频 CD。请选择:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "未找到音频 CD。"
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "DVD 视频"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "找到了多张 DVD 视频。请选择:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "找到了多张 (S)VCD。请选择:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "无标题"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "音轨 %1"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "正在搜索本地 CDDB 项..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "正在搜索远程 CDDB 项..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "找到了精确匹配的 CDDB 项..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "找到了接近的 cddb 项..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr "CDDB 匹配"
+
+#: input/disc/cddb.cpp:557
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "找到了多个接近的 CDDB 项。请选择:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Kaffeine 的 Lame MP3 编码插件。"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Kaffeine 的 Ogg Vorbis 编码器插件。"
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB 客户"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr "无法打开信息套接字。"
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr "无法绑定信息套接字。"
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr "无法打开套接字。"
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr "无法设定套接字选项。"
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr "无法绑定套接字。"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "全部大小"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "非常小"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "小"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "中"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "大"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "非常大"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "新建搜索"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "您所选择的封面不可用。请另外选择一个。"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "封面不可用"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "封面下载器"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "没有找到匹配的图像,请输入新的搜索条件:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "输入新的搜索条件:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "播放"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "播放下一曲/添加到队列"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "全选(&A)"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "从选择的文件创建播放列表"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "添加字幕(&T)..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "编辑标题(&E)"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "信息(&I)"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "长度"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "艺人"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "专辑"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "年份"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "流派"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "字幕"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "使用中"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|字幕文件\n"
+"*.*|所有文件"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "选择字幕文件"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "选择封面..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "影集..."
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "过滤器"
+
+#: input/audiobrowser/playlist.cpp:398
+msgid "Playlist:"
+msgstr "播放列表:"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr "选择活动播放列表。要改变播放列表的名字请编辑它并用“回车”确认。"
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "播放播放列表"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "重复(&R)"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "循环播放列表"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "乱序(&U)"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "随机播放"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr "自动下载封面"
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr "自动下载封面"
+
+#: input/audiobrowser/playlist.cpp:492
+msgid "&Clear Current Playlist"
+msgstr "清除当前播放列表(&C)"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "新建播放列表(&W)"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "导入播放列表(&I)..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "当前播放列表另存为(&S)..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "移除当前播放列表(&M)"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine 播放列表"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "所有文件"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "打开播放列表"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U 播放列表"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS 播放列表"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "保存播放列表"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "播放列表"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "新建"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "正在导入媒体资源..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(无字幕)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "其它字幕..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "影集"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "队列:%1 曲目,播放时间:%2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "曲目:%1,播放时间:%2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "从列表和磁盘上删除“%1”吗?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "播放列表名称已经存在"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "输入不同的播放列表名称:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "选择字幕"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "媒体文件:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "选择影片"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "字幕文件:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "播放/暂停"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "下一首(&N)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "静音(&M)"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine 播放器"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine 播放器]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "翻译:钱 峥,补充翻译:KanKer"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "billqian@sohu.com,kanker@163.com"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr "一个 KDE 3 的媒体播放器,可使用多种后端来回放,默认(也是推荐后端)是 xine。"
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, Kaffeine 作者"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "目前维护者"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "原作者"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr "CICAM 支持。"
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr "各种有价值的补丁。"
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr "DVB OSD 浏览补丁。"
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr "DVB 类别补丁。"
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Kaffeine 0.8 的标志和其它美工。"
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Kaffeine 0.5 动画图标"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr "为 Meta 标签使用替代编码。许多补丁。"
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr "xine 后期插件处理。许多补丁。"
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "字幕文件导入。"
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "M3U 导入。测试中。"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "字幕包标识符编辑器"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "字幕包标识符"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "新建项目"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "上移"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "下移"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< 更新所选"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< 新建"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "包标识符:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr "页面:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr "次页面:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr "语言:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr "重复计时器"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "音频包标识符编辑器"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "音频包标识符"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "广播编辑器"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "可用的频道:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "广播列表:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(右键单击可编辑/删除)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "新建..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "搜索"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr "偏移(KHz)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr "0"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr "+167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr "-167"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "开始搜索"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "过滤器"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "提供者:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< 添加所选"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr "<< 添加已筛选的"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "发现的"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, no-c-format
+msgid "SNR"
+msgstr "SNR"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "完成"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "DVB(&D)"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "频道编辑器"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr "极化"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "频率:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr "符号率:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr "扰动"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr "图文电视包标识符:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr "服务标识:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "视频包标识符:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr "传送流标识:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "字幕包标识符..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "音频包标识符..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "带宽:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr "误码率上限"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "传输:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr "误码率下限"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr "保护间隔:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr "层次:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr "调制:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr "倒置:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "编码首选项"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "编码器:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "基础目录:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "禁止全部检查"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "普通模式"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr "正规化"
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "CD 工具栏"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame MP3 选项"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "比特率:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis 选项"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "质量:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "播放列表(&L)"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "退出选项"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "播放器(&P)"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "开启自动缩放(&R)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "网络广播(&N)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "导航(&N)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "DVD 菜单(&D)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "音频(&A)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "视频(&V)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "纵横比(&A)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "抓图工具栏"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "控制工具栏"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "音量工具栏"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "位置工具栏"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine 设置"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "行为"
+
+#: pref.cpp:62
+msgid "Pause video when window is minimized"
+msgstr "当窗口最小化时暂停视频"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "嵌入到系统托盘"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " 秒"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "关闭"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr "在系统托盘中显示标题的时长"
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "启用 DVB 选项"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "杂项选项"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr "为 Meta 标签使用替代编码 (非 Unicode)"
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+"为 Meta 标签选择一个替代编码名称\n"
+"(为了转换为 Unicode)"
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "清除最近的文件列表"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "立即开始播放"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "以全屏模式启动"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "设置音频驱动程序"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "设置视频驱动程序"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "设置 Audio-CD/VCD/DVD 设备路径。"
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "输出 xine debug 信息"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "运行安装向导"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr "播放的文件。可以是一个本地文件、URL、目录或 “DVD”、“VCD”、“AudioCD”。"
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "开始"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "播放器窗口"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "支持的媒体格式"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG 音频文件"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG 视频文件"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis 文件"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI 文件"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime 文件"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real 媒体文件"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska 文件"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC 文件"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows 媒体文件"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV 文件"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr "载入播放器组件“%1”失败。"
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "%1 未在搜索路径中发现。"
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "打开 URL(&U)..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "打开目录(&I)..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr "退出并在这首曲目之后关闭显示器"
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "在这首曲目后退出"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "播放列表后退出"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "迷你模式(&M)"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "切换播放列表/播放器(&P)"
+
+#: kaffeine.cpp:710
+msgid "Keep &Original Aspect"
+msgstr "保持原始纵横比(&O)"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "原始大小"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "双倍大小"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "三倍大小"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "播放器引擎(&P)"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB 客户"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "播放器"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "主窗口"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "没有找到 DPMS X服务扩展"
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr "退出 Kaffeine 并在文件/播放列表结束之后关闭显示器的电源。为了关闭显示器的电源,在您的 X 配置文件中必须启用“dpms”选项。"
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "打开文件"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "打开 URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "输入 URL:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "打开文件夹"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr "没有 %1 在驱动器中,或设备路径错误。"
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "请选择正确的驱动器:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 安装向导"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "安装检查"
+
+#: instwizard.cpp:69
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine-Xine"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "确定。"
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "未组件发现,请检查您的安装!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "发现的版本"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine 要求 KDE >= %1。"
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 解码器"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"在 /usr/lib/win32 中未发现 WIN32 解码器,您不能播放 Windows Media 9 文件,新的 Real "
+"媒体文件和一些不太常用的格式。从这里下载解码器:"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr "libdvdcss 未发现。您不能播放加密 (大多数为商业的) DVD,您可以从这里下载库(但使用它可能违犯贵国的版权法!):"
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD 驱动器"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "DMA 模式关闭!要平滑的播放 DVD 请以 root 权限运行:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "不能检查 DMA 模式。权限拒绝或无此设备:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB 设备"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "未找到 DVB 设备。DVB 相关的功能将被隐藏。"
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "发行"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr "随SuSE发布的xine-lib“因为合法性的要求 (潜在违反专利) 可能缺少某些特性”。您应该使用下面的软件包:"
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "结果"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "发现一些问题,但 Kaffeine 仍能工作。"
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "全部正常!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "使用 Kaffeine 播放 mms:// (Microsoft 媒体)流"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr "使用 Kaffeine 播放 rtsp:// (Real 媒体及其它) 流"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "在桌面上创建一个 Kaffeine 图标"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "安装选项"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "反交错质量"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>极低的 cpu 占用率,最差质量。</b>"
+"<br>丢失一半垂直分辨率。对于某些系统 (带有 PCI 视频卡),和正常视频回放比较 (无反交错),这会降低 cpu 占用率。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr "<b>低 cpu 占用率,较差质量。</b><br>垂直模糊图像,因此移除反交错效果。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr "<b>中等 cpu 占用率,中等质量。</b><br>分析图像并区域显示人工交错被修正 (插值)。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr "<b>高 cpu 占用率,较好质量。</b><br>DVD 图像格式的转换以提高质量并修正彩色噪点。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>极高 cpu 占用率,极好质量。</b>"
+"<br>除了使用智能反交错算法,还将加倍帧速率 (30->60 帧/秒) 以符合电视机的场速率。检测并恢复 3-2 帧间距。*"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>非常非常高 cpu 占用率,完美质量增强 (试验性的)。</b>"
+"<br>打开位移修正 (使用原始的 24 帧/秒 速率播放电影) 并柔化垂直色彩 (修正某些 DVD 中的彩色小条纹)。*"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "用户定义"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "配置 tvtime 反交错插件..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr "* <i>可能需要一个修正的 2.4 内核 (如 RedHat) 或 2.6 内核。</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "配置 tvtime 反交错插件"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "效果插件"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "音频"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "音频过滤器"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "开启音频过滤器"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "添加过滤器"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "移除所有过滤器"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "视频"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "视频过滤器"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "开启视频过滤器"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "xine 引擎参数"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 选项"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "新手选项"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "专家选项"
+
+#: player-parts/xine-part/xine_part.cpp:184
+msgid "XinePart"
+msgstr "XinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr "一个基于 xine 的 kaffeine 播放器组件。"
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+"SMIL (同步多媒体集成语言) 的支持尚不成熟!\n"
+"XinePart 现在试图播放无编排的视频原件。继续吗?"
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "流另存为"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "字幕"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "音频声道"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%2 的 %1"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-文件\n"
+"*.bmp|BMP-文件\n"
+"*.xbm|XBM-文件"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "保存抓图"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "广播端口:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "配置接收广播流"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "发送者地址:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "端口:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "跳到位置:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine 错误"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine 消息"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "就绪"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "播放中"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "MIME"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "字幕文件"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "流另存为"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+msgid "Track info"
+msgstr "轨道信息"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "复制 URL 到剪切板"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "在外部 Kaffeine 中播放"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "发送广播流(&S)..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "接收广播流(&R)..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "保存抓图(&S)..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "流另存为..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr "保存当前流到硬盘。为消除一些潜在的法律纠纷该功能对一些格式是禁用的 (如 Real 媒体)。"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+msgid "Toggle Minimal Mode"
+msgstr "切换迷你模式"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "暂停"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "快进(&F)"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "慢进(&M)"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+msgid "Skip Forward (20s)"
+msgstr "快进二十秒"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+msgid "Skip Backward (20s)"
+msgstr "快退二十秒"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "快进一分钟"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "快退一分钟"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "快进十分钟"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "快退十分钟"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "跳到位置..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "DVD 菜单 左"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "DVD 菜单 右"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "DVD 菜单 上"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "DVD 菜单 下"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD 菜单 选择"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "音频声道"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "选择音频声道"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "可视化音频(&V)"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "音量增加"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "音量增益减少"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "反交错(&D)"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "为交错流激活此项,如某些 DVD。"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "自动(&A)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "4:3(&4)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr "变形(&N)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "正方形(&S)"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "水平放大"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "水平缩小"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "垂直放大"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "垂直缩小"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "反交错质量(&Q)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "视频设置(&V)"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "均衡器(&E)"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "菜单切换(&M)"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "标题(&T)"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "根(&R)"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "子画面(&S)"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "角度(&G)"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "局部(&P)"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "标题"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "章节"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "角度"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "轨道信息(&I)"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "效果插件(&P)..."
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "xine 引擎参数(&X)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "音量"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "位置"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+"短单击:切换计时器 向前/向后\n"
+"长单击:切换计时器 OSD"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "播放时间"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "正在查找 CDDB 曲目..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, c-format
+msgid "AudioCD Track %1"
+msgstr "音频 CD 音轨 %1"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, c-format
+msgid "VCD Track %1"
+msgstr "VCD 轨道 %1"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "视频设置"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "色调"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "饱和度"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "对比度"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "亮度"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr "音频/视频偏移量"
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr "字幕偏移量"
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "自动"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"常规警告:\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "没有可用信息。"
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"安全警告:\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"您要连接的主机未知。\n"
+"请检查指定主机名的合法性。"
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "您指定的设备名不合法。"
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"网络不可用。\n"
+"请检查您的网络设置和服务器名。"
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "音频输出不可用。设备忙。"
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"连接被拒绝。\n"
+"请检查主机名。"
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "没有找到指定的文件或 url。请检查。"
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "此数据源的许可被拒绝。"
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"无法读取数据源。\n"
+"也许您没有足够的权限,或数据源没有数据。(如:驱动器中没有光盘)。"
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "读取库或解码器时发生问题:"
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "数据源似乎是加密的,无法读取。"
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"您的 DVD 很可能是加密的。根据贵国法律,您可以或不可以使用 libdvdcss 来读取这张光盘。"
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"未知错误:\n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "错误:不能初始化新的视频驱动 %1 - 使用 %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, c-format
+msgid "Using Video Driver: %1"
+msgstr "使用视频驱动:%1"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "错误:不能初始化新的音频驱动 %1 - 使用 %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, c-format
+msgid "Using Audio Driver: %1"
+msgstr "使用音频驱动:%1"
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "初始化 xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "无法初始化 Xine 引擎!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "使用的音频驱动 (默认:自动)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "使用的视频驱动 (默认:自动)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "使用软件音频混音器"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "显示 OSD 信息"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "OSD 文本大小"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "OSD 消息字体"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "不能初始化视频驱动“%1” - 尝试“自动”..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "所有视频设备初始化失败!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "不能初始化音频驱动“%1” - 尝试“自动”..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "所有音频设备初始化失败!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "无法创建一个新的 xine 流!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB:正在打开..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "正在打开..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "音频编解码器"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "视频编解码器"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "没有找到插件来处理这个资源"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "资源似乎损坏"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "请求的资源不存在"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "资源无法被打开"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "常规错误"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+msgid "Mute Off"
+msgstr "静音关"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+msgid "Mute On"
+msgstr "静音开"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "快进 %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "慢进 %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "反交错:开"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "反交错:关"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "纵横比"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "自动"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "横向放大"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "纵向放大"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "毫秒"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "均衡器设置"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "音量增益"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "均衡器的音量增益 - 如果声音有噪音请关闭。"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "删除过滤器"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr "正搜索到 %s"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "GStreamer 初始化失败!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "静音"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "注释"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "GStreamer 引擎参数(&G)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "无法初始化 GStreamer"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr "缺少 GStreamer 注册表!您在安装后是否没有以 root 身份运行 <b>gst-register</b>?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "不能初始化音频驱动“%1” - 尝试另一个..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "未找到可用的音频驱动程序!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "不能初始化视频驱动“%1” - 尝试另一个..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "未找到可用的视频驱动程序"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "GStreamer 引擎参数"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "音频选项"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "首选音频驱动程序"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "视频选项"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "首选视频驱动程序"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* 需要重新启动!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "媒体"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "媒体选项"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD、VCD、DVD 驱动器"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "空组件"
diff --git a/po/zh_TW.po b/po/zh_TW.po
new file mode 100644
index 0000000..94d50c0
--- /dev/null
+++ b/po/zh_TW.po
@@ -0,0 +1,3137 @@
+# SOME DESCRIPTIVE TITLE.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: kaffeine\n"
+"POT-Creation-Date: 2006-11-09 08:49+0100\n"
+"PO-Revision-Date: 2006-03-24 20:14+0800\n"
+"Last-Translator: You-Cheng Hsieh <yochenhsieh@xuite.net>\n"
+"Language-Team: Traditional Chinese <zh_l10n@linux.org.tw>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: input/dvb/kevents.cpp:63
+msgid "EPG"
+msgstr "EPG"
+
+#: input/dvb/kevents.cpp:68 input/dvb/kevents.cpp:94
+msgid "Refresh"
+msgstr "重新整理"
+
+#: input/dvb/kevents.cpp:70 input/dvb/kevents.cpp:95
+msgid "Scheduled"
+msgstr ""
+
+#: input/dvb/kevents.cpp:72 input/dvb/kevents.cpp:96
+msgid "Current/Next"
+msgstr "目前的/下一個"
+
+#: input/dvb/kevents.cpp:79 input/dvb/krecord.cpp:46
+msgid "Channel"
+msgstr "頻道"
+
+#: input/dvb/kevents.cpp:80 input/dvb/krecord.cpp:47
+msgid "Begin"
+msgstr "開始"
+
+#: input/disc/disc.cpp:153 input/dvb/kevents.cpp:81 input/dvb/krecord.cpp:48
+msgid "Duration"
+msgstr "持續時間"
+
+#: input/audiobrowser/playlist.cpp:354 input/disc/disc.cpp:152
+#: input/dvb/kevents.cpp:82
+msgid "Title"
+msgstr "標題"
+
+#: input/dvb/kevents.cpp:140
+msgid "View All Programs"
+msgstr ""
+
+#: input/dvb/kevents.cpp:142
+msgid "Add to Timers"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 105
+#: input/dvb/ktimereditor.cpp:35 rc.cpp:225
+#, no-c-format
+msgid "Name:"
+msgstr "名稱:"
+
+#: input/dvb/ktimereditor.cpp:39
+msgid "Channel:"
+msgstr "頻道:"
+
+#: input/dvb/ktimereditor.cpp:43
+msgid "Begin:"
+msgstr "開始於:"
+
+#: input/dvb/ktimereditor.cpp:47
+msgid "Duration:"
+msgstr "持續時間:"
+
+#: input/dvb/ktimereditor.cpp:51
+msgid "End:"
+msgstr "結束:"
+
+#: input/dvb/ktimereditor.cpp:55
+msgid "Record as:"
+msgstr "錄為:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 79
+#: input/dvb/ktimereditor.cpp:120 input/dvb/ktimereditor.cpp:181 rc.cpp:49
+#, no-c-format
+msgid "None"
+msgstr "無"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 90
+#: input/dvb/ktimereditor.cpp:121 input/dvb/ktimereditor.cpp:182 rc.cpp:52
+#, no-c-format
+msgid "Daily"
+msgstr "每天"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 101
+#: input/dvb/ktimereditor.cpp:122 input/dvb/ktimereditor.cpp:183 rc.cpp:55
+#, no-c-format
+msgid "Weekly"
+msgstr "每星期"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 112
+#: input/dvb/ktimereditor.cpp:123 input/dvb/ktimereditor.cpp:184 rc.cpp:58
+#, no-c-format
+msgid "Monthly"
+msgstr "每月"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 123
+#: input/dvb/ktimereditor.cpp:124 input/dvb/ktimereditor.cpp:185 rc.cpp:61
+#, no-c-format
+msgid "Custom"
+msgstr "使用者自定"
+
+#: input/dvb/ktimereditor.cpp:130
+msgid "Repeat..."
+msgstr "重覆..."
+
+#: input/dvb/ktimereditor.cpp:132
+msgid "Timer Editor"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:108 input/dvb/ktimereditor.cpp:194
+msgid "You must give it a name!"
+msgstr "您必須給它一個名稱!"
+
+#: input/dvb/ktimereditor.cpp:215
+msgid "Duration must be at least 1 minute!"
+msgstr "持續時間至少要有一分鐘!"
+
+#: input/dvb/ktimereditor.cpp:236
+msgid "Name must not contain any of the following characters: > < \\ / : \" |"
+msgstr "名稱不能含有以下字元:> < \\ / : \" |"
+
+#: input/dvb/channeleditor.cpp:62
+msgid "Initial Transponder Settings"
+msgstr ""
+
+#: input/dvb/channeleditor.cpp:115
+msgid "This name is not unique."
+msgstr "這個名稱重複了。"
+
+#: input/dvb/channeleditor.cpp:126
+msgid "Missing audio pid(s)!"
+msgstr "沒有音訊 pid(s)!"
+
+#: input/dvb/audioeditor.cpp:158 input/dvb/subeditor.cpp:161
+msgid "Pid must be non zero!"
+msgstr "Pid 不能為零!"
+
+#: input/dvb/crontimer.cpp:100
+msgid "You have to choose some days."
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 16
+#: input/dvb/dvbpanel.cpp:133 input/dvb/scandialog.cpp:78 rc.cpp:146
+#: rc.cpp:149
+#, no-c-format
+msgid "Channels"
+msgstr "頻道"
+
+#: input/dvb/dvbpanel.cpp:136 input/dvb/krecord.cpp:97
+msgid "Timers"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:139
+msgid "Electronic Program Guide"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:142
+msgid "OSD"
+msgstr "OSD"
+
+#: input/dvb/dvbpanel.cpp:145
+msgid "DVB settings"
+msgstr "DVB 設定"
+
+#: input/dvb/dvbpanel.cpp:163
+msgid "Number"
+msgstr "數字"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 60
+#: input/dvb/dvbpanel.cpp:164 input/dvb/krecord.cpp:45 rc.cpp:155 rc.cpp:210
+#, no-c-format
+msgid "Name"
+msgstr "名稱"
+
+#: input/dvb/dvbpanel.cpp:176
+msgid "Audio Channels"
+msgstr "音訊頻道"
+
+#: input/dvb/dvbpanel.cpp:181 input/dvb/dvbpanel.cpp:336
+msgid "Instant Record"
+msgstr "快速錄影"
+
+#: input/dvb/dvbpanel.cpp:184
+msgid "Broadcast"
+msgstr "廣播"
+
+#: input/dvb/dvbpanel.cpp:194
+msgid "Time shifting"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620 input/dvb/dvbpanel.cpp:202
+#: player-parts/xine-part/kxinewidget.cpp:2006
+msgid "Recording"
+msgstr "錄影中"
+
+#: input/dvb/dvbconfig.cpp:693 input/dvb/dvbpanel.cpp:210
+msgid "Broadcasting"
+msgstr "廣播中"
+
+#: input/dvb/dvbpanel.cpp:271
+#, fuzzy
+msgid "Select icon..."
+msgstr "選擇電影"
+
+#: input/dvb/dvbpanel.cpp:278
+#, fuzzy
+msgid "Choose channel icon"
+msgstr "頻道編輯器"
+
+#: input/dvb/dvbpanel.cpp:306 kaffeine.cpp:198
+msgid "Digital TV"
+msgstr "數位電視"
+
+#: input/dvb/dvbpanel.cpp:317
+msgid "Live digital TV only works with the xine engine."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:331
+msgid "OSD Next Channel"
+msgstr "OSD 下個頻道"
+
+#: input/dvb/dvbpanel.cpp:332
+msgid "OSD Previous Channel"
+msgstr "OSD 前個頻道"
+
+#: input/dvb/dvbpanel.cpp:333
+msgid "OSD Zap"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:334
+msgid "OSD Next Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:335
+msgid "OSD Previous Event"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:337
+msgid "Show OSD"
+msgstr "顯示 OSD"
+
+#: input/dvb/dvbpanel.cpp:338
+msgid "EPG..."
+msgstr "EPG..."
+
+#: input/dvb/dvbpanel.cpp:339
+msgid "Timers..."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:340
+msgid "Broadcasting..."
+msgstr "廣播中..."
+
+#: input/dvb/dvbpanel.cpp:341
+msgid "Channels..."
+msgstr "頻道..."
+
+#: input/dvb/dvbpanel.cpp:342
+msgid "Configure DVB..."
+msgstr "設定 DVB..."
+
+#: input/dvb/dvbconfig.cpp:341 input/dvb/dvbpanel.cpp:399
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:472
+#: input/dvb/dvbpanel.cpp:868
+msgid "All"
+msgstr "全部"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 302
+#: input/dvb/dvbconfig.cpp:343 input/dvb/dvbpanel.cpp:401
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:873 rc.cpp:192
+#, no-c-format
+msgid "TV"
+msgstr "TV"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 286
+#: input/dvb/dvbconfig.cpp:345 input/dvb/dvbpanel.cpp:403
+#: input/dvb/dvbpanel.cpp:424 input/dvb/dvbpanel.cpp:871 rc.cpp:189
+#, no-c-format
+msgid "Radio"
+msgstr "Radio"
+
+#: input/dvb/dvbpanel.cpp:420
+msgid "New Category..."
+msgstr "新的分類..."
+
+#: input/dvb/dvbpanel.cpp:423
+msgid "Change Icon..."
+msgstr "改變圖示..."
+
+#: input/dvb/dvbpanel.cpp:425
+msgid "Delete Category..."
+msgstr "刪除分類..."
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "New Category"
+msgstr "新的分類"
+
+#: input/dvb/dvbpanel.cpp:430
+msgid "Enter a name for this category:"
+msgstr "為這個分類輸入一個名稱:"
+
+#: input/dvb/dvbpanel.cpp:449
+msgid "Do you really want to delete this category?"
+msgstr "您確定要刪除這個分類?"
+
+#: input/dvb/dvbpanel.cpp:944 input/dvb/dvbpanel.cpp:1502
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br>\t\t\tIf you already have this archive, copy it to "
+"~/.kde/share/apps/kaffeine/dvbdata.tar.gz and say Yes."
+"<br>"
+"<br>Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1131
+msgid "Broadcasting failed."
+msgstr "廣播失敗。"
+
+#: input/dvb/dvbpanel.cpp:1135
+msgid "Can't start broadcasting."
+msgstr "無法開始廣播。"
+
+#: input/dvb/dvbpanel.cpp:1287
+msgid "Timer successfully created and started."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1427
+msgid "You may want to define some channel first!"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1491
+msgid "Timer successfully created."
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1887
+msgid "Still recording."
+msgstr "仍在錄影中。"
+
+#: input/dvb/dvbpanel.cpp:1890
+msgid "Still broadcasting."
+msgstr "仍在廣播中。"
+
+#: input/dvb/dvbpanel.cpp:1893
+msgid "Can't tune dvb!"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:1896
+msgid "Can't set pid(s)"
+msgstr "無法設定 pid(s)"
+
+#: input/dvb/dvbpanel.cpp:1899
+msgid "No CAM free"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2493
+msgid "Kaffeine is still recording. Do you really want to quit?"
+msgstr ""
+
+#: input/dvb/dvbpanel.cpp:2498
+msgid "Kaffeine has queued timers. Do you really want to quit?"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:84
+msgid "Signal:"
+msgstr "訊號:"
+
+#: input/dvb/scandialog.cpp:88
+msgid "SNR:"
+msgstr "SNR:"
+
+#: input/dvb/scandialog.cpp:92
+msgid "Lock:"
+msgstr "鎖定:"
+
+#: input/dvb/scandialog.cpp:236
+msgid "Edit..."
+msgstr "編輯..."
+
+#: input/dvb/scandialog.cpp:342
+msgid "Do you really want to delete all channels?"
+msgstr ""
+
+#: input/dvb/scandialog.cpp:810 input/dvb/scandialog.cpp:856
+msgid "START scan"
+msgstr "開始掃描"
+
+#: input/dvb/scandialog.cpp:837
+msgid "STOP scan"
+msgstr "停止掃描"
+
+#: input/dvb/scandialog.cpp:843
+msgid "Stopping..."
+msgstr "停止中..."
+
+#: input/dvb/scandialog.cpp:939
+msgid "Found: %1 TV - %2 radio"
+msgstr "找到: %1 TV - %2 radio"
+
+#: input/dvb/sender.cpp:57 input/dvb/sender.cpp:69
+msgid "Can't open DVB info socket."
+msgstr ""
+
+#: input/dvb/krecord.cpp:40
+msgid "Timers list:"
+msgstr ""
+
+#: input/dvb/krecord.cpp:61 input/dvb/krecord.cpp:88
+msgid "New"
+msgstr "新增"
+
+#: input/dvb/krecord.cpp:91
+msgid "Stop/Delete"
+msgstr "停止/刪除"
+
+#: input/dvb/krecord.cpp:232
+msgid ""
+"This timer is repeated. Do you want to skip the current job or delete the "
+"timer?"
+msgstr ""
+
+#: input/dvb/krecord.cpp:232
+msgid "Skip Current"
+msgstr "略過目前的"
+
+#: input/dvb/krecord.cpp:234
+msgid "Delete the selected timer?"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Downloading... "
+msgstr "下載中..."
+
+#: input/dvb/dvbconfig.cpp:247
+msgid "Copying data files..."
+msgstr "正在複製資料檔..."
+
+#: input/dvb/dvbconfig.cpp:478
+msgid "DVB Settings"
+msgstr "DVB 設定"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "DVB Device"
+msgstr "DVB 裝置"
+
+#: input/dvb/dvbconfig.cpp:497
+msgid "Device Settings"
+msgstr "裝置設定"
+
+#: input/dvb/dvbconfig.cpp:504
+msgid "<qt><b>Name:</b></qt>"
+msgstr "<qt><b>名稱:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:510
+msgid "<qt><b>Type:</b></qt>"
+msgstr "<qt><b>類型:</b></qt>"
+
+#: input/dvb/dvbconfig.cpp:514
+msgid "Cable"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:515
+msgid "Terrestrial"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:516
+#, fuzzy
+msgid "Satellite"
+msgstr "儲存播放清單"
+
+#: input/dvb/dvbconfig.cpp:517
+#, fuzzy
+msgid "Atsc"
+msgstr "藝人"
+
+#: input/disc/cddb.cpp:334 input/disc/disc.cpp:512 input/disc/disc.cpp:513
+#: input/dvb/dvbconfig.cpp:518
+msgid "Unknown"
+msgstr "未知"
+
+#: input/dvb/dvbconfig.cpp:524
+msgid "Number of LNBs:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:531
+msgid "1st sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:539 input/dvb/dvbconfig.cpp:553
+#: input/dvb/dvbconfig.cpp:567
+msgid "LNB Settings..."
+msgstr "LNB 設定..."
+
+#: input/dvb/dvbconfig.cpp:545
+msgid "2nd sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:559
+msgid "3rd sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:573
+msgid "4th sat:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:581
+msgid "LNB settings..."
+msgstr "LNB 設定..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 57
+#: input/dvb/dvbconfig.cpp:590 rc.cpp:222
+#, no-c-format
+msgid "Source:"
+msgstr "來源:"
+
+#: input/dvb/dvbconfig.cpp:601
+msgid ""
+"<qt>This device seems to support the <b><i>autoscan</i></b> "
+"feature. You can choose <b>AUTO</b> in Source list to let Kaffeine search for a "
+"range of frequencies."
+"<br>If <b><i>autoscan</i></b> fails to find your channels, choose a real Source "
+"in list.</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:609
+msgid ""
+"<qt><i>If you can't find your network/location in the list, you'll have to "
+"create one. Look in $HOME/.kde/share/apps/kaffeine/dvb-x/ and take an existing "
+"file as start point. Fill in with the values for your network/location and give "
+"it a sensible name (follow the naming convention). If you think your new file "
+"could be usefull for others, send it to kaffeine-user(AT)lists.sf.net.</i></qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:620
+msgid "DVB Recording Options"
+msgstr "DNB 錄影選項"
+
+#: input/dvb/dvbconfig.cpp:626
+msgid "Records directory:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:635 pref.cpp:116
+msgid "Time shifting directory:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:644
+msgid "Begin margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:649 input/dvb/dvbconfig.cpp:658
+#: input/dvb/dvbconfig.cpp:667
+msgid "(minutes)"
+msgstr " (分鐘)"
+
+#: input/dvb/dvbconfig.cpp:653
+msgid "End margin:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:662
+msgid "Instant record duration:"
+msgstr "快速錄影持續時間:"
+
+#: input/dvb/dvbconfig.cpp:671
+msgid "Preferred format:"
+msgstr "想要的格式:"
+
+#: input/dvb/dvbconfig.cpp:693
+msgid "DVB Broadcasting"
+msgstr "DVB 廣播"
+
+#: input/dvb/dvbconfig.cpp:699 pref.cpp:103
+msgid "Broadcast address:"
+msgstr "廣播位址:"
+
+#: input/dvb/dvbconfig.cpp:703 pref.cpp:107
+msgid "Broadcast port:"
+msgstr "廣播通訊埠:"
+
+#: input/dvb/dvbconfig.cpp:707 pref.cpp:111
+msgid "Info port:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:719 pref.cpp:130
+msgid "Misc"
+msgstr "其他"
+
+#: input/dvb/dvbconfig.cpp:725
+msgid "Default charset (restart needed):"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:736
+msgid "Update scan data:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:739
+msgid "Download"
+msgstr "Download"
+
+#: input/dvb/dvbconfig.cpp:742
+msgid ""
+"Dump epg's events to \n"
+"~/kaffeine_dvb_events.tx:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:745
+msgid "Dump"
+msgstr "Dump"
+
+#: input/dvb/dvbconfig.cpp:752
+#, fuzzy
+msgid "DVB plugins"
+msgstr "DVB 用戶端"
+
+#: input/dvb/dvbconfig.cpp:806
+msgid ""
+"<qt>Can't get DVB data from http://hftom.free.fr/kaxtv/dvbdata.tar.gz!"
+"<br>\t\t\tCheck your internet connection, and say Yes to try again."
+"<br>\t\t\tOr say No to cancel."
+"<br> Should I try again?</qt>"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:877
+msgid "Invalid records directory."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:882
+msgid "Invalid time shifting directory."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:887
+msgid "Broadcast and Info ports must be different."
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:892
+msgid "Invalid broadcast address."
+msgstr "無效的廣播位址。"
+
+#: input/dvb/dvbconfig.cpp:957
+msgid "LNB Settings"
+msgstr "LNB 設定"
+
+#: input/dvb/dvbconfig.cpp:967
+msgid "Universal LNB"
+msgstr "通用 LNB"
+
+#: input/dvb/dvbconfig.cpp:970
+msgid "C-Band LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:973
+msgid "C-Band Multipoint LNB"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:980
+msgid "Dual LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:981
+msgid "Single LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:982
+msgid "H/V LO"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984
+msgid "Dual LO switch frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:984 input/dvb/dvbconfig.cpp:988
+#: input/dvb/dvbconfig.cpp:992 input/dvb/dvbconfig.cpp:996
+#: input/dvb/dvbconfig.cpp:1000 input/dvb/dvbconfig.cpp:1004
+msgid " (MHz)"
+msgstr " (MHz)"
+
+#: input/dvb/dvbconfig.cpp:988
+msgid "Lo-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:992
+msgid "Hi-band frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:996
+msgid "Single LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1000
+msgid "Vertical pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/dvbconfig.cpp:1004
+msgid "Horizontal pol. LO frequency:"
+msgstr ""
+
+#: input/dvb/broadcasteditor.cpp:39
+msgid "Reset"
+msgstr "重設"
+
+#: input/dvb/ts2rtp.cpp:113
+msgid "Can't open DVB broadcast socket."
+msgstr ""
+
+#: input/dvb/ts2rtp.cpp:125
+msgid "Can't init DVB broadcast socket."
+msgstr ""
+
+#: input/disc/paranoia.cpp:266
+msgid "No audio encoders could be found."
+msgstr "找不到音訊編碼器。"
+
+#: input/disc/paranoia.cpp:310 input/disc/paranoia.cpp:317
+msgid "Loading of encoder '%1' failed."
+msgstr "載入編碼器 %1 失敗。"
+
+#: input/disc/paranoia.cpp:346
+msgid "Unable to create folder: "
+msgstr "無法建立資料夾:"
+
+#: input/disc/paranoia.cpp:559
+msgid "MB"
+msgstr "MB"
+
+#: input/disc/paranoia.cpp:560
+msgid "KB"
+msgstr "KB"
+
+#: input/disc/paranoia.cpp:561
+msgid "Bytes"
+msgstr "位元組"
+
+#: input/disc/disc.cpp:51 input/disc/disc.cpp:439 kaffeine.cpp:188
+msgid "Audio CD"
+msgstr "音樂光碟"
+
+#: input/disc/disc.cpp:108 input/disc/disc.cpp:112
+msgid "Play CD"
+msgstr "播放 CD"
+
+#: input/disc/disc.cpp:114 input/disc/disc.cpp:118
+msgid "Rip CD"
+msgstr "擷取 CD"
+
+#: input/disc/disc.cpp:132
+msgid "Artist:"
+msgstr "藝人:"
+
+#: input/disc/disc.cpp:140
+msgid "Album:"
+msgstr "專輯:"
+
+#: input/audiobrowser/playlist.cpp:357 input/audiobrowser/urllistview.cpp:68
+#: input/audiobrowser/urllistview.cpp:193 input/disc/disc.cpp:151
+#: input/disc/disc.cpp:515 input/disc/disc.cpp:518
+#: player-parts/gstreamer-part/gstreamer_part.cpp:442
+#: player-parts/gstreamer-part/gstreamer_part.cpp:673
+#: player-parts/xine-part/xine_part.cpp:1170
+msgid "Track"
+msgstr "音軌"
+
+#: input/disc/disc.cpp:165
+msgid "Select the tracks you want to rip and click the <b>Encode</b> button."
+msgstr "選擇您要擷取的音軌並按下 <b>編碼</b> 按鈕。"
+
+#: input/disc/disc.cpp:169
+msgid "Encode..."
+msgstr "編碼..."
+
+#: input/disc/disc.cpp:209
+msgid "Audio CD encoding"
+msgstr "音樂 CD 編碼"
+
+#: input/disc/disc.cpp:212
+msgid "Play Audio CD"
+msgstr "播放音樂 CD"
+
+#: input/disc/disc.cpp:215
+msgid "Play DVD"
+msgstr "播放 DVD"
+
+#: input/disc/disc.cpp:218
+msgid "Play VCD"
+msgstr "播放 VCD"
+
+#: input/disc/disc.cpp:286
+msgid "Open &DVD"
+msgstr "開啟 &DVD"
+
+#: input/disc/disc.cpp:287
+msgid "Open &VCD"
+msgstr "開啟 &VCD"
+
+#: input/disc/disc.cpp:288
+msgid "Open &Audio-CD"
+msgstr "開啟音樂 CD(&A)"
+
+#: input/disc/disc.cpp:340
+msgid "You must select the tracks to rip."
+msgstr "您必須先選擇要擷取的音軌。"
+
+#: input/disc/disc.cpp:439
+msgid "Several Audio CD found. Choose one:"
+msgstr "找到許多音樂光碟。請選擇:"
+
+#: input/disc/disc.cpp:539
+msgid "No audio CD found."
+msgstr "找不到音樂光碟。"
+
+#: input/disc/disc.cpp:576
+msgid "DVD Video"
+msgstr "視訊 DVD"
+
+#: input/disc/disc.cpp:576
+msgid "Several DVD Video found. Choose one:"
+msgstr "找到許多視訊 DVD 。請選擇:"
+
+#: input/disc/disc.cpp:632
+msgid "VCD-SVCD"
+msgstr "VCD-SVCD"
+
+#: input/disc/disc.cpp:632
+msgid "Several (S)VCD found. Choose one:"
+msgstr "找到許多 (S)VCD。請選擇:"
+
+#: input/disc/cddb.cpp:330
+msgid "No Title"
+msgstr "無標題"
+
+#: input/disc/cddb.cpp:342
+#, c-format
+msgid "Track %1"
+msgstr "第 %1 音軌"
+
+#: input/disc/cddb.cpp:427
+msgid "Searching local cddb entry ..."
+msgstr "搜尋本地 CDDB 項目..."
+
+#: input/disc/cddb.cpp:452
+msgid "Searching remote cddb entry ..."
+msgstr "搜尋遠端 CDDB 項目..."
+
+#: input/disc/cddb.cpp:476
+msgid "Found exact match cddb entry ..."
+msgstr "找到完全符合的 CDDB 項目..."
+
+#: input/disc/cddb.cpp:534
+msgid "Found close cddb entry ..."
+msgstr "找到最接近的 CDDB 項目..."
+
+#: input/disc/cddb.cpp:557
+msgid "CDDB Matches"
+msgstr ""
+
+#: input/disc/cddb.cpp:557
+#, fuzzy
+msgid "Several close CDDB entries found. Choose one:"
+msgstr "找到許多視訊 DVD 。請選擇:"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:92
+msgid "KaffeineMp3Lame"
+msgstr "KaffeineMp3Lame"
+
+#: input/disc/plugins/mp3lame/klameenc.cpp:93
+msgid "A Lame mp3 encoder plugin for Kaffeine."
+msgstr "Kaffeine 的 Lame mp3 編碼器外掛。"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:72
+msgid "KaffeineOggVorbis"
+msgstr "KaffeineOggVorbis"
+
+#: input/disc/plugins/oggvorbis/koggenc.cpp:73
+msgid "A Ogg Vorbis encoder plugin for Kaffeine."
+msgstr "Kaffeine 的 Ogg Vorbis 編碼器外掛。"
+
+#: input/dvbclient/cddump.cpp:191 input/dvbclient/cddump.cpp:202
+#: input/dvbclient/cddump.cpp:209 input/dvbclient/cdlisten.cpp:69
+#: input/dvbclient/cdlisten.cpp:80 input/dvbclient/cdwidget.cpp:85 pref.cpp:93
+msgid "DVB Client"
+msgstr "DVB 用戶端"
+
+#: input/dvbclient/cdlisten.cpp:69
+msgid "Can't open info socket."
+msgstr ""
+
+#: input/dvbclient/cdlisten.cpp:80
+msgid "Can't bind info socket!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:191
+msgid "Can't open socket."
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:202
+msgid "Can't set socket option!!!"
+msgstr ""
+
+#: input/dvbclient/cddump.cpp:209
+msgid "Can't bind socket!!!"
+msgstr ""
+
+#: input/audiobrowser/googlefetcherdialog.cpp:61
+msgid "All Sizes"
+msgstr "所有大小"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:62
+msgid "Very Small"
+msgstr "很小"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:63
+msgid "Small"
+msgstr "小"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:64
+msgid "Medium"
+msgstr "中等"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:65
+msgid "Large"
+msgstr "大"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:66
+msgid "Very Large"
+msgstr "很大"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:73
+msgid "New Search"
+msgstr "新的搜尋"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:123
+msgid "The cover you have selected is unavailable. Please select another."
+msgstr "您選擇的封面無法使用。請選擇另一個。"
+
+#: input/audiobrowser/googlefetcherdialog.cpp:124
+msgid "Cover Unavailable"
+msgstr "沒有封面"
+
+#: input/audiobrowser/googlefetcher.cpp:263
+msgid "Cover Downloader"
+msgstr "封面下載程式"
+
+#: input/audiobrowser/googlefetcher.cpp:265
+msgid "No matching images found, please enter new search terms:"
+msgstr "沒有符合的圖片。請輸入新的搜尋條件:"
+
+#: input/audiobrowser/googlefetcher.cpp:266
+msgid "Enter new search terms:"
+msgstr "輸入新的搜尋字串:"
+
+#: input/audiobrowser/urllistview.cpp:44
+#: player-parts/dummy-part/dummy_part.cpp:121
+#: player-parts/gstreamer-part/gstreamer_part.cpp:821
+#: player-parts/xine-part/xine_part.cpp:1279
+msgid "Play"
+msgstr "播放"
+
+#: input/audiobrowser/urllistview.cpp:45
+msgid "Play Next/Add to Queue"
+msgstr "播放下一個/加入排程"
+
+#: input/audiobrowser/urllistview.cpp:51
+msgid "Select &All"
+msgstr "全選(&A)"
+
+#: input/audiobrowser/urllistview.cpp:52
+msgid "Create Playlist From Selected"
+msgstr "依選擇的檔案製作播放清單"
+
+#: input/audiobrowser/urllistview.cpp:54
+msgid "Add Sub&title..."
+msgstr "新增字幕(&T)..."
+
+#: input/audiobrowser/urllistview.cpp:56
+msgid "&Edit Title"
+msgstr "編輯曲目名稱(&E)"
+
+#: input/audiobrowser/urllistview.cpp:57
+msgid "&Info"
+msgstr "資訊(&I)"
+
+#: input/audiobrowser/playlist.cpp:358 input/audiobrowser/urllistview.cpp:61
+#: input/audiobrowser/urllistview.cpp:196
+#: player-parts/gstreamer-part/gstreamer_part.cpp:683
+#: player-parts/xine-part/xine_part.cpp:1176
+msgid "Length"
+msgstr "長度"
+
+#: input/audiobrowser/urllistview.cpp:190
+msgid "URL"
+msgstr "URL"
+
+#: input/audiobrowser/playlist.cpp:355 input/audiobrowser/urllistview.cpp:191
+#: player-parts/gstreamer-part/gstreamer_part.cpp:669
+#: player-parts/xine-part/xine_part.cpp:1166
+msgid "Artist"
+msgstr "藝人"
+
+#: input/audiobrowser/playlist.cpp:356 input/audiobrowser/urllistview.cpp:192
+#: player-parts/gstreamer-part/gstreamer_part.cpp:671
+#: player-parts/xine-part/xine_part.cpp:1168
+msgid "Album"
+msgstr "專輯"
+
+#: input/audiobrowser/urllistview.cpp:194
+#: player-parts/gstreamer-part/gstreamer_part.cpp:675
+#: player-parts/xine-part/xine_part.cpp:1172
+msgid "Year"
+msgstr "年份"
+
+#: input/audiobrowser/urllistview.cpp:195
+#: player-parts/gstreamer-part/gstreamer_part.cpp:677
+#: player-parts/xine-part/xine_part.cpp:1174
+msgid "Genre"
+msgstr "類型"
+
+#: input/audiobrowser/urllistview.cpp:199
+msgid "Subtitles"
+msgstr "字幕"
+
+#: input/audiobrowser/urllistview.cpp:205
+msgid "in use"
+msgstr "使用中"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:292
+msgid ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|Subtitle Files\n"
+"*.*|All Files"
+msgstr ""
+"*.smi *.srt *.sub *.txt *.ssa *.asc|字幕檔\n"
+"*.*|所有檔案"
+
+#: input/audiobrowser/playlist.cpp:1281 input/audiobrowser/urllistview.cpp:293
+msgid "Select Subtitle File"
+msgstr "選擇字幕檔案"
+
+#: input/audiobrowser/playlist.cpp:263
+msgid "Choose a Cover..."
+msgstr "選擇封面..."
+
+#: input/audiobrowser/playlist.cpp:264
+msgid "Gallery..."
+msgstr "收藏庫"
+
+#: input/audiobrowser/playlist.cpp:390 input/audiobrowser/playlist.cpp:2055
+msgid "Filter"
+msgstr "過濾器"
+
+#: input/audiobrowser/playlist.cpp:398
+#, fuzzy
+msgid "Playlist:"
+msgstr "播放清單"
+
+#: input/audiobrowser/playlist.cpp:406
+msgid ""
+"Select the active playlist. To change playlist name edit it and confirm with "
+"'Return'."
+msgstr "選擇使用的播放清單。要改變播放清單名稱,請編輯它並按下'Enter'確認。"
+
+#: input/audiobrowser/playlist.cpp:458
+msgid "Play Playlist"
+msgstr "開始播放清單"
+
+#: input/audiobrowser/playlist.cpp:486
+msgid "&Repeat"
+msgstr "重覆(&R)"
+
+#: input/audiobrowser/playlist.cpp:487
+msgid "Loop playlist"
+msgstr "重複播放清單"
+
+#: input/audiobrowser/playlist.cpp:488
+msgid "Sh&uffle"
+msgstr "隨機(&U)"
+
+#: input/audiobrowser/playlist.cpp:489
+msgid "Play items in random order"
+msgstr "以隨機的次序播放項目"
+
+#: input/audiobrowser/playlist.cpp:490
+msgid "Autodownload covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:491
+msgid "Automatic dowloading of covers"
+msgstr ""
+
+#: input/audiobrowser/playlist.cpp:492
+#, fuzzy
+msgid "&Clear Current Playlist"
+msgstr "移除目前的播放清單(&M)"
+
+#: input/audiobrowser/playlist.cpp:493
+msgid "Ne&w Playlist"
+msgstr "新增播放清單(&W)"
+
+#: input/audiobrowser/playlist.cpp:494
+msgid "&Import Playlist..."
+msgstr "匯入播放清單(&I)..."
+
+#: input/audiobrowser/playlist.cpp:495
+msgid "&Save Current Playlist As..."
+msgstr "另存目前的播放清單為(&S)..."
+
+#: input/audiobrowser/playlist.cpp:496
+msgid "Re&move Current Playlist"
+msgstr "移除目前的播放清單(&M)"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:539
+#: kaffeine.cpp:218
+msgid "Kaffeine Playlists"
+msgstr "Kaffeine 播放清單"
+
+#: input/audiobrowser/playlist.cpp:527 input/audiobrowser/playlist.cpp:542
+#: kaffeine.cpp:219
+msgid "All Files"
+msgstr "全部檔案"
+
+#: input/audiobrowser/playlist.cpp:527
+msgid "Open Playlist"
+msgstr "開啟播放清單"
+
+#: input/audiobrowser/playlist.cpp:540 kaffeine.cpp:216
+msgid "M3U Playlists"
+msgstr "M3U 播放清單"
+
+#: input/audiobrowser/playlist.cpp:541 kaffeine.cpp:217
+msgid "PLS Playlists"
+msgstr "PLS 播放清單"
+
+#: input/audiobrowser/playlist.cpp:542
+msgid "Save Playlist"
+msgstr "儲存播放清單"
+
+#: input/audiobrowser/playlist.cpp:602 input/audiobrowser/playlist.cpp:1767
+#: inputmanager.cpp:209 kaffeine.cpp:183
+msgid "Playlist"
+msgstr "播放清單"
+
+#: input/audiobrowser/playlist.cpp:605 input/audiobrowser/playlist.cpp:644
+#: kaffeine.cpp:1540
+msgid "NEW"
+msgstr "新增"
+
+#: input/audiobrowser/playlist.cpp:1004
+msgid "Importing media resources..."
+msgstr "匯入媒體資源..."
+
+#: input/audiobrowser/playlist.cpp:1270 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1295
+msgid "(no subtitles)"
+msgstr "(沒有字幕)"
+
+#: input/audiobrowser/playlist.cpp:1271 input/audiobrowser/playlist.cpp:1277
+#: input/audiobrowser/playlist.cpp:1279 input/audiobrowser/playlist.cpp:1296
+msgid "Other subtitle..."
+msgstr "其他的字幕..."
+
+#: input/audiobrowser/playlist.cpp:1588
+msgid "Gallery"
+msgstr "收藏庫"
+
+#: input/audiobrowser/playlist.cpp:1751
+msgid "Queue: %1 Entries, Playtime: %2"
+msgstr "排程: %1 個項目,播放時間: %2"
+
+#: input/audiobrowser/playlist.cpp:1758
+msgid "Entries: %1, Playtime: %2"
+msgstr "項目:%1,播放時間:%2"
+
+#: input/audiobrowser/playlist.cpp:1863
+msgid "Remove '%1' from list and from disk?"
+msgstr "將 '%1' 從清單與硬碟中刪除?"
+
+#: input/audiobrowser/playlist.cpp:1888
+msgid "Playlist Name Already Exists"
+msgstr "播放清單名稱已存在"
+
+#: input/audiobrowser/playlist.cpp:1889
+msgid "Enter different playlist name:"
+msgstr "請輸入不同的播放清單名稱:"
+
+#: input/audiobrowser/playlist.cpp:2294
+#: player-parts/xine-part/xine_part.cpp:1330
+msgid "Select Subtitle"
+msgstr "選擇字幕"
+
+#: input/audiobrowser/playlist.cpp:2298
+msgid "Media file:"
+msgstr "媒體檔案:"
+
+#: input/audiobrowser/playlist.cpp:2315
+msgid "Select Movie"
+msgstr "選擇電影"
+
+#: input/audiobrowser/playlist.cpp:2319
+msgid "Subtitle file:"
+msgstr "字幕檔案:"
+
+#: systemtray.cpp:60
+msgid "Play / Pause"
+msgstr "播放/暫停"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:824
+#: player-parts/xine-part/xine_part.cpp:1281 systemtray.cpp:61
+msgid "&Next"
+msgstr "下一個(&N)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:837
+#: player-parts/xine-part/xine_part.cpp:1307 systemtray.cpp:64
+msgid "&Mute"
+msgstr "靜音(&M)"
+
+#: main.cpp:72 player-parts/xine-part/xine_part.cpp:1215 systemtray.cpp:79
+msgid "Kaffeine Player"
+msgstr "Kaffeine 播放程式"
+
+#: startwindow.cpp:85
+msgid "[Kaffeine Player]"
+msgstr "[Kaffeine 播放程式]"
+
+#: _translatorinfo.cpp:1
+msgid ""
+"_: NAME OF TRANSLATORS\n"
+"Your names"
+msgstr "余俊霆, 謝侑呈"
+
+#: _translatorinfo.cpp:3
+msgid ""
+"_: EMAIL OF TRANSLATORS\n"
+"Your emails"
+msgstr "u900002@apple.cmc.edu.tw, yochenhsieh@xuite.net"
+
+#: main.cpp:73
+msgid ""
+"A media player for KDE 3. Can use multiple backends for playback, default (and "
+"recommended) is xine."
+msgstr "KDE3 的媒體播放程式。可以使用多種後端播放,預設 (建議的) 是 xine。"
+
+#: main.cpp:74
+msgid "(c) 2003-2005, The Kaffeine Authors"
+msgstr "(c) 2003-2005, The Kaffeine Authors"
+
+#: main.cpp:77
+msgid "Current maintainer"
+msgstr "目前維護者"
+
+#: main.cpp:78
+msgid "Original author"
+msgstr "原始作者"
+
+#: main.cpp:82
+msgid "CICAM support."
+msgstr ""
+
+#: main.cpp:83
+msgid "Various valuable patches."
+msgstr ""
+
+#: main.cpp:84
+msgid "DVB OSD browsing patch."
+msgstr ""
+
+#: main.cpp:85
+msgid "DVB categories patches."
+msgstr ""
+
+#: main.cpp:86
+msgid "Logo for Kaffeine 0.8 and other artwork."
+msgstr "Kaffeine 0.8 的標誌與其他美術設計。"
+
+#: main.cpp:87
+msgid "Logo animation for Kaffeine 0.5"
+msgstr "Kaffeine 0.5 的動畫標誌"
+
+#: main.cpp:88
+msgid "Alternate encoding for meta tags. Many patches."
+msgstr ""
+
+#: main.cpp:89
+msgid "xine post plugin handling. Many patches."
+msgstr ""
+
+#: main.cpp:90
+msgid "Subtitle file import."
+msgstr "匯入字幕檔案。"
+
+#: main.cpp:91
+msgid "M3U import. Testing."
+msgstr "匯入 M3U 。測試中。"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 16
+#: rc.cpp:3
+#, no-c-format
+msgid "Subtitle PIDs Editor"
+msgstr "字幕 PIDs 編輯器"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 84
+#: rc.cpp:9
+#, no-c-format
+msgid "Subtitle PIDs"
+msgstr "字幕 PIDs"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 93
+#: rc.cpp:12 rc.cpp:94 rc.cpp:133 rc.cpp:141
+#, no-c-format
+msgid "New Item"
+msgstr "新增項目"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 131
+#: rc.cpp:15 rc.cpp:97
+#, no-c-format
+msgid "Move Up"
+msgstr "上移"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 139
+#: rc.cpp:18 rc.cpp:100
+#, no-c-format
+msgid "Move Down"
+msgstr "下移"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 209
+#: rc.cpp:24 rc.cpp:106
+#, no-c-format
+msgid "<< Update Selected"
+msgstr "<< 更新選擇的"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 217
+#: rc.cpp:27 rc.cpp:109
+#, no-c-format
+msgid "<< New"
+msgstr "<< 新的"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 246
+#: rc.cpp:33 rc.cpp:115
+#, no-c-format
+msgid "Pid:"
+msgstr "Pid:"
+
+#. i18n: file ./input/dvb/subeditorui.ui line 254
+#: rc.cpp:36
+#, no-c-format
+msgid "Page:"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 262
+#: rc.cpp:39
+#, no-c-format
+msgid "Sub page:"
+msgstr ""
+
+#. i18n: file ./input/dvb/subeditorui.ui line 270
+#: rc.cpp:42 rc.cpp:118
+#, no-c-format
+msgid "Lang:"
+msgstr " 語言:"
+
+#. i18n: file ./input/dvb/crontimerui.ui line 16
+#: rc.cpp:45
+#, no-c-format
+msgid "Repeated Timer"
+msgstr ""
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 16
+#: rc.cpp:88
+#, no-c-format
+msgid "Audio PIDs editor"
+msgstr "音訊 PIDs 編輯器"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 43
+#: rc.cpp:91
+#, no-c-format
+msgid "Audio PIDs"
+msgstr "音訊 PIDs"
+
+#. i18n: file ./input/dvb/audioeditorui.ui line 221
+#: rc.cpp:121
+#, no-c-format
+msgid "AC3"
+msgstr "AC3"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 16
+#: rc.cpp:127
+#, no-c-format
+msgid "Broadcasting Editor"
+msgstr "廣播編輯器"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 75
+#: rc.cpp:130
+#, no-c-format
+msgid "Available channels:"
+msgstr "可用的頻道:"
+
+#. i18n: file ./input/dvb/broadcasteditorui.ui line 181
+#: rc.cpp:138
+#, no-c-format
+msgid "Broadcasting list:"
+msgstr "廣播清單:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 54
+#: rc.cpp:152
+#, no-c-format
+msgid "(Right click to edit/delete)"
+msgstr "(按下右鍵以編輯/刪除)"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 81
+#: rc.cpp:158
+#, no-c-format
+msgid "New..."
+msgstr "新增..."
+
+#. i18n: file ./input/dvb/scandialogui.ui line 124
+#: rc.cpp:164
+#, no-c-format
+msgid "Search On"
+msgstr "搜尋於"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 140
+#: rc.cpp:167
+#, no-c-format
+msgid "Offset (KHz)"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 151
+#: rc.cpp:170
+#, no-c-format
+msgid "0"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 162
+#: rc.cpp:173
+#, no-c-format
+msgid "+167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 170
+#: rc.cpp:176
+#, no-c-format
+msgid "-167"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 190
+#: rc.cpp:179
+#, no-c-format
+msgid "Start Scan"
+msgstr "開始掃描"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 251
+#: rc.cpp:183
+#, no-c-format
+msgid "Filters"
+msgstr "過濾器"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 270
+#: rc.cpp:186
+#, no-c-format
+msgid "Free to air"
+msgstr ""
+
+#. i18n: file ./input/dvb/scandialogui.ui line 318
+#: rc.cpp:195
+#, no-c-format
+msgid "Provider:"
+msgstr "提供者:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 349
+#: rc.cpp:198
+#, no-c-format
+msgid "<< Add Selected"
+msgstr "<< 新增選擇的"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 365
+#: rc.cpp:201
+#, no-c-format
+msgid "<< Add Filtered"
+msgstr " << 新增過濾的 "
+
+#. i18n: file ./input/dvb/scandialogui.ui line 377
+#: instwizard.cpp:180 rc.cpp:204
+#, no-c-format
+msgid "Found"
+msgstr "找到"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 386
+#: rc.cpp:207
+#, fuzzy, no-c-format
+msgid "SNR"
+msgstr "SNR:"
+
+#. i18n: file ./input/dvb/scandialogui.ui line 458
+#: rc.cpp:213
+#, no-c-format
+msgid "Done"
+msgstr "完成"
+
+#. i18n: file ./input/dvb/kaffeinedvb.rc line 4
+#: player-parts/gstreamer-part/gstreamer_part.cpp:841
+#: player-parts/xine-part/xine_part.cpp:1316 rc.cpp:216
+#, no-c-format
+msgid "&DVB"
+msgstr "&DVB"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 16
+#: rc.cpp:219
+#, no-c-format
+msgid "Channel Editor"
+msgstr "頻道編輯器"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 126
+#: rc.cpp:228
+#, no-c-format
+msgid "Nr:"
+msgstr "Nr:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 163
+#: rc.cpp:232
+#, no-c-format
+msgid "Polarity"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 200
+#: rc.cpp:241
+#, no-c-format
+msgid "Frequency:"
+msgstr "頻率:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 216
+#: rc.cpp:244
+#, no-c-format
+msgid "Symbol rate:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 246
+#: rc.cpp:247
+#, no-c-format
+msgid "Scrambled"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 283
+#: rc.cpp:251
+#, no-c-format
+msgid "Teletext PID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 313
+#: rc.cpp:254
+#, no-c-format
+msgid "Service ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 337
+#: rc.cpp:257
+#, no-c-format
+msgid "Video PID:"
+msgstr "視訊 PID:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 375
+#: rc.cpp:260
+#, no-c-format
+msgid "Transport stream ID:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 385
+#: rc.cpp:263
+#, no-c-format
+msgid "Subtitle PIDs..."
+msgstr "字幕 PIDs..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 396
+#: rc.cpp:266
+#, no-c-format
+msgid "Audio PIDs..."
+msgstr "音訊 PIDs..."
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 432
+#: rc.cpp:270
+#, no-c-format
+msgid "Bandwidth:"
+msgstr "頻寬:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 448
+#: rc.cpp:273
+#, no-c-format
+msgid "FEC high:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 464
+#: rc.cpp:276
+#, no-c-format
+msgid "Transmission:"
+msgstr "傳送:"
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 495
+#: rc.cpp:279
+#, no-c-format
+msgid "FEC low:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 516
+#: rc.cpp:282
+#, no-c-format
+msgid "Guard interval:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 537
+#: rc.cpp:285
+#, no-c-format
+msgid "Hierarchy:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 553
+#: rc.cpp:288
+#, no-c-format
+msgid "Modulation:"
+msgstr ""
+
+#. i18n: file ./input/dvb/channeleditorui.ui line 579
+#: rc.cpp:291
+#, no-c-format
+msgid "Inversion:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 16
+#: rc.cpp:300
+#, no-c-format
+msgid "Encoding Preferences"
+msgstr "編碼設定"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 38
+#: rc.cpp:303
+#, no-c-format
+msgid "Encoder:"
+msgstr "編碼器:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 56
+#: rc.cpp:306
+#, no-c-format
+msgid "Base directory:"
+msgstr "主目錄:"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 73
+#: rc.cpp:309
+#, no-c-format
+msgid "..."
+msgstr "..."
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 99
+#: rc.cpp:312
+#, no-c-format
+msgid "Paranoia:"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 116
+#: rc.cpp:315
+#, no-c-format
+msgid "Disable all checking"
+msgstr "關閉所有檢查"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 124
+#: rc.cpp:318
+#, no-c-format
+msgid "Normal mode"
+msgstr "正常模式"
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 132
+#: rc.cpp:321
+#, no-c-format
+msgid "Paranoia mode"
+msgstr ""
+
+#. i18n: file ./input/disc/paranoiasettings.ui line 153
+#: rc.cpp:325
+#, no-c-format
+msgid "Normalize"
+msgstr ""
+
+#. i18n: file ./input/disc/kaffeinedisc.rc line 12
+#: rc.cpp:336
+#, no-c-format
+msgid "CD Toolbar"
+msgstr "Cd 工具列"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 16
+#: rc.cpp:339
+#, no-c-format
+msgid "Lame mp3 options"
+msgstr "Lame mp3 選項"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 49
+#: rc.cpp:343
+#, no-c-format
+msgid "VBR"
+msgstr "VBR"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 73
+#: rc.cpp:346
+#, no-c-format
+msgid "Bitrate:"
+msgstr "位元率:"
+
+#. i18n: file ./input/disc/plugins/mp3lame/lameconfig.ui line 94
+#: rc.cpp:349
+#, no-c-format
+msgid "Kb/s"
+msgstr "Kb/s"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 16
+#: rc.cpp:360
+#, no-c-format
+msgid "Ogg Vorbis Options"
+msgstr "Ogg Vorbis 選項"
+
+#. i18n: file ./input/disc/plugins/oggvorbis/oggconfig.ui line 86
+#: rc.cpp:364
+#, no-c-format
+msgid "Quality :"
+msgstr "品質:"
+
+#. i18n: file ./input/audiobrowser/kaffeineplaylist.rc line 4
+#: rc.cpp:375
+#, no-c-format
+msgid "Play&list"
+msgstr "播放清單(&L)"
+
+#. i18n: file ./kaffeineui.rc line 12
+#: rc.cpp:381
+#, no-c-format
+msgid "Quit Options"
+msgstr "退出選項"
+
+#. i18n: file ./kaffeineui.rc line 19
+#: rc.cpp:384 rc.cpp:402 rc.cpp:450 rc.cpp:468
+#, no-c-format
+msgid "&Player"
+msgstr "播放程式(&P)"
+
+#. i18n: file ./kaffeineui.rc line 26
+#: rc.cpp:390
+#, no-c-format
+msgid "Enable Auto &Resize"
+msgstr "啟用自動調整大小(&R)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 5
+#: rc.cpp:399
+#, no-c-format
+msgid "&Network Broadcasting"
+msgstr "網路廣播(&N)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 24
+#: rc.cpp:405 rc.cpp:411 rc.cpp:441
+#, no-c-format
+msgid "&Navigation"
+msgstr "導覽(&N)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 33
+#: rc.cpp:408 rc.cpp:444
+#, no-c-format
+msgid "&DVD"
+msgstr "&DVD"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 41
+#: rc.cpp:414 rc.cpp:447
+#, no-c-format
+msgid "&DVD Menus"
+msgstr "&DVD 選單"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 56
+#: player-parts/xine-part/xine_part.cpp:1337 rc.cpp:417
+#, no-c-format
+msgid "&Audio"
+msgstr "音效(&A)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 64
+#: rc.cpp:420
+#, no-c-format
+msgid "&Video"
+msgstr "影像(&V)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 66
+#: rc.cpp:423 rc.cpp:453 rc.cpp:465
+#, no-c-format
+msgid "&Aspect Ratio"
+msgstr "畫面比例(&A)"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 96
+#: rc.cpp:429
+#, no-c-format
+msgid "Screenshot Toolbar"
+msgstr "抓圖工具列"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 99
+#: rc.cpp:432 rc.cpp:456
+#, no-c-format
+msgid "Controls Toolbar"
+msgstr "控制工具列"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 108
+#: rc.cpp:435 rc.cpp:459
+#, no-c-format
+msgid "Volume Toolbar"
+msgstr "音量工具列"
+
+#. i18n: file ./player-parts/xine-part/xine_part.rc line 112
+#: rc.cpp:438 rc.cpp:462
+#, no-c-format
+msgid "Position Toolbar"
+msgstr "位置工具列"
+
+#: pref.cpp:46
+msgid "Kaffeine Setup"
+msgstr "Kaffeine 設定"
+
+#: pref.cpp:57
+msgid "Behavior"
+msgstr "行為"
+
+#: pref.cpp:62
+#, fuzzy
+msgid "Pause video when window is minimized"
+msgstr "隱藏時暫停影片"
+
+#: pref.cpp:75
+msgid "Embed in system tray"
+msgstr "出現在系統列"
+
+#: pref.cpp:81
+msgid " sec"
+msgstr " 秒"
+
+#: player-parts/xine-part/kxinewidget.cpp:376
+#: player-parts/xine-part/xine_part.cpp:702 pref.cpp:82
+msgid "off"
+msgstr "關閉"
+
+#: pref.cpp:84
+msgid "Duration of title announcement in system tray"
+msgstr ""
+
+#: pref.cpp:96
+msgid "Enable DVB client"
+msgstr "啟用 DVB 用戶端"
+
+#: pref.cpp:130
+msgid "Miscellaneous Options"
+msgstr "其他選項"
+
+#: pref.cpp:135
+msgid "Use alternate (non-Unicode) encoding for Meta tags"
+msgstr ""
+
+#: pref.cpp:155
+msgid ""
+"Choose alternate encoding name for Meta tags\n"
+"(in order to convert to Unicode)"
+msgstr ""
+
+#: pref.cpp:167
+msgid "Clear recent files list"
+msgstr "清除最近的檔案清單"
+
+#: kaffeine.cpp:98
+msgid "Start playing immediately"
+msgstr "立即開始播放"
+
+#: kaffeine.cpp:100
+msgid "Start in fullscreen mode"
+msgstr "以全螢幕模式開啟"
+
+#: kaffeine.cpp:102
+msgid "Set audio driver"
+msgstr "設定音效驅動程式"
+
+#: kaffeine.cpp:104
+msgid "Set video driver"
+msgstr "設定影像驅動程式"
+
+#: kaffeine.cpp:106
+msgid "Set Audio-CD/VCD/DVD device path."
+msgstr "設定音樂CD/VCD/DVD裝置路徑。"
+
+#: kaffeine.cpp:107
+msgid "Output xine debug messages"
+msgstr "輸出xine除錯訊息"
+
+#: kaffeine.cpp:109
+msgid "Run installation wizard"
+msgstr "執行安裝精靈"
+
+#: kaffeine.cpp:110
+msgid ""
+"File(s) to play. Can be a local file, a URL, a directory or 'DVD', 'VCD', "
+"'AudioCD'."
+msgstr "播放的檔案。可以是本地的檔案,網址,目錄或 'DVD', 'VCD', '音樂光碟'。"
+
+#: kaffeine.cpp:175
+msgid "Start"
+msgstr "開始"
+
+#: kaffeine.cpp:179
+msgid "Player Window"
+msgstr "播放器視窗"
+
+#: kaffeine.cpp:205
+msgid "Supported Media Formats"
+msgstr "支援的媒體格式"
+
+#: kaffeine.cpp:206
+msgid "MPEG Audio Files"
+msgstr "MPEG 音效檔"
+
+#: kaffeine.cpp:207
+msgid "MPEG Video Files"
+msgstr "MPEG 視訊檔"
+
+#: kaffeine.cpp:208
+msgid "Ogg Vorbis Files"
+msgstr "Ogg Vorbis 檔"
+
+#: kaffeine.cpp:209
+msgid "AVI Files"
+msgstr "AVI 檔案"
+
+#: kaffeine.cpp:210
+msgid "Quicktime Files"
+msgstr "Quicktime 檔案"
+
+#: kaffeine.cpp:211
+msgid "Real Media Files"
+msgstr "Real Media 檔案"
+
+#: kaffeine.cpp:212
+msgid "Matroska Files"
+msgstr "Matroska 檔案"
+
+#: kaffeine.cpp:213
+msgid "FLAC Files"
+msgstr "FLAC 檔案"
+
+#: kaffeine.cpp:214
+msgid "Windows Media Files"
+msgstr "Windows Media 檔案"
+
+#: kaffeine.cpp:215
+msgid "WAV Files"
+msgstr "WAV 檔案"
+
+#: kaffeine.cpp:351 kaffeine.cpp:374 kaffeine.cpp:442 kaffeine.cpp:485
+msgid "Loading of player part '%1' failed."
+msgstr ""
+
+#: kaffeine.cpp:351
+msgid "%1 not found in search path."
+msgstr "搜尋路徑中找不到 %1。"
+
+#: kaffeine.cpp:698
+msgid "Open &URL..."
+msgstr "開啟 &URL..."
+
+#: kaffeine.cpp:699
+msgid "Open D&irectory..."
+msgstr "開啟目錄 (&I)..."
+
+#: kaffeine.cpp:701
+msgid "Quit && Shutoff Monitor After This Track"
+msgstr ""
+
+#: kaffeine.cpp:702
+msgid "Quit After This Track"
+msgstr "播完這個曲目後退出"
+
+#: kaffeine.cpp:703
+msgid "Quit After Playlist"
+msgstr "播完播放清單後退出"
+
+#: kaffeine.cpp:708
+msgid "&Minimal Mode"
+msgstr "最簡模式(&M)"
+
+#: kaffeine.cpp:709
+msgid "Toggle &Playlist/Player"
+msgstr "切換播放清單/播放器(&P)"
+
+#: kaffeine.cpp:710
+#, fuzzy
+msgid "Keep &Original Aspect"
+msgstr "保留原來的比例(&O)"
+
+#: kaffeine.cpp:712
+msgid "Original Size"
+msgstr "原始大小"
+
+#: kaffeine.cpp:713
+msgid "Double Size"
+msgstr "兩倍大小"
+
+#: kaffeine.cpp:714
+msgid "Triple Size"
+msgstr "三倍大小"
+
+#: kaffeine.cpp:716
+msgid "&Player Engine"
+msgstr "播放程式引擎(&P)"
+
+#: kaffeine.cpp:850 kaffeine.cpp:966
+msgid "DVB client"
+msgstr "DVB 用戶端"
+
+#: kaffeine.cpp:997 kaffeine.cpp:999
+msgid "Player"
+msgstr "播放程式"
+
+#: kaffeine.cpp:1000
+msgid "Main Window"
+msgstr "主視窗"
+
+#: kaffeine.cpp:1061
+msgid "DPMS Xserver extension was not found."
+msgstr "找不到 DPMS Xserver 延伸套件。"
+
+#: kaffeine.cpp:1068
+msgid ""
+"This will quit Kaffeine and shut off the monitor's power after the "
+"file/playlist has finished. Option \"dpms\" must be in your X config file for "
+"the monitor to power off."
+msgstr ""
+
+#: kaffeine.cpp:1139
+msgid "Open File(s)"
+msgstr "開啟檔案"
+
+#: kaffeine.cpp:1448
+msgid "Open URL"
+msgstr "開啟 URL"
+
+#: kaffeine.cpp:1448
+msgid "Enter a URL:"
+msgstr "輸入網址:"
+
+#: kaffeine.cpp:1466
+msgid "Open Folder"
+msgstr "開啟資料夾"
+
+#: kaffeine.cpp:1489
+msgid "No %1 in drive, or wrong path to device."
+msgstr ""
+
+#: kaffeine.cpp:1490
+msgid "Please select correct drive:"
+msgstr "請選擇正確的光碟機:"
+
+#: instwizard.cpp:52
+msgid "Kaffeine %1 Installation Wizard"
+msgstr "Kaffeine %1 安裝精靈"
+
+#: instwizard.cpp:58
+msgid "Installation Check"
+msgstr "安裝檢查"
+
+#: instwizard.cpp:69
+#, fuzzy
+msgid "Kaffeine-Xine"
+msgstr "Kaffeine 設定"
+
+#: instwizard.cpp:72 instwizard.cpp:80 instwizard.cpp:113 instwizard.cpp:143
+#: instwizard.cpp:153 instwizard.cpp:165 instwizard.cpp:186
+msgid "Ok."
+msgstr "Ok."
+
+#: instwizard.cpp:74
+msgid "Part not found. Please check your installation!"
+msgstr "沒有找到。請檢查您的安裝!"
+
+#: instwizard.cpp:78
+msgid "Found version"
+msgstr "找到版本"
+
+#: instwizard.cpp:82
+#, c-format
+msgid "Kaffeine requires KDE >= %1."
+msgstr "Kaffeine 需要 KDE >= %1。"
+
+#: instwizard.cpp:109
+msgid "WIN32 Codecs"
+msgstr "WIN32 Codecs"
+
+#: instwizard.cpp:115
+msgid ""
+"No WIN32 codecs found in /usr/lib/win32. You're not able to play Windows Media "
+"9 files, newer Real Media files and some less common formats. Download the "
+"codecs here:"
+msgstr ""
+"在 /usr/lib/win32 找不到 WIN32 codecs 。您將無法播放 Windows Media 9 檔案,較新的 Real Media "
+"檔案與其他少見的格式。在這裡下載 codecs :"
+
+#: instwizard.cpp:140
+msgid ""
+"libdvdcss not found. You're not able to play encrypted (most commercial) DVD's. "
+"You can get the library here (but using it may violate copyright regulations of "
+"your country!):"
+msgstr ""
+
+#: instwizard.cpp:146
+msgid "DVD Drive"
+msgstr "DVD 光碟機"
+
+#: instwizard.cpp:155
+msgid "DMA mode off! For smooth DVD playback run as root:"
+msgstr "DMA 模式關閉!為了順利播放 DVD 請以 root 執行:"
+
+#: instwizard.cpp:157
+msgid "Can't check DMA mode. Permission denied or no such device:"
+msgstr "無法檢查 DMA 模式。權限被拒或無此裝置:"
+
+#: instwizard.cpp:162
+msgid "DVB-Device"
+msgstr "DVB-裝置"
+
+#: instwizard.cpp:169
+msgid "No DVB-Devices found. The DVB related functions will be hidden."
+msgstr "找不到 DVB 裝置。 DVB 相關的功能將被隱藏。"
+
+#: instwizard.cpp:174
+msgid "Distribution"
+msgstr "發行版"
+
+#: instwizard.cpp:181
+msgid ""
+"The xine-lib shipped by SuSE \"may lack certain features because of legal "
+"requirements (potential patent violation)\". You should use the packages from "
+"here:"
+msgstr ""
+
+#: instwizard.cpp:189
+msgid "RESULT"
+msgstr "結果"
+
+#: instwizard.cpp:193
+msgid "Found some problems, but nevertheless Kaffeine may work."
+msgstr "找到一些問題,不過 Kaffeine 可能可以運作。"
+
+#: instwizard.cpp:197
+msgid "All ok!"
+msgstr "全部 ok!"
+
+#: instwizard.cpp:208
+msgid "Use Kaffeine as helper application for mms:// (Microsoft Media) streams"
+msgstr "使用 Kaffeine 為 mms:// (Microsoft Media) 協定的輔助程式"
+
+#: instwizard.cpp:212
+msgid ""
+"Use Kaffeine as helper application for rtsp:// (Real Media and others) streams"
+msgstr "使用 Kaffeine 為 rtsp:// (Real Media 與其他) 協定的輔助程式"
+
+#: instwizard.cpp:216
+msgid "Create a Kaffeine icon on desktop"
+msgstr "在桌面上建立 Kaffeine 圖示"
+
+#: instwizard.cpp:220
+msgid "Installation Options"
+msgstr "安裝選項"
+
+#: player-parts/xine-part/deinterlacequality.cpp:37
+msgid "Deinterlace Quality"
+msgstr "去交錯化品質"
+
+#: player-parts/xine-part/deinterlacequality.cpp:58
+msgid ""
+"<b>Very low cpu usage, worst quality.</b>"
+"<br>Half of vertical resolution is lost. For some systems (with PCI video "
+"cards) this might decrease the cpu usage when compared to plain video playback "
+"(no deinterlacing)."
+msgstr ""
+"<b>cpu 使用率很低,品質最差。</b>"
+"<br>一半的垂直解析度喪失。對於一些系統(使用 PCI 顯示卡)來說,當與單純播放影像(不使用去交錯化)比較時,這可能降低 cpu 使用率。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:61
+msgid ""
+"<b>Low cpu usage, poor quality.</b>"
+"<br>Image is blurred vertically so interlacing effects are removed."
+msgstr "<b>低 cpu 使用率,品質較差。</b><br>影像會在垂直方向模糊以便去除交錯效果。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:64
+msgid ""
+"<b>Medium cpu usage, medium quality.</b>"
+"<br>Image is analysed and areas showing interlacing artifacts are fixed "
+"(interpolated)."
+msgstr "<b>中度 cpu 使用率,中等品質。</b><br>影像被分析,並修復那些出現交錯缺陷 (interpolated) 的區域。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:67
+msgid ""
+"<b>High cpu usage, good quality.</b>"
+"<br>Conversion of dvd image format improves quality and fixes chroma upsampling "
+"bug."
+msgstr "<b>高 cpu 使用率,品質較好。</b><br>轉換 dvd 影像格式以增進品質並且修復 chroma upsampling bug。"
+
+#: player-parts/xine-part/deinterlacequality.cpp:70
+msgid ""
+"<b>Very high cpu usage, great quality.</b>"
+"<br>Besides using smart deinterlacing algorithms it will also double the frame "
+"rate (30->60fps) to match the field rate of TVs. Detects and reverts 3-2 "
+"pulldown. *"
+msgstr ""
+"<b>很高的 cpu使用率,極佳的品質。</b>"
+"<br>除了使用去交錯化邏輯運算,也將加倍frame rate (30->60fps)以符合電視的 field rate。Detects and "
+"reverts 3-2 pulldown. *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:73
+msgid ""
+"<b>Very very high cpu usage, great quality with (experimental) improvements.</b>"
+"<br>Enables judder correction (play films at their original 24 fps speed) and "
+"vertical color smoothing (fixes small color stripes seen in some dvds). *"
+msgstr ""
+"<b>極高的 cpu 使用率,極好的品質並具有(實驗性質的)增強效果。</b>"
+"<br>啟用震顫修正(以原本的 24fps 速度播放影片)和垂直色彩平滑(修復在一些 dvd 上可見的顏色條紋)。 *"
+
+#: player-parts/xine-part/deinterlacequality.cpp:76
+msgid "User defined"
+msgstr "使用者自定"
+
+#: player-parts/xine-part/deinterlacequality.cpp:80
+msgid "Configure tvtime Deinterlace Plugin..."
+msgstr "設定 tvtime去交錯化外掛..."
+
+#: player-parts/xine-part/deinterlacequality.cpp:85
+msgid ""
+"* <i>May require a patched 2.4 kernel (like RedHat one) or 2.6 kernel.</i>"
+msgstr "* <i>可能需要一個修補過的2.4核心 (像 RedHat 那種) 或是2.6核心。</i>"
+
+#: player-parts/xine-part/deinterlacequality.h:41
+msgid "Configure tvtime Deinterlace Plugin"
+msgstr "設定 tvtime 去交錯化外掛"
+
+#: player-parts/xine-part/filterdialog.cpp:38
+msgid "Effect Plugins"
+msgstr "效果外掛"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:687
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+#: player-parts/xine-part/filterdialog.cpp:44
+#: player-parts/xine-part/xine_part.cpp:1181
+msgid "Audio"
+msgstr "音效"
+
+#: player-parts/xine-part/filterdialog.cpp:44
+msgid "Audio Filters"
+msgstr "音效過濾器"
+
+#: player-parts/xine-part/filterdialog.cpp:50
+msgid "Enable audio filters"
+msgstr "啟用音效過濾器"
+
+#: player-parts/xine-part/filterdialog.cpp:59
+#: player-parts/xine-part/filterdialog.cpp:92
+msgid "Add Filter"
+msgstr "增加過濾器"
+
+#: player-parts/xine-part/filterdialog.cpp:61
+#: player-parts/xine-part/filterdialog.cpp:94
+msgid "Remove All Filters"
+msgstr "移除所有過濾器"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:691
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+#: player-parts/xine-part/filterdialog.cpp:77
+#: player-parts/xine-part/xine_part.cpp:1184
+msgid "Video"
+msgstr "影像"
+
+#: player-parts/xine-part/filterdialog.cpp:77
+msgid "Video Filters"
+msgstr "影像過濾器"
+
+#: player-parts/xine-part/filterdialog.cpp:83
+msgid "Enable video filters"
+msgstr "啟用影像過濾器"
+
+#: player-parts/xine-part/xineconfig.cpp:233
+msgid "xine Engine Parameters"
+msgstr "xine 引擎參數"
+
+#: player-parts/xine-part/xineconfig.cpp:274
+msgid "%1 Options"
+msgstr "%1 選項"
+
+#: player-parts/xine-part/xineconfig.cpp:281
+msgid "Beginner Options"
+msgstr "初學者選項"
+
+#: player-parts/xine-part/xineconfig.cpp:285
+msgid "Expert Options"
+msgstr "專家選項"
+
+#: player-parts/xine-part/xine_part.cpp:184
+#, fuzzy
+msgid "XinePart"
+msgstr "KaffeinePart"
+
+#: player-parts/xine-part/xine_part.cpp:185
+msgid "A xine based player part for Kaffeine."
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:253
+msgid ""
+"SMIL (Synchronized Multimedia Integration Language) support is rudimentary!\n"
+"XinePart can now try to playback contained video sources without any layout. "
+"Proceed?"
+msgstr ""
+
+#: player-parts/xine-part/xine_part.cpp:608
+msgid "Save Stream As"
+msgstr "另存串流資料為"
+
+#: player-parts/xine-part/xine_part.cpp:634
+#: player-parts/xine-part/xine_part.cpp:635
+#: player-parts/xine-part/xine_part.cpp:1329
+msgid "Subtitle"
+msgstr "字幕"
+
+#: player-parts/xine-part/xine_part.cpp:641
+#: player-parts/xine-part/xine_part.cpp:642
+msgid "Audiochannel"
+msgstr "聲音頻道"
+
+#: player-parts/xine-part/xine_part.cpp:782
+msgid "%1 of %2"
+msgstr "%1 of %2"
+
+#: player-parts/xine-part/xine_part.cpp:792
+msgid ""
+"*.png|PNG-File\n"
+"*.bmp|BMP-File\n"
+"*.xbm|XBM-File"
+msgstr ""
+"*.png|PNG-檔案\n"
+"*.bmp|BMP-檔案\n"
+"*.xbm|XBM-檔案"
+
+#: player-parts/xine-part/xine_part.cpp:795
+msgid "Save Screenshot As"
+msgstr "另存畫面為"
+
+#: player-parts/xine-part/xine_part.cpp:879
+msgid "Broadcasting port:"
+msgstr "廣播埠:"
+
+#: player-parts/xine-part/xine_part.cpp:901
+msgid "Configure Receive Broadcast Stream"
+msgstr "設定接受廣播串流"
+
+#: player-parts/xine-part/xine_part.cpp:903
+msgid "Sender address:"
+msgstr "發送者位址:"
+
+#: player-parts/xine-part/xine_part.cpp:905
+msgid "Port:"
+msgstr "連接埠:"
+
+#: player-parts/xine-part/xine_part.cpp:928
+msgid "Jump to position:"
+msgstr "跳到位置:"
+
+#: player-parts/xine-part/xine_part.cpp:995
+msgid "xine Error"
+msgstr "xine 錯誤"
+
+#: player-parts/xine-part/xine_part.cpp:1008
+msgid "xine Message"
+msgstr "xine 訊息"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:88
+#: player-parts/xine-part/kxinewidget.cpp:1253
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Ready"
+msgstr "就緒"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:569
+#: player-parts/xine-part/kxinewidget.cpp:1384
+#: player-parts/xine-part/kxinewidget.cpp:2008
+#: player-parts/xine-part/kxinewidget.cpp:2853
+#: player-parts/xine-part/xine_part.cpp:1014
+msgid "Playing"
+msgstr "播放中"
+
+#: player-parts/xine-part/xine_part.cpp:1179
+msgid "Mime"
+msgstr "Mime"
+
+#: player-parts/xine-part/xine_part.cpp:1189
+msgid "Subtitle File"
+msgstr "字幕檔案"
+
+#: player-parts/xine-part/xine_part.cpp:1191
+msgid "Save Stream as"
+msgstr "另存串流為"
+
+#: player-parts/xine-part/xine_part.cpp:1194
+#, fuzzy
+msgid "Track info"
+msgstr "音軌資訊(&I)"
+
+#: player-parts/xine-part/xine_part.cpp:1226
+msgid "Copy URL to Clipboard"
+msgstr "複製 URL 到剪貼簿"
+
+#: player-parts/xine-part/xine_part.cpp:1228
+msgid "Play in Kaffeine Externally"
+msgstr "在外部的 Kaffeine 中播放"
+
+#: player-parts/xine-part/xine_part.cpp:1269
+msgid "&Send Broadcast Stream..."
+msgstr "傳送廣播串流(&S)..."
+
+#: player-parts/xine-part/xine_part.cpp:1270
+msgid "&Receive Broadcast Stream..."
+msgstr "接受廣播串流(&R)..."
+
+#: player-parts/xine-part/xine_part.cpp:1271
+msgid "&Save Screenshot..."
+msgstr "儲存擷取畫面(&S)..."
+
+#: player-parts/xine-part/xine_part.cpp:1272
+msgid "Save Stream..."
+msgstr "儲存串流..."
+
+#: player-parts/xine-part/xine_part.cpp:1273
+msgid ""
+"Saves current stream to harddisc. This feature was disabled for some formats "
+"(e.g. Real Media) to prevent potential legal problems."
+msgstr "儲存目前的串流到硬碟。某些格式(例如:Real Media)停用這個功能以避免潛在的法律問題。"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:820
+#: player-parts/xine-part/xine_part.cpp:1277
+#, fuzzy
+msgid "Toggle Minimal Mode"
+msgstr "最簡模式(&M)"
+
+#: player-parts/dummy-part/dummy_part.cpp:122
+#: player-parts/gstreamer-part/gstreamer_part.cpp:556
+#: player-parts/gstreamer-part/gstreamer_part.cpp:822
+#: player-parts/xine-part/kxinewidget.cpp:2843
+#: player-parts/xine-part/xine_part.cpp:1280
+msgid "Pause"
+msgstr "暫停"
+
+#: player-parts/xine-part/xine_part.cpp:1285
+msgid "&Fast Forward"
+msgstr "快轉(&F)"
+
+#: player-parts/xine-part/xine_part.cpp:1286
+msgid "Slow &Motion"
+msgstr "慢動作(&M)"
+
+#: player-parts/xine-part/xine_part.cpp:1288
+#, fuzzy
+msgid "Skip Forward (20s)"
+msgstr "向前略過 (10秒)"
+
+#: player-parts/xine-part/xine_part.cpp:1289
+#, fuzzy
+msgid "Skip Backward (20s)"
+msgstr "向後回溯 (10秒)"
+
+#: player-parts/xine-part/xine_part.cpp:1290
+msgid "Skip Forward (1m)"
+msgstr "向前略過 (1分)"
+
+#: player-parts/xine-part/xine_part.cpp:1291
+msgid "Skip Backward (1m)"
+msgstr "向後回溯 (1分)"
+
+#: player-parts/xine-part/xine_part.cpp:1292
+msgid "Skip Forward (10m)"
+msgstr "向前跳過 (10分)"
+
+#: player-parts/xine-part/xine_part.cpp:1293
+msgid "Skip Backward (10m)"
+msgstr "向後回溯 (10分)"
+
+#: player-parts/xine-part/xine_part.cpp:1294
+msgid "Jump to Position..."
+msgstr "跳至位置..."
+
+#: player-parts/xine-part/xine_part.cpp:1296
+msgid "DVD Menu Left"
+msgstr "左DVD選單"
+
+#: player-parts/xine-part/xine_part.cpp:1297
+msgid "DVD Menu Right"
+msgstr "右DVD選單"
+
+#: player-parts/xine-part/xine_part.cpp:1298
+msgid "DVD Menu Up"
+msgstr "上DVD選單"
+
+#: player-parts/xine-part/xine_part.cpp:1299
+msgid "DVD Menu Down"
+msgstr "下DVD選單"
+
+#: player-parts/xine-part/xine_part.cpp:1300
+msgid "DVD Menu Select"
+msgstr "DVD選單選擇"
+
+#: player-parts/xine-part/xine_part.cpp:1302
+msgid "Audio Channel"
+msgstr "音訊頻道"
+
+#: player-parts/xine-part/xine_part.cpp:1303
+msgid "Select audio channel"
+msgstr "選擇音訊頻道"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:831
+#: player-parts/xine-part/xine_part.cpp:1305
+msgid "Audio &Visualization"
+msgstr "音效視覺化(&V)"
+
+#: player-parts/xine-part/xine_part.cpp:1308
+msgid "Volume Up"
+msgstr "增加音量"
+
+#: player-parts/xine-part/xine_part.cpp:1309
+msgid "Volume Down"
+msgstr "降低音量"
+
+#: player-parts/xine-part/xine_part.cpp:1311
+msgid "&Deinterlace"
+msgstr "去交錯化(&D)"
+
+#: player-parts/xine-part/xine_part.cpp:1312
+msgid "Activate this for interlaced streams, some DVD's for example."
+msgstr "對於交錯的串流(例如一些DVD),請啟用這個。"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:838
+#: player-parts/xine-part/xine_part.cpp:1313
+msgid "&Auto"
+msgstr "自動(&A)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:839
+#: player-parts/xine-part/xine_part.cpp:1314
+msgid "&4:3"
+msgstr "&4:3"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:840
+#: player-parts/xine-part/xine_part.cpp:1315
+msgid "A&namorphic"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:842
+#: player-parts/xine-part/xine_part.cpp:1317
+msgid "&Square"
+msgstr "正方形(&S)"
+
+#: player-parts/xine-part/xine_part.cpp:1321
+msgid "Zoom In Horizontal"
+msgstr "水平方向拉近"
+
+#: player-parts/xine-part/xine_part.cpp:1322
+msgid "Zoom Out Horizontal"
+msgstr "水平方向拉遠"
+
+#: player-parts/xine-part/xine_part.cpp:1323
+msgid "Zoom In Vertical"
+msgstr "垂直方向拉近"
+
+#: player-parts/xine-part/xine_part.cpp:1324
+msgid "Zoom Out Vertical"
+msgstr "垂直方向拉遠"
+
+#: player-parts/xine-part/xine_part.cpp:1325
+msgid "Deinterlace &Quality"
+msgstr "去交錯化品質(&Q)"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:843
+#: player-parts/xine-part/xine_part.cpp:1326
+msgid "&Video Settings"
+msgstr "影像設定(&V)"
+
+#: player-parts/xine-part/xine_part.cpp:1327
+msgid "&Equalizer"
+msgstr "等化器(&E)"
+
+#: player-parts/xine-part/xine_part.cpp:1333
+msgid "&Menu Toggle"
+msgstr "選單切換(&M)"
+
+#: player-parts/xine-part/xine_part.cpp:1334
+msgid "&Title"
+msgstr "標題(&T)"
+
+#: player-parts/xine-part/xine_part.cpp:1335
+msgid "&Root"
+msgstr "根選單(&R)"
+
+#: player-parts/xine-part/xine_part.cpp:1336
+msgid "&Subpicture"
+msgstr "子畫面(&S)"
+
+#: player-parts/xine-part/xine_part.cpp:1338
+msgid "An&gle"
+msgstr "視角(&G)"
+
+#: player-parts/xine-part/xine_part.cpp:1339
+msgid "&Part"
+msgstr "&Part"
+
+#: player-parts/xine-part/xine_part.cpp:1341
+msgid "Titles"
+msgstr "標題"
+
+#: player-parts/xine-part/xine_part.cpp:1343
+msgid "Chapters"
+msgstr "章節"
+
+#: player-parts/xine-part/xine_part.cpp:1345
+msgid "Angles"
+msgstr "角度"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:844
+#: player-parts/xine-part/xine_part.cpp:1348
+msgid "Track &Info"
+msgstr "音軌資訊(&I)"
+
+#: player-parts/xine-part/xine_part.cpp:1349
+msgid "Effect &Plugins..."
+msgstr "效果外掛(&P)"
+
+#: player-parts/xine-part/xine_part.cpp:1352
+msgid "&xine Engine Parameters"
+msgstr "&xine 引擎參數"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:506
+#: player-parts/gstreamer-part/gstreamer_part.cpp:847
+#: player-parts/gstreamer-part/gstreamer_part.cpp:854
+#: player-parts/xine-part/kxinewidget.cpp:2517
+#: player-parts/xine-part/xine_part.cpp:1356
+#: player-parts/xine-part/xine_part.cpp:1363
+msgid "Volume"
+msgstr "音量"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:828
+#: player-parts/xine-part/kxinewidget.cpp:3055
+#: player-parts/xine-part/kxinewidget.cpp:3079
+#: player-parts/xine-part/xine_part.cpp:1367
+#: player-parts/xine-part/xine_part.cpp:1376
+msgid "Position"
+msgstr "位置"
+
+#: player-parts/xine-part/xine_part.cpp:1380
+msgid ""
+"Short click: Toggle Timer Forward/Backward\n"
+"Long click: Toggle Timer OSD"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:829
+#: player-parts/xine-part/xine_part.cpp:1385
+msgid "Playtime"
+msgstr "播放時間"
+
+#: player-parts/xine-part/xine_part.cpp:1543
+msgid "Looking for CDDB entries..."
+msgstr "尋找 CDDB 項目..."
+
+#: player-parts/xine-part/xine_part.cpp:1551
+#, fuzzy, c-format
+msgid "AudioCD Track %1"
+msgstr "第 %1 音軌"
+
+#: player-parts/xine-part/xine_part.cpp:1626
+#, fuzzy, c-format
+msgid "VCD Track %1"
+msgstr "第 %1 音軌"
+
+#: player-parts/gstreamer-part/videosettings.cpp:33
+#: player-parts/xine-part/videosettings.cpp:34
+msgid "Video Settings"
+msgstr "影像設定"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:525
+#: player-parts/gstreamer-part/videosettings.cpp:41
+#: player-parts/xine-part/kxinewidget.cpp:3343
+#: player-parts/xine-part/videosettings.cpp:49
+msgid "Hue"
+msgstr "色調"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:519
+#: player-parts/gstreamer-part/videosettings.cpp:51
+#: player-parts/xine-part/kxinewidget.cpp:3349
+#: player-parts/xine-part/videosettings.cpp:59
+msgid "Saturation"
+msgstr "彩度"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:531
+#: player-parts/gstreamer-part/videosettings.cpp:61
+#: player-parts/xine-part/kxinewidget.cpp:3355
+#: player-parts/xine-part/videosettings.cpp:69
+msgid "Contrast"
+msgstr "對比"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:537
+#: player-parts/gstreamer-part/videosettings.cpp:71
+#: player-parts/xine-part/kxinewidget.cpp:3361
+#: player-parts/xine-part/videosettings.cpp:79
+msgid "Brightness"
+msgstr "亮度"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/videosettings.cpp:89
+msgid "Audio/Video Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:3373
+#: player-parts/xine-part/videosettings.cpp:99
+msgid "Subtitle Offset"
+msgstr ""
+
+#: player-parts/xine-part/kxinewidget.cpp:374
+msgid "auto"
+msgstr "自動"
+
+#: player-parts/xine-part/kxinewidget.cpp:541
+msgid ""
+"General Warning: \n"
+msgstr ""
+"一般性警告: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:546
+msgid "No Informations available."
+msgstr "沒有相關資訊。"
+
+#: player-parts/xine-part/kxinewidget.cpp:552
+msgid ""
+"Security Warning: \n"
+msgstr ""
+"安全性警告: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:561
+msgid ""
+"The host you're trying to connect is unknown.\n"
+"Check the validity of the specified hostname. "
+msgstr ""
+"您正嘗試連線到不明的主機。\n"
+"請確認指定的主機可用。 "
+
+#: player-parts/xine-part/kxinewidget.cpp:568
+msgid "The device name you specified seems invalid. "
+msgstr "您指定的裝置名稱似乎無效。"
+
+#: player-parts/xine-part/kxinewidget.cpp:575
+msgid ""
+"The network looks unreachable.\n"
+"Check your network setup and the server name. "
+msgstr ""
+"無法使用網路。\n"
+"請檢查您的網路設定和伺服器名稱。 "
+
+#: player-parts/xine-part/kxinewidget.cpp:582
+msgid "Audio output unavailable. Device is busy. "
+msgstr "無可用的音效輸出。裝置忙碌中。"
+
+#: player-parts/xine-part/kxinewidget.cpp:589
+msgid ""
+"The connection was refused.\n"
+"Check the host name. "
+msgstr ""
+"連線被拒絕。\n"
+"請檢查主機名稱。 "
+
+#: player-parts/xine-part/kxinewidget.cpp:596
+msgid "The specified file or url was not found. Please check it. "
+msgstr "找不到指定的檔案或URL。請檢查一下。 "
+
+#: player-parts/xine-part/kxinewidget.cpp:603
+msgid "Permission to this source was denied. "
+msgstr "到這個來源的權限被拒。"
+
+#: player-parts/xine-part/kxinewidget.cpp:610
+msgid ""
+"The source can't be read.\n"
+"Maybe you don't have enough rights for this, or source doesn't contain data "
+"(e.g: no disc in drive). "
+msgstr ""
+"來源無法讀取。\n"
+"也許您沒有足夠的權限或該來源並不包含資料(例如:光碟機裡沒有光碟)。 "
+
+#: player-parts/xine-part/kxinewidget.cpp:617
+msgid "A problem occur while loading a library or a decoder: "
+msgstr "當載入函式庫或解碼器時發生問題: "
+
+#: player-parts/xine-part/kxinewidget.cpp:624
+msgid "The source seems encrypted, and can't be read. "
+msgstr "來源似乎被加密而無法被讀取。 "
+
+#: player-parts/xine-part/kxinewidget.cpp:626
+msgid ""
+"\n"
+"Your DVD is probably crypted. According to your country laws, you can or can't "
+"use libdvdcss to be able to read this disc. "
+msgstr ""
+"\n"
+"您的DVD可能被加密。根據您國家的法律,您可以或不可以使用libdvdcss去讀這片光碟。 "
+
+#: player-parts/xine-part/kxinewidget.cpp:633
+msgid ""
+"Unknown error: \n"
+msgstr ""
+"不明的錯誤: \n"
+
+#: player-parts/xine-part/kxinewidget.cpp:829
+msgid "Error: Can't init new Video Driver %1 - using %2!"
+msgstr "錯誤: 無法初始化顯示驅動程式 %1 - 正使用 %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:839
+#, fuzzy, c-format
+msgid "Using Video Driver: %1"
+msgstr "使用的顯示驅動程式: "
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:866
+#: player-parts/xine-part/kxinewidget.cpp:915
+msgid "Error: Can't init new Audio Driver %1 - using %2!"
+msgstr "錯誤:無法初始化音效驅動程式 %1- 正使用 %2!"
+
+#: player-parts/xine-part/kxinewidget.cpp:923
+#, fuzzy, c-format
+msgid "Using Audio Driver: %1"
+msgstr "使用的音效驅動程式: "
+
+#: player-parts/xine-part/kxinewidget.cpp:1032
+msgid "Init xine..."
+msgstr "初始化xine..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1073
+msgid "Can't init xine Engine!"
+msgstr "無法初始化 xine 引擎!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1109
+msgid "Audiodriver to use (default: auto)"
+msgstr "使用的音效驅動程式(預設:自動)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1135
+msgid "Videodriver to use (default: auto)"
+msgstr "使用的顯示驅動程式(預設:自動)"
+
+#: player-parts/xine-part/kxinewidget.cpp:1146
+msgid "Use software audio mixer"
+msgstr "使用軟體音效混音器"
+
+#: player-parts/xine-part/kxinewidget.cpp:1150
+msgid "Show OSD Messages"
+msgstr "顯示 OSD 訊息"
+
+#: player-parts/xine-part/kxinewidget.cpp:1163
+msgid "Size of OSD text"
+msgstr "OSD 文字的大小"
+
+#: player-parts/xine-part/kxinewidget.cpp:1167
+msgid "Font for OSD Messages"
+msgstr "OSD 文字的字型"
+
+#: player-parts/xine-part/kxinewidget.cpp:1187
+msgid "Can't init Video Driver '%1' - trying 'auto'..."
+msgstr "無法初始化顯示驅動程式'%1' - 正在嘗試'自動'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1196
+msgid "All Video Drivers failed to initialize!"
+msgstr "所有的顯示驅動程式均無法初始化!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1207
+msgid "Can't init Audio Driver '%1' - trying 'auto'..."
+msgstr "無法初始化音效驅動程式'%1' - 正在嘗試'自動'..."
+
+#: player-parts/xine-part/kxinewidget.cpp:1214
+msgid "All Audio Drivers failed to initialize!"
+msgstr "所有的音效驅動程式均無法初始化!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1223
+msgid "Can't create a new xine Stream!"
+msgstr "無法建立新的 xine 串流!"
+
+#: player-parts/xine-part/kxinewidget.cpp:1757
+msgid "DVB: opening..."
+msgstr "DVB:開啟..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:290
+#: player-parts/xine-part/kxinewidget.cpp:1811
+msgid "Opening..."
+msgstr "正在開啟..."
+
+#: player-parts/xine-part/kxinewidget.cpp:2047
+msgid "Audio Codec"
+msgstr "音訊編碼"
+
+#: player-parts/xine-part/kxinewidget.cpp:2049
+msgid "Video Codec"
+msgstr "視訊編碼"
+
+#: player-parts/xine-part/kxinewidget.cpp:2059
+msgid "No plugin found to handle this resource"
+msgstr "找不到處理這個資源的外掛"
+
+#: player-parts/xine-part/kxinewidget.cpp:2064
+msgid "Resource seems to be broken"
+msgstr "資源似乎已毀損"
+
+#: player-parts/xine-part/kxinewidget.cpp:2069
+msgid "Requested resource does not exist"
+msgstr "要求的資源不存在"
+
+#: player-parts/xine-part/kxinewidget.cpp:2074
+msgid "Resource can not be opened"
+msgstr "資源無法開啟"
+
+#: player-parts/xine-part/kxinewidget.cpp:2079
+msgid "Generic error"
+msgstr "一般錯誤"
+
+#: player-parts/xine-part/kxinewidget.cpp:2553
+#, fuzzy
+msgid "Mute Off"
+msgstr "靜音"
+
+#: player-parts/xine-part/kxinewidget.cpp:2558
+#, fuzzy
+msgid "Mute On"
+msgstr "靜音"
+
+#: player-parts/xine-part/kxinewidget.cpp:2864
+#: player-parts/xine-part/kxinewidget.cpp:2888
+#: player-parts/xine-part/kxinewidget.cpp:2919
+#, c-format
+msgid "Fast Forward %1"
+msgstr "快轉 %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:2881
+#: player-parts/xine-part/kxinewidget.cpp:2902
+#: player-parts/xine-part/kxinewidget.cpp:2926
+#, c-format
+msgid "Slow Motion %1"
+msgstr "慢動作 %1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3154
+msgid "Deinterlace: on"
+msgstr "去交錯化:開啟"
+
+#: player-parts/xine-part/kxinewidget.cpp:3155
+msgid "Deinterlace: off"
+msgstr "去交錯化:關閉"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+#: player-parts/xine-part/kxinewidget.cpp:3184
+#: player-parts/xine-part/kxinewidget.cpp:3190
+#: player-parts/xine-part/kxinewidget.cpp:3196
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "Aspect Ratio"
+msgstr "畫面比例"
+
+#: player-parts/xine-part/kxinewidget.cpp:3178
+msgid "Auto"
+msgstr "自動"
+
+#: player-parts/xine-part/kxinewidget.cpp:3184
+msgid "4:3"
+msgstr "4:3"
+
+#: player-parts/xine-part/kxinewidget.cpp:3190
+msgid "16:9"
+msgstr "16:9"
+
+#: player-parts/xine-part/kxinewidget.cpp:3196
+msgid "1:1"
+msgstr "1:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3202
+msgid "2.11:1"
+msgstr "2.11:1"
+
+#: player-parts/xine-part/kxinewidget.cpp:3211
+#: player-parts/xine-part/kxinewidget.cpp:3221
+msgid "Zoom X"
+msgstr "縮放 X"
+
+#: player-parts/xine-part/kxinewidget.cpp:3231
+#: player-parts/xine-part/kxinewidget.cpp:3241
+msgid "Zoom Y"
+msgstr "縮放 Y"
+
+#: player-parts/xine-part/kxinewidget.cpp:3367
+#: player-parts/xine-part/kxinewidget.cpp:3373
+msgid "msec"
+msgstr "msec"
+
+#: player-parts/xine-part/equalizer.cpp:31
+msgid "Equalizer Settings"
+msgstr "等化器設定"
+
+#: player-parts/xine-part/equalizer.cpp:43
+msgid "Volume gain"
+msgstr "音量增益"
+
+#: player-parts/xine-part/equalizer.cpp:44
+msgid "Volume Gain for Equalizer - If the sound becomes noisy disable this"
+msgstr "等化器的音量增益 - 如果聲音變得吵雜請關閉它"
+
+#: player-parts/xine-part/postfilter.cpp:158
+msgid "Delete Filter"
+msgstr "刪除濾鏡"
+
+#: player-parts/gstreamer-part/timer.cpp:107
+#, c-format
+msgid "Seeking to %s"
+msgstr ""
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:74
+msgid "GStreamer initializing failed!"
+msgstr "初始化 gstreamer 失敗!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:149
+msgid "GStreamerPart"
+msgstr "GStreamerPart"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:545
+#: player-parts/gstreamer-part/gstreamer_part.cpp:547
+msgid "Mute"
+msgstr "靜音"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:679
+msgid "Comment"
+msgstr "註解"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:855
+msgid "&GStreamer Engine Parameters"
+msgstr "&GStreamer 引擎參數"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:883
+#: player-parts/gstreamer-part/gstreamer_part.cpp:922
+msgid "GStreamer could not be initialized!"
+msgstr "無法初始化 GStreamer!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:891
+msgid ""
+"Missing GStreamer-registry! Did you forget to run <b>gst-register</b> "
+"(as root) after installation?"
+msgstr "沒有 GStreamer-registry! 您是否在安裝後忘了執行 <b>gst-register</b> (以root身份) ?"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:931
+msgid "Can't init Audio Driver '%1' - trying another one..."
+msgstr "無法初始化音效驅動程式 '%1' - 嘗試另一個..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:942
+msgid "No useable audio-driver found!"
+msgstr "找不到可用的音效驅動程式!"
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:954
+msgid "Can't init Video Driver '%1' - trying another one..."
+msgstr "無法初始化顯示驅動程式 '%1' - 嘗試另一個..."
+
+#: player-parts/gstreamer-part/gstreamer_part.cpp:962
+msgid "No useable video-driver found!"
+msgstr "找不到可用的顯示驅動程式!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:36
+msgid "GStreamer Engine Parameters"
+msgstr "GStreamer 引擎參數"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:47
+msgid "Audio Options"
+msgstr "音效選項"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:54
+msgid "Prefered audio driver"
+msgstr "偏好的音效驅動程式"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:60
+msgid "Video Options"
+msgstr "影像選項"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:67
+msgid "Prefered video driver"
+msgstr "偏好的顯示驅動程式"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:71
+msgid "* Restart required!"
+msgstr "* 需要重新啟動!"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media"
+msgstr "媒體"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:74
+msgid "Media Options"
+msgstr "媒體選項"
+
+#: player-parts/gstreamer-part/gstreamerconfig.cpp:80
+msgid "CD, VCD, DVD drive"
+msgstr "CD, VCD, DVD 光碟機"
+
+#: player-parts/dummy-part/dummy_part.cpp:75
+msgid "DummyPart"
+msgstr "DummyPart"
+
+#~ msgid "Failed to connect to X-Server!"
+#~ msgstr "連結至 X-Server 失敗!"
+
+#~ msgid "Closing the main window will keep Kaffeine running in the system tray. Use Quit from the File menu to quit the application."
+#~ msgstr "關閉主視窗將使 Kaffeine 在系統列執行。使用檔案選單的退出來關閉程式。"
+
+#~ msgid "No player"
+#~ msgstr "沒有播放器"
+
+#, fuzzy
+#~ msgid "Ch %1"
+#~ msgstr "Ch "
+
+#~ msgid "Kaffeine Part"
+#~ msgstr "Kaffeine Part"
+
+#~ msgid "DVB-C"
+#~ msgstr "DVB-C"
+
+#~ msgid "DVB-T"
+#~ msgstr "DVB-T"
+
+#~ msgid "DVB-S"
+#~ msgstr "DVB-S"
+
+#~ msgid "No DVD Video found."
+#~ msgstr "找不到視訊 DVD"
+
+#~ msgid "No (S)VCD found."
+#~ msgstr "找不到 (S)VCD。"
diff --git a/stamp-h.in b/stamp-h.in
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/stamp-h.in
diff --git a/subdirs b/subdirs
new file mode 100644
index 0000000..404cfe4
--- /dev/null
+++ b/subdirs
@@ -0,0 +1,3 @@
+doc
+kaffeine
+po